产品概述

单片机8155 8155及DS12887结构及特点 万年历源程序

小编 2024-10-07 产品概述 23 0

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...

[最佳回答]对!

猜你喜欢