大连理工大学单片机综合设计基于ZLG7290BPCF8563的时钟系统设计Word格式.docx
《大连理工大学单片机综合设计基于ZLG7290BPCF8563的时钟系统设计Word格式.docx》由会员分享,可在线阅读,更多相关《大连理工大学单片机综合设计基于ZLG7290BPCF8563的时钟系统设计Word格式.docx(26页珍藏版)》请在冰豆网上搜索。
通过CHAIFEN子程序将20H-26H中获取时间参数拆分查表后送入下列缓冲区:
●28H-2FH:
年(4单元)、月(2单元)、日(2单元);
●38H-3FH:
小时、分钟、秒(各占单元)。
键盘修改时间子程序中先将键值读入A,经判断转换后送入缓冲区20H-22H。
主程序功能:
Ø
将10H-1DH中特定时间和控制命令送入PCF8563T对应寄存器中,等待中断。
由于PCF8563T的CLKOUT设定输出频率为1HZ,将其与INT0相连,每秒引发一次中断。
在时钟中断服务程序中读取时间参数,调整各参数后进入整点报时子程序,判断是否报时。
然后将时间参数经拆分查表等操作,将年、月、日送28H-2FH缓冲区,将小时、分、秒送38H-3FH缓冲区,最后根据P1.2电平决定哪个缓冲区内容送ZLG7290B进行显示。
ZLG7290B的键盘中断输出信号INT与INT1相连,每当有按键是触发中断,先读入键值至A中,判断是A、B或C,分别对应修改时、分、秒,进入对应子程序然后在等待两次输入,经转换设置成十位和个位,存入入12H-14H对应单元,再送入PCF8563T对应寄存器。
3系统电路
4外围接口模块硬件电路功能描述
(1)ZLG7290B:
数码管动态显示驱动、键盘扫描管理芯片,可驱动8位共阴极结构LED数码管,同时可管理64个按键扫描识别,接口采用I2C结构。
(2)PCF8563T:
由Philips公司设计的低功耗CMOS实时时钟日历芯片,具有1.0-5.5V的电压工作范围、一个可编程时钟输出和掉电检测电路,接口采用I2C结构,每次读写操作内部地址寄存器自动产生增量。
(3)交流驱动蜂鸣器:
一种发声元件,体积小,使用PNP驱动,需要一交变信号驱动才能发出相应频率的声音。
5主程序中主要变量定义
RAM单元或工作寄存器定义、功能等。
变量名称
RAM单元/寄存器
功能
PCF8563T时间和控制命令参数
10H-1DH
设定PCF8563T时间和
命令参数的缓冲区
时间参数
20H-26H
从PCF8563T中读出的时间参数(秒、分、小时、日、星期、月、年)缓冲区
年月日
28H-2FH
拆分查表所得年月日缓冲区以待显示
时分秒
38H-3FH
拆分查表所得时分秒缓冲区以待显示
键值
1FH
读入的键值存储单元
6系统软件中各个子程序的功能描述
子程序的名称、功能,以及入口、出口参数。
子程序名称
入口参数
出口参数
功能描述
INT_RCT
无
时钟中断服务子程序
PANDUAN
20-21H
判断并进行整点报时
CHAIFEN
20-26H
28-2FH、38-3FH
将时间参数拆分查表
CF
A
R4、R3
将A中数据拆违两独立的十六进制数并查表得到对应字型码
ADJUST
20-25H
屏蔽各时间参数无关位
INT_7290
键盘修改时间中断服务子程序
RDKEY
读键值子程序
WR8563
R7、R0、R2、R3
向日历芯片写时间参数
WRNBYT
带有内部单元地址的多字节写操作子程序
RDADD
R7、R0、R2、R3、R4
带有内部单元地址的多字节读操作子程序
7主程序程序流程图
N
Y
YN
NWAIT1
WAIT2
8程序清单
;
************************************************************
由PCF8563提供时间参数并由ZLG7290进行显示
能够利用键盘实现时间参数的修改,修改过程可加入回显、闪烁、容错等功能
利用蜂鸣器实现时钟系统整点报时功能
要求程序中有中断环节
转换显示:
P1.2与KEY1连接,按下KEY1显示年月日,平时显示时分秒
设定时钟芯片CLKOUT输出秒脉冲且与P3.2连接
采用中断的方式来显示时间(每秒钟刷新一次显示)
ZLG7290B芯片的RST_L复位端与P1.7口连接,以便复位操作
************************************************************
SDABITP1.0;
定义I2C信号引脚
SCLBITP1.1
WSLA_8563EQU0A2H;
PCF8563T口地址
RSLA_8563EQU0A3H
WSLA_7290EQU70H;
ZLG7290B口地址
RSLA_7290EQU71H
ORG8000H
LJMP8100H
ORG8003H
LJMPINT_RCT
ORG8013H
LJMPINT_7290
ORG8100H
START:
MOVSP,#60H
CLRP1.7;
ZLG7290B复位
LCALLDELAY
SETBP1.7
******************************
设定PCF8563T的时间和命令参数
MOV10H,#00H;
启动控制字
MOV11H,#1FH;
设置报警及定时器中断
MOV12H,#50H;
秒单元
MOV13H,#59H;
分单元
MOV14H,#10H;
时单元
MOV15H,#29H;
日期单元
MOV16H,#03H;
星期单元
MOV17H,#04H;
月单元
MOV18H,#15H;
年单元
MOV19H,#00H;
设定分报警
MOV1AH,#00H;
设定小时报警
MOV1BH,#00H;
设定日报警
MOV1CH,#00H;
设定星期报警
MOV1DH,#83H;
设定CLKOUT的频率(1S)
*****************************
MOVR7,#0EH;
写入参数个数(时间和控制字)
MOVR0,#10H;
参数和控制命令缓冲区首地址
MOVR2,#00H;
从器件内部从地址
MOVR3,#WSLA_8563;
准备向PCF8563T写入数据串
LCALLWRNBYT;
写入时间、控制命令到PCF8563T
MOVIP,02H
SETBEA
SETBEX0
SETBEX1
SETBIT0
SETBIT1
SJMP$;
等待中断
INT_RCT:
MOVR7,#07H;
读出数个数
MOVR0,#20H;
目标数据块首地址
MOVR2,#02H;
从器件内部首地址
MOVR3,#WSLA_8563
MOVR4,#RSLA_8563;
准备读PCF8563T的时间参数
LCALLRDADD;
调读数据子程序,将读出的数据存放于单片机20H~26H中
LCALLADJUST;
调时间调整子程序
LCALLPANDUAN;
调判断键值子程序
LCALLCHAIFEN;
调拆分子程序(包含查表),将20H~26H中的参数分别存于28H~2FH、38H~3FH单元中
MOVR7,#08H
MOVR2,#10H
MOVR3,#WSLA_7290
JNBP1.2,YEARS;
使用P1.2控制显示内容
MOVR0,#38H;
显示小时、分钟和秒
SJMPDISP
YEARS:
MOVR0,#28H;
显示年月日
DISP:
调ZLG7290B显示
JNBP3.2,$
RETI
整点报时子程序
PANDUAN:
MOVA,21H
CJNEA,#59H,PDFEN
MOVA,20H
CJNEA,#56H,PD57
LCALLBAOSHI1
AJMPEXIT
PD57:
CJNEA,#57H,PD58
PD58:
CJNEA,#58H,PD59
PD59:
CJNEA,#59H,EXIT
PDFEN:
CJNEA,#00H,EXIT
LCALLBAOSHI2
EXIT:
RET
*******************************
低音1S报时
BAOSHI1:
PUSHPSW
PUSH00H
MOVR0,#0FFH
MOVTMOD,#10H
MOVTL1,#00H
MOVTH1,#0FEH
SETBTR1
WORK1:
JNBTF1,$
CLRTF1
CPLP1.4
DJNZR0,WORK1
POP00H
POPPSW
高音1S报时
BAOSHI2:
PUSH01H
MOVR0,#04H
WORK2:
MOVR1,#00H
MOVTH1,#0FFH
WORK3:
DJNZR1,WORK3
DJNZR0,WORK2
POP01H
各子程序
ORG8300H
CHAIFEN:
PUSHPSW;
对20H~26H单元的参数拆分并在查表后送28H~2FH(年月日)和38H~3FH(时分秒)
PUSHACC
PUSH03H
PUSH04H
MOVA,20H;
取秒参数
LCALLCF;
拆分、查表在R4、R3中
MOV38H,R3;
送秒的个位
MOV39H,R4;
送秒的十位
MOV3AH,#02H;
送分隔符
MOVA,21H;
取分参数
LCALLCF
MOV3BH,R3;
送分的个位
MOV3CH,R4;
送分的十位
MOV3DH,#02H;
MOVA,22H;
取小时参数
MOV3EH,R3;
送小时的个位
MOV3FH,R4;
送小时的十位
MOVA,23H;
取日期参数
MOVA,R3
MOVR3,A
MOV28H,R3
MOV29H,R4
MOVA,25H;
取月参数
ORLA,#01H
MOV2AH,R3
MOV2BH,R4
MOVA,26H;
取年参数
MOV2CH,R3
MOV2DH,R4
MOV2EH,#0FCH;
年的高两位处理
MOV2FH,#0DAH
POP04H
POP03H
POPACC
*************************************************************
将A中的数据拆分成两个独立的BCD码并查表,结果分别存放于R4、R3中
CF:
PUSH02H
PUSHDPH
PUSHDPL
MOVDPTR,#LEDSEG
MOVR2,A
ANLA,#0FH
MOVCA,@A+DPTR
MOVA,R2
SWAPA
MOVR4,A
POPDPL
POPDPH
POP02H
******************************************************************
LEDSEG:
DB0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E4H
DB0FEH,0F6H,0EEH,3EH,9CH,7AH,9EH,8EH
将20H~26H中从PCF8563T中读出的7个字节参数的无关位屏蔽掉
ADJUST:
ANLA,#7FH
MOV20H,A
MOV21H,A
MOVA,22H
ANLA,#3FH
MOV22H,A
MOVA,23H
MOV23H,A
MOVA,24H
ANLA,#07H
MOV24H,A
MOVA,25H
ANLA,#1FH
MOV25H,A
**************************
延时子程序
***************************
DELAY:
MOVR0,#00H
DELAY1:
DJNZR1,$
DJNZR0,DELAY1
INT_7290:
PUSH07H
PUSHPSW
LCALLRDKEY;
读取第一个按键值(功能键)
*************************
修改小时
********************************
AKEY:
CJNEA,#0AH,BKEY;
判断是A键吗?
不是跳转判断是B
JBP3.3,$;
以查询的方式等待下一次按键操作
读取第二个按键值(小时的十位数?
)
ANL14H,#0FH
ORL14H,A;
14H单元中的“十位数”生成
读取第三个按键值(小时的个位数)
ANL14H,#0F0H;
将键值数据处理成小时的个位
ORL14H,A
MOVR7,#01H
MOVR0,#14H
MOVR2,#04H
将修改后的时间参数送PCF8563T
LJMPDOWN
**********************
修改分
BKEY:
CJNEA,#0BH,CKEY
JBP3.3,$
LCALLRDKEY
ANL13H,#0FH
ORL13H,A
ANL13H,#0F0H
MOVR0,#13H
MOVR2,#03H
LCALLWRNBYT
修改秒
CKEY:
CJNEA,#0CH,DOWN
ANL12H,#0FH
ORL12H,A
ANL12H,#0F0H
MOVR0,#12H
MOVR2,#02H
LJMPDOWN
*******************
中断返回退出
DOWN:
CLRIE0
POP07H
读键值子程序(出口参数累加器A,获取到的键值)
RDKEY:
MOVR0,#1FH;
键值缓冲单元
MOVR7,#01H;
取键值数据
MOVR2,#01H;
指向内部数据键值寄存器地址
MOVR3,#WSLA_7290;
取器件写地址
MOVR4,#RSLA_7290;
取器件读地址
读出7290的01H单元中的键值
MOVA,1FH;
取键值送缓冲单元
DECA
向日历芯片中写入时间参数子程序
WR8536:
MOVR7,#07H;
MOVR0,#12H;
************************
相关I2C子程序
带有内部单元地址的多字节写操作子程序WRNBYT
通用的I2C通讯子程序(多字节写操作)
入口参数R7字节数,R0:
源数据块首地址
R0原数据块首地址;
R2从器件内部子地址;
R3:
外围器件地址(写)
相关子程序WRBYT、STOP、CACK、STA
WRNBYT:
PUSHPSW
PUSHACC
WRADD:
MOVA,R3;
取外围器件地地址(包含r/w=0)
LCALLSTA;
发送起始信号S
LCALLWRBYT;
发送外围地址
LCALLCACK;
检测外围器件的应答信号
JBF0,WRADD;
如果应
发送内部寄存器首地址
如果应答不正确返回重来
WRDA:
MOVA,@R0
如果应答不正确返回重来
INCR0
DJNZR7,WRDA
LCALLSTOP
RET
***********************************
带有内部单元地址的多字节读操作子程序RDADD
入口参数R7字节数;
R0目标数据块首地址;
R2从器件内部子地址;
R3器件地址(写);
R4器件地址(读)
相关子程序WRB