万年历芯片t2488sd3代换,t2555sd3万年历芯片资料
chanong
|由于本电路使用了两块专用芯片,因此有必要更详细地介绍一下8155和DS12887的功能和特点,以便大家在分析程序时能够清楚地理解。
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。用作控制信号线时的功能如下。
PC0AINTR(A口中断)
PC1ABF(A口缓冲区满)
PC2/ASTB(A端口选通)
PC3BINTR(B口中断)
PC4BBF(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位减法计数器,对输入脉冲进行减法计数,由2个字节组成,格式如下:
T13~T0:计数长度。
M2、M1:定时器模式
DS12887的结构和特点
图4为DS12887的配置框图,DS12887是DALLAS公司的一款实时时钟芯片RTC(Real Time Clock),应用广泛,功能丰富,PC机中的时钟信号由D512887提供。 DS12887内置独特的晶振和锂电池,可以计算2100年之前的秒、分、时、星期、日、月、年等七种日历信息。停电多年后,数据就会丢失。夏令时是可选的,可以指定为24 小时或12 小时格式。广泛应用于工业控制和仪器仪表领域。当DS12887上电时,如果Vcc高于4.25V并持续200ms,芯片就可以通过外部程序进行操作。当Vcc低于4.25V时,芯片进入写保护状态(所有输入均被禁用)并且所有输出均处于高阻状态。如果Vcc低于3V,芯片会自动切换电源模式,由内部电池供电。
图5 显示了DS12887 的引脚排列。 AD0至AD7是地址/数据复用总线。 NC 两手空空。 MOT 是总线模式选择(MOTOROLA/INTEL);将此引脚连接到Vcc 选择MOTOROLA 总线时序;连接到GND 或不连接选择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=1:更新已到达,但DS12887 不可读写; UIP=0:更新未到达,但DS12887 可读写。
DV2、DV1 和DV0 必须设置为010。这意味着打开晶体振荡器并允许计时。
RS3、RS2、RS1 和RS0 是产生方波周期性中断的方波频率选择位。
DS12887内部寄存器B:
SET=0:时间更新正常发生,每秒计数一次;SET=1:禁止更新,程序可以初始化时间和日历。
PIE=1:启用周期性中断;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=1:使用夏令时;DSE=0:不使用夏令时。
DS12887内部寄存器C:
IRQF是中断请求标志。
PF是方波周期中断标志。 PF=1:方波周期结束,请求中断。
AF为报警中断标志。 AF=1:如果当前时间与闹钟时间匹配,则立即请求中断。
UF 是更新周期结束中断标志。 UF II I: 在更新周期结束时应用暂停。
DS12887内部寄存器D:
VRT是内置锂电池的状态。 VRT=1:锂电池正常,VRT=0:锂电池耗尽。
D512887 内部存储器的功能如单独的表格所示。
包括
包括
#定义uchar无符号字符
#定义uint 无符号整型
//============================
#定义C8155 XBYTE[0x7000]
#定义PA XBYTE[0x7001]
#definePBXBYTE[0x7002]
#定义PC XBYTE[0x7003]
//============================
#定义秒XBYTE[0x8000]
#定义最小XBYTE[0x8002]
#定义侯XBYTE[0x8004]
#定义周XBYTE[0x8006]
#定义日期XBYTE[0x8007]
定义#XBYTE[0x8008]
#定义年份XBYTE[0x8009]
#define 分XBYTE [0x8032]
#定义DS12887A XBYTE[0x800a]
#定义DS12887B XBYTE[0x800b]
#定义DS12887C XBYTE[0x800c]
//==================================
sbit set_inc=P1^0;
sbit set_dec=P1^1;
sbit公司=P1^2;
sbit 十进制=P1^3;
伍彻迪比特。
位标志。
uchar SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
uchar代码act_PB[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar代码act_PC[5]={0xfe,0xfd,0xfb,0xf7,0xef};
魅力=0;
字符数据ram_year、ram_mon、ram_day、ram_week、ram_hou、ram_min、ram_sec;
无效扫描密钥(无效);
无效延迟(uint k);
无效wr_time(无效);
无效rd_time(无效);
/********************************************/
无效init_timer0(无效)
{
TH0=-(2000/256);
TL0=-(2000%256);
TR0=1;
}
//************************
无效初始化(void)
{init_timer0();
EA=1;ET0=1;
C8155=0x0f;
DS12887A=0x20;
}
/****************************************************/
无效time_dis(uchar disbit)
{uchar y_week;
开关(除位)
{
案例0:{PA=SEG7[ram_sec%10];}中断;
case 1:{PA=SEG7[ram_sec/10];}中断;
case 2:{PA=SEG7[ram_min%10];}中断;
情况3:{PA=SEG7[ram_min/10];}中断;
case 4:{PA=SEG7[ram_hou%10];}中断;
案例5:{PA=SEG7[ram_hou/10];}中断;
案例6:{if(ram_week==1)y_week=9;
否则y_week=ram_week;PA=SEG7[y_week-1];}Break;
case 7:{PA=SEG7[ram_day%10];}中断;
案例8:{PA=SEG7[ram_day/10];}中断;
案例9:{PA=SEG7[ram_mon%10];}break;
案例10:{PA=SEG7[ram_mon/10];}中断;
case 11:{PA=SEG7[ram_year%10];}中断;
案例12:{PA=SEG7[ram_year/10];}中断;
默认:中断;
}
}
/****************************************************/
无效min_dis(uchar disbit)
{uchar y_week;
开关(除位)
{
案例0:{PA=SEG7[ram_sec%10];}中断;
case 1:{PA=SEG7[ram_sec/10];}中断;
case 2:{PA=SEG7[ram_min%10]0x7f;}中断;
情况3:{PA=SEG7[ram_min/10]0x7f;}中断;
case 4:{PA=SEG7[ram_hou%10];}中断;
案例5:{PA=SEG7[ram_hou/10];}中断;
案例6:{if(ram_week==1)y_week=9;
否则y_week=ram_week;PA=SEG7[y_week-1];}Break;
case 7:{PA=SEG7[ram_day%10];}中断;
案例8:{PA=SEG7[ram_day/10];}中断;
案例9:{PA=SEG7[ram_mon%10];}break;
案例10:{PA=SEG7[ram_mon/10];}中断;
case 11:{PA=SEG7[ram_year%10];}中断;
案例12:{PA=SEG7[ram_year/10];}中断;
默认:中断;
}
}
/****************************************************/
void hou_dis(uchar disbit)
{uchar y_week;
开关(除位)
{
案例0:{PA=SEG7[ram_sec%10];}中断;
case 1:{PA=SEG7[ram_sec/10];}中断;
case 2:{PA=SEG7[ram_min%10];}中断;
情况3:{PA=SEG7[ram_min/10];}中断;
案例4:{PA=SEG7[ram_hou%10]0x7f;}中断;
案例5:{PA=SEG7[ram_hou/10]0x7f;}中断;
案例6:{if(ram_week==1)y_week=9;
否则y_week=ram_week;PA=SEG7[y_week-1];}Break;
case 7:{PA=SEG7[ram_day%10];}中断;
案例8:{PA=SEG7[ram_day/10];}中断;
案例9:{PA=SEG7[ram_mon%10];}break;
案例10:{PA=SEG7[ram_mon/10];}中断;
case 11:{PA=SEG7[ram_year%10];}中断;
案例12:{PA=SEG7[ram_year/10];}中断;
默认:中断;
}
}
/****************************************************/
void Week_dis(uchar disbit)
{uchar y_week;
开关(除位)
{
案例0:{PA=SEG7[ram_sec%10];}中断;
case 1:{PA=SEG7[ram_sec/10];}中断;
case 2:{PA=SEG7[ram_min%10];}中断;
情况3:{PA=SEG7[ram_min/10];}中断;
case 4:{PA=SEG7[ram_hou%10];}中断;
案例5:{PA=SEG7[ram_hou/10];}中断;
案例6:{if(ram_week==1)y_week=9;
否则y_week=ram_week;PA=SEG7[y_week-1]0x7f;}break;
case 7:{PA=SEG7[ram_day%10];}中断;
案例8:{PA=SEG7[ram_day/10];}中断;
案例9:{PA=SEG7[ram_mon%10];}break;
案例10:{PA=SEG7[ram_mon/10];}中断;
case 11:{PA=SEG7[ram_year%10];}中断;
案例12:{PA=SEG7[ram_year/10];}中断;
默认:中断;
}
}
/****************************************************/
void day_dis(uchar disbit)
{uchar y_week;
开关(除位)
{
案例0:{PA=SEG7[ram_sec%10];}中断;
case 1:{PA=SEG7[ram_sec/10];}中断;
case 2:{PA=SEG7[ram_min%10];}中断;
情况3:{PA=SEG7[ram_min/10];}中断;
case 4:{PA=SEG7[ram_hou%10];}中断;
案例5:{PA=SEG7[ram_hou/10];}中断;
案例6:{if(ram_week==1)y_week=9;
否则y_week=ram_week;PA=SEG7[y_week-1];}Break;
案例7:{PA=SEG7[ram_day%10]0x7f;}中断;
案例8:{PA=SEG7[ram_day/10]0x7f;}中断;
案例9:{PA=SEG7[ram_mon%10];}break;
案例10:{PA=SEG7[ram_mon/10];}中断;
case 11:{PA=SEG7[ram_year%10];}中断;
案例12:{PA=SEG7[ram_year/10];}中断;
默认:中断;
}
}
/****************************************************/
void mon_dis(uchar disbit)
{uchar y_week;
开关(除位)
{
案例0:{PA=SEG7[ram_sec%10];}中断;
case 1:{PA=SEG7[ram_sec/10];}中断;
case 2:{PA=SEG7[ram_min%10];}中断;
情况3:{PA=SEG7[ram_min/10];}中断;
case 4:{PA=SEG7[ram_hou%10];}中断;
案例5:{PA=SEG7[ram_hou/10];}中断;
案例6:{if(ram_week==1)y_week=9;
否则y_week=ram_week;PA=SEG7[y_week-1];}Break;
case 7:{PA=SEG7[ram_day%10];}中断;
案例8:{PA=SEG7[ram_day/10];}中断;
case 9:{PA=SEG7[ram_mon%10]0x7f;}中断;
案例10:{PA=SEG7[ram_mon/10]0x7f;}中断;
case 11:{PA=SEG7[ram_year%10];}中断;
案例12:{PA=SEG7[ram_year/10];}中断;
默认:中断;
}
}
/****************************************************/
无效year_dis(uchar disbit)
{uchar y_week;
开关(除位)
{
案例0:{PA=SEG7[ram_sec%10];}中断;
case 1:{PA=SEG7[ram_sec/10];}中断;
case 2:{PA=SEG7[ram_min%10];}中断;
情况3:{PA=SEG7[ram_min/10];}中断;
case 4:{PA=SEG7[ram_hou%10];}中断;
案例5:{PA=SEG7[ram_hou/10];}中断;
案例6:{if(ram_week==1)y_week=9;
否则y_week=ram_week;PA=SEG7[y_week-1];}Break;
case 7:{PA=SEG7[ram_day%10];}中断;
案例8:{PA=SEG7[ram_day/10];}中断;
案例9:{PA=SEG7[ram_mon%10];}break;
案例10:{PA=SEG7[ram_mon/10];}中断;
案例11:{PA=SEG7[ram_year%10]0x7f;}中断;
案例12:{PA=SEG7[ram_year/10]0x7f;}中断;
默认:中断;
}
}
/****************************************************/
void time0(void) 1 使用中断1
{ 静态uchar disbit;
TH0=-(2000/256);
TL0=-(2000%256);
PB=0xff;PC=0xff;
切换(毫秒)
{
案例0:{time_dis(disbit);}break;
案例1:{min_dis(disbit);}break;
案例2:{hou_dis(disbit);}break;
案例3:{week_dis(disbit);}break;
案例4:{day_dis(disbit);}break;
案例5:{mon_dis(disbit);}break;
案例6:{year_dis(disbit);}break;
默认:中断;
}
迪比特++;
if(disbit12)disbit=0;
if(disbit8){PB=act_PB[disbit];PC=0xff;}
否则{PB=0xff;PC=act_PC[disbit-8];}
}
/*************************************/
空主(空)
{
初始化();
rd_time();
同时(1)
{
扫描键();
如果(毫秒==0){
if(flag){wr_time();flag=0;}
否则rd_time();
}
}
}
/****************************************************/
无效wr_time(无效)
{
DS12887B=0x86;
年=Ram_Year;月=Ram_Mon;日=Ram_Day;
周=ram_week;hou=ram_hou;min=ram_min;
DS12887B=0x06;
}
/****************************************************/
无效rd_时间(无效)
{
uchar 数据温度,x;
do{temp=DS12887A;x=temp|0x7f;}while(x==0xff);
ram_year=年;ram_mon=月;ram_day=日;
ram_week=周;ram_hou=hou;ram_min=分钟;ram_sec=秒;
}
/****************************************************/
无效扫描密钥(无效)
{
if(!set_inc){ms++;延迟(200);if(ms6)ms=0;}
if(!set_dec){ms--;延迟(200);if(ms0)ms=6;}
if(ms==1){flag=1;if(!inc){ram_min++;if(ram_min59)ram_min=59;延迟(200);}
if(!dec){ram_min--;if(ram_min1)ram_min=1;延迟(200);}}
if(ms==2){if(!inc){ram_hou++;if(ram_hou23)ram_hou=23;延迟(200);}
if(!dec){ram_hou--;if(ram_hou0)ram_hou=0;延迟(200);}}
if(ms==3){if(!inc){ram_week++;if(ram_week7)ram_week=7;延迟(200);}
if(!dec){ram_week--;if(ram_week1)ram_week=1;delay(200);} }
if(ms==4){if(!inc){ram_day++;if(ram_day31)ram_day=31;延迟(200);}
if(!dec){ram_day--;if(ram_day1)ram_day=1;延迟(200);}}
if(ms==5){if(!inc){ram_mon++;if(ram_mon12)ram_mon=12;延迟(200);}
if(!dec){ram_mon--;if(ram_mon1)ram_mon=1;延迟(200);}}
if(ms==6){flag=1;if(!inc){ram_year++;if(ram_year99)ram_year=99;delay(200);}
if(!dec){ram_year--;if(ram_year0)ram_day=0;delay(200);} }
}
/**************************************************** * ************/
无效延迟(单位k)
{
单元i,j;
对于(i=0;i
for(j=0;j60;j++)
{;}}
}
/************************结尾**********************/








