大连理工大学本科设计报告题目:基于PCF8563的时钟系统设计课程名称:学院(系):专业:班级:学号:学生姓名:成绩:2014 年7 月10 日题目:基于PCF8563的时钟系统设计1 设计要求实验要求:(1)显示两位小时、两位分钟和两位秒参数,相互之间有分隔符号;(2)按住KEY1可显示四位年、两位月、两位日;(3)具备整点报时功能(模拟广播电台的整点报时从59分55秒开始,每一秒驱动蜂鸣器一次,其中前5次为低频,00秒时为高频驱动);(4)具备键盘修改时间功能。
可修改小时、分钟和秒参数;(5)修改时间时具备“回显”功能,以方便观察;(6)输入时间参数时应具有“自动纠错”功能,以免错误数据的输入;(7)在修改时间参数时具备“参数闪烁”功能,是操作更人性化;2 设计分析及系统方案设计(1)主程序算法描述主程序中定义端口名称、围器件读写地址增强程序的可读性。
设置中断服务程序入口地址,将硬件电路连接与之对应。
INT_RCTDUI对应INT_0中断服务程序,INT_7290对应INT1的中断服务程序。
开始时先对硬件电路进行复位操作。
然后设定PCF8563T的时间和命令参数存放在单片机内部的10H~1DH单元,将其写入到8563的00H~0DH单元。
使总的中断使能端有效,开INT0和INT1中断,使触发极性为下降沿。
等待中断的到来。
(2)INT_RCT中断子程序算法描述调读数据子程序,将读出的8563中02H~08H单元的内容存放于单片机内部20H~26H单元。
判断时、分的数值,当时间在**-59-55至**-59-59时调用低频蜂鸣器BUZZL,当时间为**-00-00时调用高频蜂鸣器BUZZH。
实现整点报时。
调整时间,将20H-26H单元中内容拆分查表后送到28H~2FH (年,月,日)和38H~3FH(时,分,秒)。
使P1.2控制显示内容,当P1.2=1时,显示时,分,秒;当P1.2=0时,显示年,月,日。
(3)蜂鸣器发声子程序(BUZZL和BUZZH)设置初始值使BUZZL发声频率为500HZ,BUZZH发声频率为1500HZ。
(4)键盘修改子程序读入进入中断前的数据,将8563的20H单元内容送入单片机内部12H单元(秒);21H单元内容送入单片机内部13H单元(分);22H单元内容送入单片机内部14H单元(时)便于修改后显示。
读入输入的键值为0AH时,为A键修改小时参数。
设置小时的十位闪烁命令等待按键操作,读入键值判断是否超过三,超过则报警且要求重新输入。
输入正确时回显,设置小时的个位闪烁命令等待按键操作,读入键值判断个位不超过9,然后判断小时整个数是否小于24。
分和秒的设置与小时类似,不同的是十位不能超过5个位不能超过9。
(5)闪烁子程序设置入口闪烁参数单元值3 系统电路图4 外围接口模块硬件电路功能描述5 主程序中主要变量定义6 系统软件中各个子程序的功能描述8 程序清单SDA BIT P1.0SCL BIT P1.1WSLA_8563 EQU 0A2H ;PCF8563T口地址RSLA_8563 EQU 0A3HWSLA_7290 EQU 70H ;ZLG7290B口地址RSLA_7290 EQU 71HORG 8000HLJMP 8040HORG 8003HLJMP INT_RCTORG 8013HLJMP INT_7290ORG 8040HSTART: MOV SP,#60HCLR P1.7 ;ZLG7290复位LCALL DELAYSETB P1.7;**************************************** ;设定pdf8563tde时间和命令参数(参数和控制命令缓冲区10H-1DH);**************************************** MOV 10H,#00H ;启动控制字MOV 11H,#1FH ;设置报警及定时器中断MOV 12H,#50H ;秒单元MOV 13H,#59H ;分单元MOV 14H,#08H ;小时单元MOV 15H,#01H ;日期单元MOV 16H,#01H ;星期单元MOV 17H,#01H ;月单元MOV 18H,#10H ;年单元MOV 19H,#00H ;设定分报警MOV 1AH,#00H ;设定小时报警MOV 1BH,#00H ;设定日报警MOV 1CH,#00H ;设定星期报警MOV 1DH,#83H ;设定CLKOUT的频率,1秒周期方波MOV R7,#0EH ;写入参数个数MOV R0,#10H ;参数与控制命令缓冲区首地址MOV R2,#00H ;从器件内部子地址MOV R3,#WSLA_8563;准备向PCF8563T 写入数据串LCALL WRNBYT ;写入时间,控制命令到PCF8563TSETB EA ;启动总中断SETB EX0 ;启动INT_RCT(INT_0)SETB IT0 ;定时器0下降沿有效SETB EX1 ;启动INT_7290(INT_7290)SETB IT1 ;定时器1下降沿有效SJMP $ ;等待中断;**************************************** ;中断服务子程序INT_RCT;**************************************** INT_RCT:MOV R7,#07H ;数据块字节数MOV R0,#20H ;内部数据块首地址MOV R2,#02H ;内部寄存器首地址MOV R3,#WSLA_8563;向8563写地址MOV R4,#RSLA_8563;从8563读地址LCALL RDADD ;调读数据子程序,将读出的数据存放于单片机20H-26H中MOV A,21H ;判断是否为59分CJNE A,#59H,NEXT1MOV A,20H ;判断是否为55秒CJNE A,#55H,NEXT2LCALL BUZZLSJMP NEXTNEXT2: CJNE A,#56H,NEXT3LCALL BUZZLSJMP NEXTNEXT3: CJNE A,#57H,NEXT4LCALL BUZZLSJMP NEXTNEXT4: CJNE A,#58H,NEXT5LCALL BUZZLSJMP NEXTNEXT5: CJNE A,#59H,NEXTLCALL BUZZLSJMP NEXTNEXT1: CJNE A,#00H,NEXTMOV A,20HCJNE A,#00H,NEXTLCALL BUZZHNEXT: LCALL ADJUST ;调时间调整子程序LCALL CHAIFEN ;调拆分子程序,将20H-26H中的参数分别存28H-2FH,38H-3FH中MOV R7,#08HMOV R2,#10HMOV R3,#WSLA_7290JNB P1.2,YEARS ;使用P1.2控制显示内容MOV R0,#38H ;显示时分秒SJMP DISPYEARS: MOV R0,#28H ;显示年月日DISP: LCALL WRNBYT ;调7290显示子程序JNB P3.2,$RETI;**************************************** ;BUZZ;**************************************** BUZZL: PUSH 07HMOV TMOD,#01H ;方式1MOV TL0,#66H ;低频500HZMOV TH0,#0FCHMOV R7,#50SETB TR0LOOPL: JNB TF0,$CLR TF0MOV TL0,#66HMOV TH0,#0FCHCPL P3.4 ;驱动蜂鸣器DJNZ R7,LOOPLSETB P3.4POP 07HRETBUZZH: PUSH 07HMOV TMOD,#01HMOV TL0,#0CDH ;高频1500HZMOV TH0,#0FEHMOV R7,#100SETB TR0LOOPH: JNB TF0,$CLR TF0MOV TL0,#0CDHMOV TH0,#0FEHCPL P3.4 ;驱动蜂鸣器DJNZ R7,LOOPHSETB P3.4POP 07HRET;**************************************** ;键盘修改中断服务程序INT_7290;**************************************** INT_7290:PUSH 00HPUSH 02HPUSH 03HPUSH 04HPUSH 07HPUSH ACCPUSH PSWMOV R7,#07H ;写入参数个数MOV R0,#20H ;参数和控制命令缓冲区首地址MOV R2,#02H ;从器件内部从地址MOV R3,#WSLA_8563;准备向8563写入数据串MOV R4,#RSLA_8563;准备从8563读取数据串LCALL RDADDMOV 12H,20H ;写入秒单元MOV 13H,21H ;写入分单元MOV 14H,22H ;写入时单元RE: JB P3.3,$ ;以查询方式等待下一次按键LCALL RDKEY ;读取键值CJNE A,#0AH,BKEY;判断是否为A键AKEY: MOV 51H,#80HLCALL FLASHJB P3.3,$LCALL RDKEYCJNE A,#03H,HOUR1;判断键入的数是否满足小时十位的要求HOUR1: JNC ERROR1;若键值大于2,则报错SW AP A;将键值处理成小时数据的十位ANL 14H,#0FHORL 14H,A ;小时数据的十位生成LCALL WR8563 ;写入8563LCALL CF ;拆分,查表,R4(H),R3(L) MOV 3FH,R4 ;回显MOV R7,#01HMOV R0,#3FHMOV R2,#17HMOV R3,#WSLA_7290LCALL WRNBYTLJMP HOUR2ERROR1: LCALL BUZZH;报错,返回重新键入LJMP AKEYHOUR2: MOV 51H,#40HLCALL FLASHJB P3.3,$LCALL RDKEYCJNE A,#0AH,STEP1;判断键值是否满足小时个位的要求(小于10)STEP1:JNC ERROR2ANL 14H,#0F0HORL 14H,AMOV A,14HCJNE A,#24H,JJJ;判断小时的值是否满足要求(小于24)JJJ: JNC ERROR2LCALL WR8563LCALL CF ;拆分,查表,R4(H),R3(L) MOV 3EH,R3 ;回显MOV R7,#01HMOV R0,#3EHMOV R2,#16HMOV R3,#WSLA_7290LCALL WRNBYTMOV 51H,#00H ;停止闪烁LCALL FLASHLJMP DOWNERROR2: LCALL BUZZHLJMP HOUR2BKEY: CJNE A,#0BH,CKEYMOV 51H,#10HLCALL FLASHJB P3.3,$LCALL RDKEYCJNE A,#06H,MIN1MIN1: JNC ERROR3SWAP AANL 13H,#0FHORL 13H,ALCALL WR8563LCALL CF ;拆分,查表,R4(H),R3(L) MOV 3CH,R4 ;回显MOV R7,#01HMOV R0,#3CHMOV R2,#14HMOV R3,#WSLA_7290LCALL WRNBYTLJMP MIN2ERROR3: LCALL BUZZHLJMP BKEYMIN2: MOV 51H,#08HLCALL FLASHJB P3.3,$LCALL RDKEYCJNE A,#0AH,STEP2STEP2: JNC ERROR4ANL 13H,#0F0HORL 13H,ALCALL WR8563LCALL CF ;拆分,查表,R4(H),R3(L) MOV 3BH,R3 ;回显MOV R7,#01HMOV R0,#3BHMOV R2,#13HMOV R3,#WSLA_7290LCALL WRNBYTMOV 51H,#00HLCALL FLASHLJMP DOWNERROR4: LCALL BUZZHLJMP MIN2CKEY: CJNE A,#0CH,ERRORMOV 51H,#02HLCALL FLASHJB P3.3,$LCALL RDKEYCJNE A,#06H,SEC1SEC1: JNC ERROR5SWAP AANL 12H,#0FHORL 12H,ALCALL WR8563LCALL CF ;拆分,查表,R4(H),R3(L) MOV 39H,R4 ;回显MOV R7,#01HMOV R0,#39HMOV R2,#11HMOV R3,#WSLA_7290LCALL WRNBYTLJMP SEC2ERROR5: LCALL BUZZHLJMP CKEYSEC2: MOV 51H,#01HLCALL FLASHJB P3.3,$LCALL RDKEYCJNE A,#0AH,STEP3STEP3: JNC ERROR6ANL 12H,#0F0HORL 12H,ALCALL WR8563LCALL CF ;拆分,查表,R4(H),R3(L) MOV 38H,R3 ;回显MOV R7,#01HMOV R0,#38HMOV R2,#10HMOV R3,#WSLA_7290LCALL WRNBYTMOV 51H,#00HLCALL FLASHLJMP DOWNERROR6: LCALL BUZZHLJMP SEC2ERROR: LCALL BUZZH ;若键入数不为A、B、C中的一个,则报错LCALL DELAYLCALL BUZZLDOWN: CLR IE1CLR IE0POP PSWPOP ACCPOP 07HPOP 04HPOP 03HPOP 02HPOP 00HRETI;**************************************** ;读键值子程序(出口参数累加器A——获取到的键值);**************************************** RDKEY: MOV R0,#1FHMOV R7,#01HMOV R2,#01HMOV R3,#WSLA_7290MOV R4,#RSLA_7290LCALL RDADDMOV A,1FHDEC ARET;**************************************** ;向日历芯片写入时间参数子程序;将RAM的10H-1DH中的时间参数(含控制字)写入芯片的00H-0DH单元;**************************************** WR8563: MOV R7,#0EHMOV R0,#10HMOV R2,#00HMOV R3,#WSLA_8563LCALL WRNBYTRET;**************************************** ;闪烁子程序;**************************************** FLASH: PUSH 00HPUSH 02HPUSH 03HPUSH 07HMOV 50H,#70HMOV R7,#02HMOV R0,#50HMOV R2,#07HMOV R3,#WSLA_7290LCALL WRNBYTPOP 07HPOP 03HPOP 02HPOP 00HRET;**************************************** ;各子程序;**************************************** CHAIFEN:PUSH PSWPUSH ACCPUSH 03HPUSH 04HMOV A,20HLCALL CFMOV 38H,R3MOV 39H,R4MOV 3AH,#02HMOV A,21HLCALL CFMOV 3BH,R3MOV 3CH,R4MOV 3DH,#02HMOV A,22HLCALL CFMOV 3EH,R3MOV 3FH,R4MOV A,23HLCALL CFMOV A,R3ORL A,#01HMOV R3,AMOV 28H,R3MOV 29H,R4MOV A,25HLCALL CFMOV A,R3ORL A,#01HMOV R3,AMOV 2AH,R3MOV 2BH,R4MOV A,26HLCALL CFMOV A,R3ORL A,#01HMOV R3,AMOV 2CH,R3MOV 2DH,R4MOV 2EH,#0FCHMOV 2FH,#0DAHPOP 04HPOP 03HPOP ACCPOP PSWRETCF: PUSH 02HPUSH DPHPUSH DPLMOV DPTR,#LEDSEGMOV R2,AANL A,#0FHMOVC A,@A+DPTRMOV R3,AMOV A,R2SWAP AANL A,#0FHMOVC A,@A+DPTRMOV R4,APOP DPLPOP DPHPOP 02HRETLEDSEG:DB0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E4H DB0FEH,0F6H,0EEH,3EH,9CH,7AH,9EH,8EH;**************************************** ;将20H-26H中从PCF8563T中读出的7个字节参数的无关位屏蔽掉;**************************************** ADJUST: PUSH ACCMOV A,20HANL A,#7FHMOV 20H,AMOV A,21HANL A,#7FHMOV 21H,AMOV A,22HANL A,#3FHMOV 22H,AMOV A,23HANL A,#3FHMOV 23H,AMOV A,24HANL A,#07HMOV 24H,AMOV A,25HANL A,#1FHMOV 25H,APOP ACCRET;****************************************;延时子程序;**************************************** DELAY: PUSH 00HPUSH 01HMOV R0,#00HDELAY1: MOV R1,#01HDJNZ R1,$DJNZ R0,DELAY1POP 01HPOP 00HRET;****************************************;I2C子程序;**************************************** END- 6 -9 系统调试运行结果说明、分析所出现得问题,设计体会与建议硬件环境:DP-51PROC单片机综合仿真实验台,TKSMonitor51仿真器。