资源描述
大连理工大学单片机综合设计——基于ZLG7290B、PCF8563的时钟系统设计
36
2020年4月19日
文档仅供参考,不当之处,请联系改正。
大连理工大学本科设计报告
题目:基于ZLG7290B、PCF8563的时钟系统设计
课程名称: 单片机原理及应用实验
学院(系):电子信息与电气工程学部
专 业:
班 级:
学 号:
学生姓名:
成 绩:
年 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)算法说明:
l 10H-1DH:向PCF8563T输入的相关参数的数据块;
l 20H-26H:从PCF8563T中读出的时间参数(秒、分、小时、日、星期、月、年)。
经过CHAIFEN子程序将20H-26H中获取时间参数拆分查表后送入下列缓冲区:
l 28H-2FH:年(4单元)、月(2单元)、日(2单元);
l 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
无
带有内部单元地址的多字节读操作子程序
时钟中断服务子程序
利用RDADD从PCF8563T中读出时间参数送20H-27H
利用ADJUST屏蔽掉参数中无用的位
调用PANDUAN子程序判断并进行整点报时
调CHAIFEN子程序将时间分别送28H-2FH、38H-3FH缓冲区
P1.2=1?
显示时分秒
显示年月日
RETI
主程序入口
开辟一数据区10H-1DH存储时间、命令参数
将10H=1D H存储时间命令参数送PCF8563T中
等待中断
7 主程序程序流程图
N
Y
键盘修改时间中断服务子程序
读取键值
A键?
N
B键?
Y N
查询按键?
N WAIT1
C键?
N
Y
分钟处理
(同小时处理)
读取键值,将此值送小时的十位
Y
秒处理
(同小时处理)
查询按键?
WAIT2
N
Y
读取键值,将此值送小时的个位
向日历芯片写入10H-1DH中的时间参数
RETI
8 程序清单
;************************************************************
;由PCF8563提供时间参数并由ZLG7290进行显示
;能够利用键盘实现时间参数的修改,修改过程可加入回显、闪烁、容错等功能
;利用蜂鸣器实现时钟系统整点报时功能
;要求程序中有中断环节
;转换显示:P1.2与KEY1连接,按下KEY1显示年月日,平时显示时分秒
;设定时钟芯片CLKOUT输出秒脉冲且与P3.2连接
;采用中断的方式来显示时间(每秒钟刷新一次显示)
;ZLG7290B芯片的RST_L复位端与P1.7口连接,以便复位操作
;************************************************************
SDA BIT P1.0 ;定义I2C信号引脚
SCL BIT P1.1
WSLA_8563 EQU 0A2H ;PCF8563T口地址
RSLA_8563 EQU 0A3H
WSLA_7290 EQU 70H ;ZLG7290B口地址
RSLA_7290 EQU 71H
ORG 8000H
LJMP 8100H
ORG 8003H
LJMP INT_RCT
ORG 8013H
LJMP INT_7290
ORG 8100H
START: MOV SP,#60H
CLR P1.7 ;ZLG7290B复位
LCALL DELAY
SETB P1.7
;******************************
;设定PCF8563T的时间和命令参数
;******************************
MOV 10H,#00H ;启动控制字
MOV 11H,#1FH ;设置报警及定时器中断
MOV 12H,#50H ;秒单元
MOV 13H,#59H ;分单元
MOV 14H,#10H ;时单元
MOV 15H,#29H ;日期单元
MOV 16H,#03H ;星期单元
MOV 17H,#04H ;月单元
MOV 18H,#15H ;年单元
MOV 19H,#00H ;设定分报警
MOV 1AH,#00H ;设定小时报警
MOV 1BH,#00H ;设定日报警
MOV 1CH,#00H ;设定星期报警
MOV 1DH,#83H ;设定CLKOUT的频率(1S)
;*****************************
MOV R7,#0EH ;写入参数个数(时间和控制字)
MOV R0,#10H ;参数和控制命令缓冲区首地址
MOV R2,#00H ;从器件内部从地址
MOV R3,#WSLA_8563 ;准备向PCF8563T写入数据串
LCALL WRNBYT ;写入时间、控制命令到PCF8563T
MOV IP,02H
SETB EA
SETB EX0
SETB EX1
SETB IT0
SETB IT1
SJMP $ ;等待中断
;******************************
;时钟中断服务子程序
;******************************
INT_RCT:MOV R7,#07H ;读出数个数
MOV R0,#20H ;目标数据块首地址
MOV R2,#02H ;从器件内部首地址
MOV R3,#WSLA_8563
MOV R4,#RSLA_8563 ;准备读PCF8563T的时间参数
LCALL RDADD ;调读数据子程序,将读出的数据存放于单片机20H~26H中
LCALL ADJUST ;调时间调整子程序
LCALL PANDUAN ;调判断键值子程序
LCALL CHAIFEN ;调拆分子程序(包含查表),将20H~26H中的参数分别存于28H~2FH、38H~3FH单元中
MOV R7,#08H
MOV R2,#10H
MOV R3,#WSLA_7290
JNB P1.2,YEARS ;使用P1.2控制显示内容
MOV R0,#38H ;显示小时、分钟和秒
SJMP DISP
YEARS: MOV R0,#28H ;显示年月日
DISP: LCALL WRNBYT ;调ZLG7290B显示
JNB P3.2,$
RETI
;******************************
;整点报时子程序
;******************************
PANDUAN:
MOV A,21H
CJNE A,#59H,PDFEN
MOV A,20H
CJNE A,#56H,PD57
LCALL BAOSHI1
AJMP EXIT
PD57: CJNE A,#57H,PD58
LCALL BAOSHI1
AJMP EXIT
PD58: CJNE A,#58H,PD59
LCALL BAOSHI1
AJMP EXIT
PD59: CJNE A,#59H,EXIT
LCALL BAOSHI1
AJMP EXIT
PDFEN: CJNE A,#00H,EXIT
MOV A,20H
CJNE A,#00H,EXIT
LCALL BAOSHI2
EXIT: RET
;*******************************
;低音1S报时
BAOSHI1:PUSH PSW
PUSH 00H
MOV R0,#0FFH
MOV TMOD,#10H
MOV TL1,#00H
MOV TH1,#0FEH
SETB TR1
WORK1: JNB TF1,$
CLR TF1
MOV TL1,#00H
MOV TH1,#0FEH
CPL P1.4
DJNZ R0,WORK1
POP 00H
POP PSW
RET
;*****************************
;高音1S报时
BAOSHI2:PUSH PSW
PUSH 00H
PUSH 01H
MOV R0,#04H
WORK2: MOV R1,#00H
MOV TMOD,#10H
MOV TL1,#00H
MOV TH1,#0FFH
SETB TR1
WORK3: JNB TF1,$
CLR TF1
MOV TL1,#00H
MOV TH1,#0FFH
CPL P1.4
DJNZ R1,WORK3
DJNZ R0,WORK2
POP 01H
POP 00H
POP PSW
RET
;******************************
;各子程序
;*****************************
ORG 8300H
CHAIFEN:PUSH PSW ;对20H~26H单元的参数拆分并在查表后送28H~2FH(年月日)和38H~3FH(时分秒)
PUSH ACC
PUSH 03H
PUSH 04H
MOV A,20H ;取秒参数
LCALL CF ;拆分、查表在R4、R3中
MOV 38H,R3 ;送秒的个位
MOV 39H,R4 ;送秒的十位
MOV 3AH,#02H ;送分隔符
MOV A,21H ;取分参数
LCALL CF
MOV 3BH,R3 ;送分的个位
MOV 3CH,R4 ;送分的十位
MOV 3DH,#02H ;送分隔符
MOV A,22H ;取小时参数
LCALL CF
MOV 3EH,R3 ;送小时的个位
MOV 3FH,R4 ;送小时的十位
MOV A,23H ;取日期参数
LCALL CF
MOV A,R3
MOV R3,A
MOV 28H,R3
MOV 29H,R4
MOV A,25H ;取月参数
LCALL CF
MOV A,R3
ORL A,#01H
MOV R3,A
MOV 2AH,R3
MOV 2BH,R4
MOV A,26H ;取年参数
LCALL CF
MOV A,R3
ORL A,#01H
MOV R3,A
MOV 2CH,R3
MOV 2DH,R4
MOV 2EH,#0FCH ;年的高两位处理
MOV 2FH,#0DAH
POP 04H
POP 03H
POP ACC
POP PSW
RET
;*************************************************************
;将A中的数据拆分成两个独立的BCD码并查表,结果分别存放于R4、R3中
CF: PUSH 02H
PUSH DPH
PUSH DPL
MOV DPTR,#LEDSEG
MOV R2,A
ANL A,#0FH
MOVC A,@A+DPTR
MOV R3,A
MOV A,R2
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV R4,A
POP DPL
POP DPH
POP 02H
RET
;******************************************************************
LEDSEG: DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E4H
DB 0FEH,0F6H,0EEH,3EH,9CH,7AH,9EH,8EH
;******************************************************************
;将20H~26H中从PCF8563T中读出的7个字节参数的无关位屏蔽掉
;******************************************************************
ADJUST: PUSH ACC
MOV A,20H
ANL A,#7FH
MOV 20H,A
MOV A,21H
ANL A,#7FH
MOV 21H,A
MOV A,22H
ANL A,#3FH
MOV 22H,A
MOV A,23H
ANL A,#3FH
MOV 23H,A
MOV A,24H
ANL A,#07H
MOV 24H,A
MOV A,25H
ANL A,#1FH
MOV 25H,A
POP ACC
RET
;**************************
;延时子程序
;***************************
DELAY: PUSH 00H
PUSH 01H
MOV R0,#00H
DELAY1: MOV R1,#00H
DJNZ R1,$
DJNZ R0,DELAY1
POP 01H
POP 00H
RET
;******************************
;键盘修改时间中断服务子程序
;*******************************
INT_7290:
PUSH 00H
PUSH 02H
PUSH 03H
PUSH 04H
PUSH 07H
PUSH ACC
PUSH PSW
LCALL RDKEY ;读取第一个按键值(功能键)
;*************************
;修改小时
;********************************
AKEY: CJNE A,#0AH,BKEY ;判断是A键吗?不是跳转判断是B
JB P3.3,$ ;以查询的方式等待下一次按键操作
LCALL RDKEY ;读取第二个按键值(小时的十位数?)
SWAP A
ANL 14H,#0FH
ORL 14H,A ;14H单元中的“十位数”生成
JB P3.3,$ ;以查询的方式等待下一次按键操作
LCALL RDKEY ;读取第三个按键值(小时的个位数)
ANL 14H,#0F0H ;将键值数据处理成小时的个位
ORL 14H,A
MOV R7,#01H
MOV R0,#14H
MOV R2,#04H
MOV R3,#WSLA_8563
LCALL WRNBYT ;将修改后的时间参数送PCF8563T
LJMP DOWN
;**********************
;修改分
BKEY: CJNE A,#0BH,CKEY
JB P3.3,$
LCALL RDKEY
SWAP A
ANL 13H,#0FH
ORL 13H,A
JB P3.3,$
LCALL RDKEY
ANL 13H,#0F0H
ORL 13H,A
MOV R7,#01H
MOV R0,#13H
MOV R2,#03H
MOV R3,#WSLA_8563
LCALL WRNBYT
LJMP DOWN
;**********************
;修改秒
CKEY: CJNE A,#0CH,DOWN
JB P3.3,$
LCALL RDKEY
SWAP A
ANL 12H,#0FH
ORL 12H,A
JB P3.3,$
LCALL RDKEY
ANL 12H,#0F0H
ORL 12H,A
MOV R7,#01H
MOV R0,#12H
MOV R2,#02H
MOV R3,#WSLA_8563
LCALL WRNBYT
LJMP DOWN
;*******************
;中断返回退出
DOWN: CLR IE0
POP PSW
POP ACC
POP 07H
POP 04H
POP 03H
POP 02H
POP 00H
RETI
;*************************
;读键值子程序(出口参数累加器A,获取到的键值)
RDKEY: MOV R0,#1FH ;键值缓冲单元
MOV R7,#01H ;取键值数据
MOV R2,#01H ;指向内部数据键值寄存器地址
MOV R3,#WSLA_7290 ;取器件写地址
MOV R4,#RSLA_7290 ;取器件读地址
LCALL RDADD ;读出7290的01H单元中的键值
MOV A,1FH ;取键值送缓冲单元
DEC A
RET
;*************************
;向日历芯片中写入时间参数子程序
WR8536: MOV R7,#07H ;写入参数个数(时间和控制字)
MOV R0,#12H ;参数和控制命令缓冲区首地址
MOV R2,#02H ;从器件内部从地址
MOV R3,#WSLA_8563 ;准备向PCF8563T写入数据串
LCALL WRNBYT ;写入时间、控制命令到PCF8563T
RET
;************************
;相关I2C子程序
;************************
;带有内部单元地址的多字节写操作子程序 WRNBYT
;通用的I2C通讯子程序(多字节写操作)
;入口参数R7字节数,R0:源数据块首地址
;R0原数据块首地址;R2从器件内部子地址;R3:外围器件地址(写)
;相关子程序WRBYT、STOP、CACK、STA
WRNBYT: PUSH PSW
PUSH ACC
WRADD: MOV A,R3 ;取外围器件地地址(包含r/w=0)
LCALL STA ;发送起始信号S
LCALL WRBYT ;发送外围地址
LCALL CACK ;检测外围器件的应答信号
JB F0,WRADD;如果应
MOV A,R2
LCALL WRBYT ;发送内部寄存器首地址
LCALL CACK ;检测外围器件的应答信号
JB F0,WRADD;如果应答不正确返回重来
WRDA: MOV A,@R0
LCALL WRBYT ;发送外围地址
LCALL CACK ;检测外围器件的应答信号
JB F0,WRADD;如果应答不正确返回重来
INC R0
DJNZ R7,WRDA
LCALL STOP
POP ACC
POP PSW
RET
;***********************************
;带有内部单元地址的多字节读操作子程序 RDADD
;入口参数R7字节数;
;R0目标数据块首地址;R2从器件内部子地址;
;R3器件地址(写);R4器件地址(读)
;相关子程序WRBYT、STOP、CACK、STA、MACK、MNACK
RDADD: PUSH PSW ;从PCF8563的02H单元读入7个参数
PUSH ACC ;存放于20H-26H单元
RDADD1: LCALL STA
MOV A,R3 ;取器件地址(写)
LCALL WRBYT ;发送外围地址
LCALL CACK ;检测外围器件的应答信号
JB F0,RDADD1;如果应答不正确返回重来
MOV A,R2 ;取内部地址
LCALL WRBYT ;发送外围地址
LCALL CACK ;检测外围器件的应答信号
JB F0,RDADD1;如果应答不正确返回重来
LCALL STA
MOV A,R4 ;取器件地址(读)
LCALL WRBYT ;发送外围地址
LCALL CACK ;检测外围器件的应答信号
JB F0,RDADD1;如果应答不正确返回重来
RDN: LCALL RDBYT
MOV @R0,A
DJNZ R7,ACK
LCALL MNACK
LCALL STOP
POP ACC
POP PSW
RET
ACK: LCALL MACK
INC R0
SJMP RDN
;*******************************
;启动信号子程序S
STA: SETB SDA ;启动信号S
SETB SCL
NOP ;产生4.7US延时
NOP
NOP
NOP
NOP
CLR SDA
NOP ;产生4.7US延时
NOP
NOP
NOP
NOP
CLR SCL
RET
;**************************************
;停止信号子程序P
STOP: CLR SDA ;停止信号P
SETB SCL
NOP ;产生4.7US延时
NOP
NOP
NOP
NOP
SETB SDA
NOP ;产生4.7US延时
NOP
NOP
NOP
NOP
CLR SCL
CLR SDA
RET
;**********************************
;应答信号子程序 MACK
MACK: CLR SDA ;发送应答信号ACK
SETB SCL
NOP ;产生4.7US延时
NOP
NOP
NOP
NOP
CLR SCL
SETB SDA
RET
;**************************************
;非应答法信号子程序MNACK
MNACK: SETB SDA ;发送非应答信号NACK
SETB SCL
NOP ;产生4.7US延时
NOP
NOP
NOP
NOP
CLR SCL
CLR SDA
RET
;***************************************
;应答检测子程序CACK
CACK: SETB SDA ;应答位检测子程序
SETB SCL
CLR F0
MOV C,SDA ;采样SDA
JNC CEND ;应答正确时转CEND
SETB F0 ;应答错误时F0置一
CEND: CLR SCL
RET
;***************************************
;发送一个字节子程序WRBYT
WRBYT: PUSH 06H
MOV R6,#08H ;发送一个字节子程序
WLP: RLC A ;(入口参数A)
MOV SDA,C
SETB SCL
NOP ;产生4.7US延时
NOP
NOP
NOP
NOP
CLR SCL
DJNZ R6,WLP
POP 06H
RET
;****************************************
;接收一个字节子程序RDBYT
RDBYT: PUSH 06H
MOV R6,#08H ;接收一个字节子程序
RLP: SETB SDA
SETB SCL
NOP ;产生大于15微秒的延时!
NOP ;注意这是专门为ZLG7290
NOP ;添加的20微秒延时部分
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
MOV C,SDA
MOV A,R2
RLC A
MOV R2,A
CLR SCL
DJNZ R6,RLP ;(出口参数R2)
POP 06H
RET
END
9 系统调试运行结果说明、分析所出现得问题,设计体会与建议
系统运行的硬件环境如下:
名称
型号
备 注
计算机系统
单片机综合仿真实验台
仿真器
台式机或便携式电脑均可
DP-51PROC
TKSMonitor 51
具备COM口
软件环境为:KEIL集成调试软件μvirson2,设计语言:汇编语言。
调试运行结果:(1)正常情况下KEY拨至高电平,8位LED显示“时-分-秒”,且每秒跳变一次,时间增加1S;拨至低电平时显示“年.月.日”;(2)当时间为59分56秒蜂鸣器开始整点报时, 前4声低音,最后一声高音;(3)当按下B键,停止计时,再按两次分别输入小时十位和个位,可修改小时;当按下C键,停止计时,再按两次分别输入分的十位和个位,可修改分;当按下D键,停止计时,再按两次分别输入秒的十位和个位,可修改秒;其它按键无反应。
遇到问题及解决方法:(1)整体结构:应设为双中断,且键盘修改时间子程序为高优先级,可使系统反应灵敏;(2)整点报时问题:报时子程序应放在调整后,且需重复调试高低音报警的计时初值;(3)键盘修改时间子程序的结构:先判断修改内容,修改后即中断返回,每次修改一个参数。
10 结论及设计体会
在该实验中,经过独立设计自动报时系统,我对单片机的应用和编程有了很深的理解。单片机技术是一种很实用的技术,入门并不困难,实验我们能够体会到很大乐趣。单片机的硬件实验电路应与程序一致,中断的位置不能连错。在编程过程中会出现很多难题,因此编程时应分成不同模块实现相应功能,多次应用的程序段应设置为子程序,先修改语法错误再修改算法错误。对于算法错误,可换个思路编程,也可请教她人。该实验基本满足了设计要求,但仍存在一些不足,如无键值范围限制,按键不太灵敏等问题,有待改进。总之,这次试验设计让我所获良多,受益终生。
参考文献
陈育斌编著.MCS-51单片机应用实践教程.大连理工大学出版社
刘文涛编著.MCS-51单片机培训教程(C51版).电子工业出版社
展开阅读全文