8155及DS12887结构及特点 万年历源程序
由于该电路使用了两个专用芯片,为了在分析程序时使大家理解清楚,有必要对8155及DS12887的功能、特点进行较详细的介绍。
8155结构及特点
图2为8155的内部结构,8155为多功能的可编程接口芯片,内部包含有256字节RAM,两个可编程8位并行口、一个6位并行口和一个14位的计数器。8155是8051单片机应用系统中最适用的外围器件。数据存贮器是256x8位静态RAM。I/O由三个通用口组成,其中的6位口可编程为状态控制信号。可编程的14位计数器/定时器用于给单片机系统提供方波或计数脉冲。
图3为8155的引脚排列。RESET为复位端,高电平有效。AD0~AD7为三态地址/数据线。CE为芯片片选端。/RD、/WR为读写信号端。ALE为地址锁存信号。IO/M为IO/RAM选择线,低电平选择RAM,高电平选择I/O口。PA0~PA7为端口A。PB0~PB7为端口B。PC0~PC5为端口C,用作控制信号线时,其功能如下:
PC0──AINTR(口A中断)
PC1──ABF(口A缓冲器满)
PC2──/ASTB(口A选通)
PC3──BINTR(口B中断)
PC4──BBF(口B缓冲器满)
PC5──/BSTB(口B选通)
TIMER IN为计数器/定时器输入端。TIMER OUT为定时器输出端,可以是方波或脉冲波形。Vcc为十5V电源。Vss为接地端。
8155的口A、口B可工作于基本I/O方式或选通I/O方式,□C可作为输入输出线,也可作为口A、口B选通方式时的状态控制信号线。具体选择由写入命令寄存器的命令字决定。命令字如下:
PA,PB:定义口A、口B,0为输入,1为输出。
IEA,IEB:口A、口B中断控制,1为允许,0为禁止。
PC1,PC2:定义口的工作方式。
TM1,TM2:定时器命令
8155的定时器为14位的减法计数器,对输入脉冲进行减法计数,定时器由两个字节组成,其格式如下:
T13~T0:计数长度。
M2,M1:定时器方式
DS12887结构及特点
图4为DS12887的结构框图,DS12887是DALLAS公司的实时时钟芯片RTC(Real Time Clock),它功能丰富,应用广泛,PC机内的时钟信号就是由D512887提供的。DS12887内部自带晶体振荡器及锂电池,可计算到2100年前的秒、分、小时、星期、日、月、年七种日历信息并带闰年补偿,断电后能运行10年之久不丢失数据。可选用夏令时,具有24小时或12小时两种制式。它在工业控制及仪器仪表中有广泛用途。DS12887上电时,当Vcc高于4.25V 200mS后,芯片可以被外部程序操作。当Vcc低于4.25V时,芯片处于写保护状态(所有的输入均无效),同时所有输出呈高阻状态。当Vcc低于3V时,芯片将自动把供电方式切换为由内部电池供电。
图5为DS12887的引脚排列。AD0~AD7为地址/数据复用总线。NC为空脚。MOT为总线模式选择(MOTOROLA/INTEL),当此脚接到Vcc时,选用的是MOTOROLA总线时序,当它接地或不接时,选用的是INTEL总线时序。CS为片选端。AS为地址锁存允许端。R/W在INTEL总线下作为写。DS在INTEL总线下作为读。RESET为复位端,复位端对时钟、日历、RAM无效,系统上电时复位端要保持低电平200mS以上DS12887才可以正常工作。IRQ为中断请求输出端。SQW为方波输出端,当Vcc低于4.25V时没有作用。Vcc为+5V电源。GND为接地端。
DS12887有128个RAM单元。其中4个单元用作控制寄存器,10个单元用作存放时钟字节,114字节为通用RAM。其主要寄存器如下:
DS12887内部寄存器A:
UIP=l:更新已到,不能读/写DSl2887;UIP=0:更新末到,能读/写DS12887。
DV2,DV1,DV0应设置为010,表示打开晶振,允许计时。
RS3,RS2,RS1,RS0为方波频率选择位,产生方波周期中断。
DS12887内部寄存器B:
SET=0:时间更新正常进行,每秒计数1次;SET=1:禁止更新,程序可初始化时间和日历。
PIE=l:允许周期中断;PIE=0:禁止周期中断。
AIE=1:允许报警中断;AIE=0:禁止报警中断。
UIE=1:允许更新结束中断;UIE=0:禁止更新结束中断。
SQWE为方波允许位。SQWE=1:将RS3,RS2,RS1,RS0选定的方波输出。
DM=1:BCD码;DM=0:二进制。该位不受复位信号影响
24/12:1表示24[小]时制;0表示12[小]时制。
DSE为夏时制允许位。DSE=l:采用夏时制;DSE=0:不采用夏时制。
DS12887内部寄存器C:
IRQF为中断申请标志。
PF为方波周期中断标志。PF=1:方波周期结束,申请中断。
AF为闹铃中断标志。AF=1:当前时间与闹铃时间匹配时即刻申请中断。
UF为更新周期结束中断标志。UF二I:更新周期结束时申请中断。
DS12887内部寄存器D:
VRT为内部锂电池状态。VRT=1:锂电池正常;VRT=0:锂电池耗尽。
D512887内部存储器功能如附表所示。
#include <REG51.H>
#include <ABSACC.H>
#define uchar unsigned char
#define uint unsigned int
//============================
#define C8155 XBYTE[0x7000]
#define PA XBYTE[0x7001]
#define PB XBYTE[0x7002]
#define PC XBYTE[0x7003]
//============================
#define sec XBYTE[0x8000]
#define min XBYTE[0x8002]
#define hou XBYTE[0x8004]
#define week XBYTE[0x8006]
#define day XBYTE[0x8007]
#define mon XBYTE[0x8008]
#define year XBYTE[0x8009]
#define cent XBYTE[0x8032]
#define DS12887A XBYTE[0x800a]
#define DS12887B XBYTE[0x800b]
#define DS12887C XBYTE[0x800c]
//===============================
sbit set_inc=P1^0;
sbit set_dec=P1^1;
sbit inc=P1^2;
sbit dec=P1^3;
uchar disbit;
bit flag;
uchar SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
uchar code act_PB[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar code act_PC[5]={0xfe,0xfd,0xfb,0xf7,0xef};
char ms=0;
char data ram_year,ram_mon,ram_day,ram_week,ram_hou,ram_min,ram_sec;
void scan_key(void);
void delay(uint k);
void wr_time(void);
void rd_time(void);
/******************************/
void init_timer0(void)
{
TH0=-(2000/256);
TL0=-(2000%256);
TR0=1;
}
//***********************
void init(void)
{init_timer0();
EA=1;ET0=1;
C8155=0x0f;
DS12887A=0x20;
}
/**********************************/
void time_dis(uchar disbit)
{uchar y_week;
switch(disbit)
{
case 0:{PA=SEG7[ram_sec%10];}break;
case 1:{PA=SEG7[ram_sec/10];}break;
case 2:{PA=SEG7[ram_min%10];}break;
case 3:{PA=SEG7[ram_min/10];}break;
case 4:{PA=SEG7[ram_hou%10];}break;
case 5:{PA=SEG7[ram_hou/10];}break;
case 6:{if(ram_week==1)y_week=9;
else y_week=ram_week;PA=SEG7[y_week-1];}break;
case 7:{PA=SEG7[ram_day%10];}break;
case 8:{PA=SEG7[ram_day/10];}break;
case 9:{PA=SEG7[ram_mon%10];}break;
case 10:{PA=SEG7[ram_mon/10];}break;
case 11:{PA=SEG7[ram_year%10];}break;
case 12:{PA=SEG7[ram_year/10];}break;
default:break;
}
}
/****************************************/
void min_dis(uchar disbit)
{uchar y_week;
switch(disbit)
{
case 0:{PA=SEG7[ram_sec%10];}break;
case 1:{PA=SEG7[ram_sec/10];}break;
case 2:{PA=SEG7[ram_min%10]&0x7f;}break;
case 3:{PA=SEG7[ram_min/10]&0x7f;}break;
case 4:{PA=SEG7[ram_hou%10];}break;
case 5:{PA=SEG7[ram_hou/10];}break;
case 6:{if(ram_week==1)y_week=9;
else y_week=ram_week;PA=SEG7[y_week-1];}break;
case 7:{PA=SEG7[ram_day%10];}break;
case 8:{PA=SEG7[ram_day/10];}break;
case 9:{PA=SEG7[ram_mon%10];}break;
case 10:{PA=SEG7[ram_mon/10];}break;
case 11:{PA=SEG7[ram_year%10];}break;
case 12:{PA=SEG7[ram_year/10];}break;
default:break;
}
}
/***************************************/
void hou_dis(uchar disbit)
{uchar y_week;
switch(disbit)
{
case 0:{PA=SEG7[ram_sec%10];}break;
case 1:{PA=SEG7[ram_sec/10];}break;
case 2:{PA=SEG7[ram_min%10];}break;
case 3:{PA=SEG7[ram_min/10];}break;
case 4:{PA=SEG7[ram_hou%10]&0x7f;}break;
case 5:{PA=SEG7[ram_hou/10]&0x7f;}break;
case 6:{if(ram_week==1)y_week=9;
else y_week=ram_week;PA=SEG7[y_week-1];}break;
case 7:{PA=SEG7[ram_day%10];}break;
case 8:{PA=SEG7[ram_day/10];}break;
case 9:{PA=SEG7[ram_mon%10];}break;
case 10:{PA=SEG7[ram_mon/10];}break;
case 11:{PA=SEG7[ram_year%10];}break;
case 12:{PA=SEG7[ram_year/10];}break;
default:break;
}
}
/***************************************/
void week_dis(uchar disbit)
{uchar y_week;
switch(disbit)
{
case 0:{PA=SEG7[ram_sec%10];}break;
case 1:{PA=SEG7[ram_sec/10];}break;
case 2:{PA=SEG7[ram_min%10];}break;
case 3:{PA=SEG7[ram_min/10];}break;
case 4:{PA=SEG7[ram_hou%10];}break;
case 5:{PA=SEG7[ram_hou/10];}break;
case 6:{if(ram_week==1)y_week=9;
else y_week=ram_week;PA=SEG7[y_week-1]&0x7f;}break;
case 7:{PA=SEG7[ram_day%10];}break;
case 8:{PA=SEG7[ram_day/10];}break;
case 9:{PA=SEG7[ram_mon%10];}break;
case 10:{PA=SEG7[ram_mon/10];}break;
case 11:{PA=SEG7[ram_year%10];}break;
case 12:{PA=SEG7[ram_year/10];}break;
default:break;
}
}
/**************************************/
void day_dis(uchar disbit)
{uchar y_week;
switch(disbit)
{
case 0:{PA=SEG7[ram_sec%10];}break;
case 1:{PA=SEG7[ram_sec/10];}break;
case 2:{PA=SEG7[ram_min%10];}break;
case 3:{PA=SEG7[ram_min/10];}break;
case 4:{PA=SEG7[ram_hou%10];}break;
case 5:{PA=SEG7[ram_hou/10];}break;
case 6:{if(ram_week==1)y_week=9;
else y_week=ram_week;PA=SEG7[y_week-1];}break;
case 7:{PA=SEG7[ram_day%10]&0x7f;}break;
case 8:{PA=SEG7[ram_day/10]&0x7f;}break;
case 9:{PA=SEG7[ram_mon%10];}break;
case 10:{PA=SEG7[ram_mon/10];}break;
case 11:{PA=SEG7[ram_year%10];}break;
case 12:{PA=SEG7[ram_year/10];}break;
default:break;
}
}
/********************************************/
void mon_dis(uchar disbit)
{uchar y_week;
switch(disbit)
{
case 0:{PA=SEG7[ram_sec%10];}break;
case 1:{PA=SEG7[ram_sec/10];}break;
case 2:{PA=SEG7[ram_min%10];}break;
case 3:{PA=SEG7[ram_min/10];}break;
case 4:{PA=SEG7[ram_hou%10];}break;
case 5:{PA=SEG7[ram_hou/10];}break;
case 6:{if(ram_week==1)y_week=9;
else y_week=ram_week;PA=SEG7[y_week-1];}break;
case 7:{PA=SEG7[ram_day%10];}break;
case 8:{PA=SEG7[ram_day/10];}break;
case 9:{PA=SEG7[ram_mon%10]&0x7f;}break;
case 10:{PA=SEG7[ram_mon/10]&0x7f;}break;
case 11:{PA=SEG7[ram_year%10];}break;
case 12:{PA=SEG7[ram_year/10];}break;
default:break;
}
}
/****************************************/
void year_dis(uchar disbit)
{uchar y_week;
switch(disbit)
{
case 0:{PA=SEG7[ram_sec%10];}break;
case 1:{PA=SEG7[ram_sec/10];}break;
case 2:{PA=SEG7[ram_min%10];}break;
case 3:{PA=SEG7[ram_min/10];}break;
case 4:{PA=SEG7[ram_hou%10];}break;
case 5:{PA=SEG7[ram_hou/10];}break;
case 6:{if(ram_week==1)y_week=9;
else y_week=ram_week;PA=SEG7[y_week-1];}break;
case 7:{PA=SEG7[ram_day%10];}break;
case 8:{PA=SEG7[ram_day/10];}break;
case 9:{PA=SEG7[ram_mon%10];}break;
case 10:{PA=SEG7[ram_mon/10];}break;
case 11:{PA=SEG7[ram_year%10]&0x7f;}break;
case 12:{PA=SEG7[ram_year/10]&0x7f;}break;
default:break;
}
}
/****************************************/
void time0(void) interrupt 1 using 1
{static uchar disbit;
TH0=-(2000/256);
TL0=-(2000%256);
PB=0xff;PC=0xff;
switch(ms)
{
case 0:{time_dis(disbit);}break;
case 1:{min_dis(disbit);}break;
case 2:{hou_dis(disbit);}break;
case 3:{week_dis(disbit);}break;
case 4:{day_dis(disbit);}break;
case 5:{mon_dis(disbit);}break;
case 6:{year_dis(disbit);}break;
default:break;
}
disbit++;
if(disbit>12)disbit=0;
if(disbit<8){PB=act_PB[disbit];PC=0xff;}
else {PB=0xff;PC=act_PC[disbit-8];}
}
/***********************************/
void main(void)
{
init();
rd_time();
while(1)
{
scan_key();
if(ms==0){
if(flag){wr_time();flag=0;}
else rd_time();
}
}
}
/*****************************************/
void wr_time(void)
{
DS12887B=0x86;
year=ram_year;mon=ram_mon;day=ram_day;
week=ram_week;hou=ram_hou;min=ram_min;
DS12887B=0x06;
}
/*******************************************/
void rd_time(void)
{
uchar data temp,x;
do{temp=DS12887A;x=temp|0x7f;}while(x==0xff);
ram_year=year;ram_mon=mon;ram_day=day;
ram_week=week;ram_hou=hou;ram_min=min;ram_sec=sec;
}
/*****************************************/
void scan_key(void)
{
if(!set_inc){ms++;delay(200);if(ms>6)ms=0;}
if(!set_dec){ms--;delay(200);if(ms<0)ms=6;}
if(ms==1){flag=1;if(!inc){ram_min++;if(ram_min>59)ram_min=59;delay(200);}
if(!dec){ram_min--;if(ram_min<1)ram_min=1;delay(200);}}
if(ms==2){if(!inc){ram_hou++;if(ram_hou>23)ram_hou=23;delay(200);}
if(!dec){ram_hou--;if(ram_hou<0)ram_hou=0;delay(200);}}
if(ms==3){if(!inc){ram_week++;if(ram_week>7)ram_week=7;delay(200);}
if(!dec){ram_week--;if(ram_week<1)ram_week=1;delay(200);} }
if(ms==4){if(!inc){ram_day++;if(ram_day>31)ram_day=31;delay(200);}
if(!dec){ram_day--;if(ram_day<1)ram_day=1;delay(200);}}
if(ms==5){if(!inc){ram_mon++;if(ram_mon>12)ram_mon=12;delay(200);}
if(!dec){ram_mon--;if(ram_mon<1)ram_mon=1;delay(200);}}
if(ms==6){flag=1;if(!inc){ram_year++;if(ram_year>99)ram_year=99;delay(200);}
if(!dec){ram_year--;if(ram_year<0)ram_day=0;delay(200);} }
}
/********************************************************/
void delay(uint k)
{
uint i,j;
for(i=0;i<k;i++){
for(j=0;j<60;j++)
{;}}
}
/*****************end********************/
汽车智能化扫盲:秒懂CPU、GPU、NPU、DPU、MCU、ECU
当汽车进入电动化、智能化赛道后,产品变革所衍生的名词困扰着消费者。例如关于芯片方面的CPU、GPU、NPU、SOC等等。这些参数格外重要,甚至不逊于燃油车时代的一些核心部件配置。
这次,我们进行一次芯片名词科普,一起扫盲做个电动化汽车达人。
关于芯片里的名词
1、CPU
汽车cpu是汽车中央处理器。其事就是机器的“大脑”,也是布局谋略、发号施令、控制行动的“总司令官”。
CPU的结构主要包括运算器(ALU, Arithmetic and Logic Unit)、控制单元(CU, Control Unit)、寄存器(Register)、高速缓存器(Cache)和它们之间通讯的数据、控制及状态的总线。
简单来说就是:计算单元、控制单元和存储单元。(架构如下图)
如果你看不懂,我可以把他翻译成中文。简单来说就是,计算单元主要执行算术运算,存储单元主要保存数据以及指令等;控制单元则对指令译码。
2、GPU
GPU叫做图形处理器,又称显示核心、视觉处理器、显示芯片。
图形处理你是不是想到了显卡?提到显卡和GPU,人们会想到游戏和电影中精美的三维图形。其实,早期显卡不但不能处理三维图形,甚至连二维图形都无法处理,它仅具备显示能力。今天,GPU不但能够处理复杂的三维图形,还能作为协处理器,在通用计算中使用。
电脑图形处理器的发展是从图形显示适配器开始的,到图形加速器,再到图形处理器即GPU,其功能在不断增强。
3、MCU
汽车mcu是微控制器,控制着汽车内所有的电子系统,比如多媒体、音响、导航、悬挂等。作为汽车电子控制系统的核心,mcu必须有着耐高温和坚固的特性,使之在复杂的汽车内部环境中不容易损坏。
MCU分为1位、4位、8位、16位、32位甚至64位单片机。4位MCU大部分应用在计算器、车用仪表、车用防盗装置。
4、NPU
近几年NPU特别火,我们可以理解为NPU就是AI芯片,普通芯片就是CPU。在自动驾驶和智能座舱都离不开NPU。
换句话说,npu是具备智能和学习的特性, 也就是说这个处理器它是会模仿人的大脑神经网络的。
在工作模式上,CPU主要是负责低精度,各种普通的数据,npu则是人工智能算法上面运行效率要高于另外两者。
5、SoC
SoC芯片是芯片的一种,简单的理解就是把几种不同类型的芯片集成到一块芯片上,比如把CPU、GPU、存储器、蓝牙芯片等集成到一个芯片上。
再例如,智能座舱上的wifi功能和蓝牙功能,都是集成在SoC芯片之上,例如8155就属于SoC芯片。
6、TOPS
TOPS也是我们常说的算力,1 TOPS代表处理器每秒钟可进行一万亿次。我们熟知的8155芯片算力是8TOPS,英伟达 orin芯片算力为254TOPS。
汽车从L1、L2、L3、L4、L5不断推进,某种意义上看,就是算力的竞赛,每往上进阶一级就意味着对算力的需求更高。
毫无疑问,当前的自动驾驶芯片市场发生了明显的变化,“大算力”正是一大趋势。除了英伟达,算力突破100TOPS的芯片陆续问世,比如已发布单颗芯片最高算力可达128TOPS的地平线征程5;单颗芯片最高算力可达176TOPS的Mobileye EyeQ Ultra等。
7、DMIPS
常常有人会把TOPS和DMIPS搞混,认为这两个词语都在表达同一种计算能力。其实并非如此,DMIPS是每秒处理机器语言指令数,而TOPS是每秒钟可以进行的操作数量。
例如8155芯片CPU能够达到105K DMIPS执行能力,算力是8TOPS,这显然是芯片两块不同领域的处理能力。
DMIPS是,用Dhrystone这套测试程序跑下来,每秒钟可以执行多少指令。
某种意义上,谁家的这个数字高,谁家的CPU就更牛。50000DMIPS就意味着每秒可以执行50000*100万条指令。
8、DPU
DPU和NPU的组合很像TOPS和DMIPS,很容易搞混。
DPU和NPU都是具有学习能力的芯片,只是DPU是深度学习处理器,是基于Xilinx可重构特性的FPGA芯片。而NPU不基于Xilinx。
不同于CPU的AI芯片,DPU可以机器学习、安全、电信和存储等应用,并提升性能。
汽车芯片的种类
汽车芯片的三大类:1、整车域的MCU。2、自动驾驶域的AI芯片。3、智能座舱域的CPU。这三大门类都需要芯片,但是难度系数却相差很多。
汽车芯片从MCU到自动驾驶座舱,虽然有如果说MCU芯片的弱鸡性能让汽车的面子有点挂不住,那自动驾驶域的AI芯片可以说是扳回一城了。
1、自动驾驶域的AI芯片
以英伟达orin为例,orin的CPU内核是12个Coretex-A78(代号Hercules),GPU是Ampere。
我们拿蔚来ET7举例。
CUBA单元:蔚来ET7搭载了四颗NVIDIA ORIN芯片(近1000TOPS),其CUBA(Compute Unified Device Architecture)单元达8096,接近8704CUBA核心的RTX3080显卡。
晶体管数量:蔚来ET7搭载四颗NVIDIA ORIN芯片的晶体管数量为680亿,同期“秒天秒地秒一切”的苹果A14芯片的晶体管数量为118亿。
数据处理量:特斯拉FSD芯片内置图片处理器ISP,最高以25亿像素/秒的速度处理图像,大概是往21块1080P的高清屏幕上塞60帧画面。
NPU:特斯拉FSD芯片的神经处理单元NPU高速缓存32MB,与零售价16999元的英特尔酷睿i9-9980XE的33.75MB SRAM缓存总量相当
2、智能座舱芯片
智能座舱的主芯片一般称之为SoC – System on Chip即片上系统,它包括CPU、GPU,AI引擎,还包括处理各种各样摄像头的ISP,支持多显示屏的DPU、集成音频处理等等。另外第3代的数字座舱系统,配备了个性化的计算机视觉和机器学习的计算机应用平台,包含AI加速器等等。同时,高通在SoC上也集成了先进的Wi-Fi、蓝牙技术,可以支持眼下最热的Wi-Fi6以及蓝牙5.1的技术。
提到智能座舱芯片,不得不看高通骁龙8155芯片。
高通的8155芯片是一枚强大的智能座舱SOC芯片,全称是SA8155P,它采用7纳米工艺制造,具有八个核心CPU,算力为8TOPS,也就是每秒运算8万亿次,它可以最多支持6个摄像头,连接4块2K屏幕或者3块4K屏幕,支持WiFi6,支持5G,支持蓝牙5.0。
值得注意的是,8155芯片并没有独立的NPU内核,AI计算主要通过DSP、CPU和GPU组成的AI引擎完成。其中,Hexagon 690拥有7TOPS的AI算力,加上CPU、GPU的AI算力之和为8TOPS。而在制程方面,高通8155采用台积电N7工艺,也就是第一代7nm工艺打造,与骁龙855以及855+属于同一代产品。
3、整车域MCU
在智能化未普及之前,早期汽车是纯机械产品。那时的发动机并没有电子控制器、车窗也只有机械式控制,所以不需要任何芯片,更没有算力、图像处理这一说法。
在近几十年中,机械式的汽车逐步智能化。一次新增一个功能,就需要配一个MCU(Micro Control Unit)。这种发展方式,造成了MCU越多,线束凌乱的现状。这也构成了传统车企缺芯的现象。
当然,也不要小看MCU,这个领域支撑起来的半导体公司都是赫赫有名。如果对比的是汽车MCU芯片 —— 那的确,无论是性能上、制程上,手机芯片都要先进不少!
相关问答
在 单片机 系统中,当I/O口不够用时,可以使用 8155 、8255或74L...[最佳回答]对!