大连理工大学单片机综合设计基于ZLG7290BPCF8563的时钟系统设计概要.docx
《大连理工大学单片机综合设计基于ZLG7290BPCF8563的时钟系统设计概要.docx》由会员分享,可在线阅读,更多相关《大连理工大学单片机综合设计基于ZLG7290BPCF8563的时钟系统设计概要.docx(30页珍藏版)》请在冰豆网上搜索。
大连理工大学单片机综合设计基于ZLG7290BPCF8563的时钟系统设计概要
大连理工大学本科设计报告
题目:
基于ZLG7290B、PCF8563的时钟系统设计
课程名称:
单片机原理及应用实验
学院(系):
电子信息与电气工程学部
专业:
班级:
学号:
学生姓名:
成绩:
2015年5月4日
《计算机技术实验室安全操作规范》
1.实验前认真阅读安全操作规程,不得擅自触及总电源开关。
2.实验期间学生不准使用与实验无关的电气设备。
3.实验过程中若遇计算机故障时,交由指导老师负责,不允许学生私自开箱维修。
4.在实验过程中,连接实验设备的220v电源时,要保持手部干燥,并注意操作安全,不允许使用金属物件触碰220v电源线及电源插座的带点部位。
5.学生实验期间,在连接导线时不允许实验台带电操作,连接完成后经检查无误时再将实验台上电。
完成实验时先将实验台断电后再进行导线的拆除。
6.实验期间要关闭手机等通讯工具,实验室一律禁止携带饮料、食品、禁止吸烟、喧哗、嬉闹、确保实验室卫生、整洁。
7.学生完成实验后,必须关闭所有实验设备的电源。
8.如果实验过程中发生“突发事件”时,不要慌张、应沉着冷静,采取相关的措施。
必要时拨打校内晋级电话(84708110)或拨打110、120报警。
电工电子实验教学中心
计算机技术实验室
个人签字:
题目:
基于ZLG7290B、PCF8563的时钟系统设计
1设计要求
(1)由PCF8563提供时间参数并由ZLG7290进行显示;
(2)能够利用键盘实现时间参数的修改,修改过程可加入“回显”、“闪烁”、“容错”等功能;
(3)利用蜂鸣器实现时钟系统的“整点报时”功能;
(4)要求程序中有中断环节;
2设计分析及系统方案设计
(1)由PCF8563T实时时钟芯片提供时间数据,由ZLG7290B显示电路控制8位数码管显示当前时间,二者通过I2C总线结构与AT89C51单片机相连,SDA和SCK分别接P1.0和P1.1。
(2)该系统采用双中断结构,时钟输出CLKOUT接INT0,为低优先级,每一秒触发一次中断;键盘中断输出信号INT接INT1,为高优先级,每当有按键时触发中断。
(3)算法说明:
●10H-1DH:
向PCF8563T输入的相关参数的数据块;
●20H-26H:
从PCF8563T中读出的时间参数(秒、分、小时、日、星期、月、年)。
通过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
20-25H
屏蔽各时间参数无关位
INT_7290
无
无
键盘修改时间中断服务子程序
RDKEY
无
A
读键值子程序
WR8563
R7、R0、R2、R3
无
向日历芯片写时间参数
WRNBYT
R7、R0、R2、R3
无
带有内部单元地址的多字节写操作子程序
RDADD
R7、R0、R2、R3、R4
无
带有内部单元地址的多字节读操作子程序
7主程序程序流程图
N
Y
N
YN
NWAIT1
N
Y
Y
WAIT2
N
Y
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:
LCALLWRNBYT;调ZLG7290B显示
JNBP3.2,$
RETI
;******************************
;整点报时子程序
;******************************
PANDUAN:
MOVA,21H
CJNEA,#59H,PDFEN
MOVA,20H
CJNEA,#56H,PD57
LCALLBAOSHI1
AJMPEXIT
PD57:
CJNEA,#57H,PD58
LCALLBAOSHI1
AJMPEXIT
PD58:
CJNEA,#58H,PD59
LCALLBAOSHI1
AJMPEXIT
PD59:
CJNEA,#59H,EXIT
LCALLBAOSHI1
AJMPEXIT
PDFEN:
CJNEA,#00H,EXIT
MOVA,20H
CJNEA,#00H,EXIT
LCALLBAOSHI2
EXIT:
RET
;*******************************
;低音1S报时
BAOSHI1:
PUSHPSW
PUSH00H
MOVR0,#0FFH
MOVTMOD,#10H
MOVTL1,#00H
MOVTH1,#0FEH
SETBTR1
WORK1:
JNBTF1,$
CLRTF1
MOVTL1,#00H
MOVTH1,#0FEH
CPLP1.4
DJNZR0,WORK1
POP00H
POPPSW
RET
;*****************************
;高音1S报时
BAOSHI2:
PUSHPSW
PUSH00H
PUSH01H
MOVR0,#04H
WORK2:
MOVR1,#00H
MOVTMOD,#10H
MOVTL1,#00H
MOVTH1,#0FFH
SETBTR1
WORK3:
JNBTF1,$
CLRTF1
MOVTL1,#00H
MOVTH1,#0FFH
CPLP1.4
DJNZR1,WORK3
DJNZR0,WORK2
POP01H
POP00H
POPPSW
RET
;******************************
;各子程序
;*****************************
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;取小时参数
LCALLCF
MOV3EH,R3;送小时的个位
MOV3FH,R4;送小时的十位
MOVA,23H;取日期参数
LCALLCF
MOVA,R3
MOVR3,A
MOV28H,R3
MOV29H,R4
MOVA,25H;取月参数
LCALLCF
MOVA,R3
ORLA,#01H
MOVR3,A
MOV2AH,R3
MOV2BH,R4
MOVA,26H;取年参数
LCALLCF
MOVA,R3
ORLA,#01H
MOVR3,A
MOV2CH,R3
MOV2DH,R4
MOV2EH,#0FCH;年的高两位处理
MOV2FH,#0DAH
POP04H
POP03H
POPACC
POPPSW
RET
;*************************************************************
;将A中的数据拆分成两个独立的BCD码并查表,结果分别存放于R4、R3中
CF:
PUSH02H
PUSHDPH
PUSHDPL
MOVDPTR,#LEDSEG
MOVR2,A
ANLA,#0FH
MOVCA,@A+DPTR
MOVR3,A
MOVA,R2
SWAPA
ANLA,#0FH
MOVCA,@A+DPTR
MOVR4,A
POPDPL
POPDPH
POP02H
RET
;******************************************************************
LEDSEG:
DB0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E4H
DB0FEH,0F6H,0EEH,3EH,9CH,7AH,9EH,8EH
;******************************************************************
;将20H~26H中从PCF8563T中读出的7个字节参数的无关位屏蔽掉
;******************************************************************
ADJUST:
PUSHACC
MOVA,20H
ANLA,#7FH
MOV20H,A
MOVA,21H
ANLA,#7FH
MOV21H,A
MOVA,22H
ANLA,#3FH
MOV22H,A
MOVA,23H
ANLA,#3FH
MOV23H,A
MOVA,24H
ANLA,#07H
MOV24H,A
MOVA,25H
ANLA,#1FH
MOV25H,A
POPACC
RET
;**************************
;延时子程序
;***************************
DELAY:
PUSH00H
PUSH01H
MOVR0,#00H
DELAY1:
MOVR1,#00H
DJNZR1,$
DJNZR0,DELAY1
POP01H
POP00H
RET
;******************************
;键盘修改时间中断服务子程序
;*******************************
INT_7290:
PUSH00H
PUSH02H
PUSH03H
PUSH04H
PUSH07H
PUSHACC
PUSHPSW
LCALLRDKEY;读取第一个按键值(功能键)
;*************************
;修改小时
;********************************
AKEY:
CJNEA,#0AH,BKEY;判断是A键吗?
不是跳转判断是B
JBP3.3,$;以查询的方式等待下一次按键操作
LCALLRDKEY;读取第二个按键值(小时的十位数?
)
SWAPA
ANL14H,#0FH
ORL14H,A;14H单元中的“十位数”生成
JBP3.3,$;以查询的方式等待下一次按键操作
LCALLRDKEY;读取第三个按键值(小时的个位数)
ANL14H,#0F0H;将键值数据处理成小时的个位
ORL14H,A
MOVR7,#01H
MOVR0,#14H
MOVR2,#04H
MOVR3,#WSLA_8563
LCALLWRNBYT;将修改后的时间参数送PCF8563T
LJMPDOWN
;**********************
;修改分
BKEY:
CJNEA,#0BH,CKEY
JBP3.3,$
LCALLRDKEY
SWAPA
ANL13H,#0FH
ORL13H,A
JBP3.3,$
LCALLRDKEY
ANL13H,#0F0H
ORL13H,A
MOVR7,#01H
MOVR0,#13H
MOVR2,#03H
MOVR3,#WSLA_8563
LCALLWRNBYT
LJMPDOWN
;**********************
;修改秒
CKEY:
CJNEA,#0CH,DOWN
JBP3.3,$
LCALLRDKEY
SWAPA
ANL12H,#0FH
ORL12H,A
JBP3.3,$
LCALLRDKEY
ANL12H,#0F0H
ORL12H,A
MOVR7,#01H
MOVR0,#12H
MOVR2,#02H
MOVR3,#WSLA_8563
LCALLWRNBYT
LJMPDOWN
;*******************
;中断返回退出
DOWN:
CLRIE0
POPPSW
POPACC
POP07H
POP04H
POP03H
POP02H
POP00H
RETI
;*************************
;读键值子程序(出口参数累加器A,获取到的键值)
RDKEY:
MOVR0,#1FH;键值缓冲单元
MOVR7,#01H;取键值数据
MOVR2,#01H;指向内部数据键值寄存器地址
MOVR3,#WSLA_7290;取器件写地址
MOVR4,#RSLA_7290;取器件读地址
LCALLRDADD;读出7290的01H单元中的键值
MOVA,1FH;取键值送缓冲单元
DECA
RET
;*************************
;向日历芯片中写入时间参数子程序
WR8536:
MOVR7,#07H;写入参数个数(时间和控制字)
MOVR0,#12H;参数和控制命令缓冲区首地址
MOVR2,#02H;从器件内部从地址
MOVR3,#WSLA_8563;准备向PCF8563T写入数据串
LCALLWRNBYT;写入时间、控制命令到PCF8563T
RET
;************************
;相关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;如果应
MOVA,R2
LCALLWRBYT;发送内部寄存器首地址
LCALLCACK;检测外围器件的应答信号
JBF0,WRADD;如果应答不正确返回重来
WRDA:
MOVA,@R0
LCALLWRBYT;发送外围地址
LCALLCACK;检测外围器件的应答信号
JBF0,WRADD;如果应答不正确返回重来
INCR0
DJNZR7,WRDA
LCALLSTOP
POPACC
POPPSW
RET
;***********************************
;带有内部单元地址的多字节读操作子程序RDADD
;入口参数R7字节数;
;R0目标数据块首地址;R2从器件内部子地址;
;R3器件地址(写);R4器件地址(读)
;相关子程序WRBYT、STOP、CACK、STA、MACK、MNACK
RDADD:
P