收藏 分销(赏)

单片机综合设计实验.doc

上传人:w****g 文档编号:3068170 上传时间:2024-06-14 格式:DOC 页数:12 大小:93KB 下载积分:8 金币
下载 相关 举报
单片机综合设计实验.doc_第1页
第1页 / 共12页
单片机综合设计实验.doc_第2页
第2页 / 共12页


点击查看更多>>
资源描述
大连理工大学本科设计报告 题目:基于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 系统电路图 AT89C51 P1.0 P1.1 P1.7 /INT0(P3.2) /INT1(P3.3) P3.4 P1.2 ZLG7290B SDA SCL /RST /INT I2C总线 PCF8563T SDA OSCI SCL OSCO CLKOUT VCC 上拉电阻 5K×2 32.768K 8位数码管 BUZZ VCC B5区 8550 10K 保护电阻47欧 103 +5V SW1 4 外围接口模块硬件电路功能描述 ZLG7290B 驱动8个数码管显示时钟时间,管理按键并读取键值,和/INT1相连,引发中断。 PCF8563T 设置时钟时间,控制时间的运行,和/INT0相连,每一秒产生一次中断。 蜂鸣器 整点报时,错误提示 KEY1 控制显示时间或日期 5 主程序中主要变量定义 变量名称 RAM单元/寄存器 功能 WSLA_8563 0A2H PCF8563T写地址 RSLA_8563 0A3H PCF8563T读地址 WSLA_7290 70H ZLG7290B写地址 RSLA_7290 71H ZLG7290B读地址 SS 50H 为闪烁程序传递参数 无 10H-1DH 准备向时钟芯片写入的值 无 07H 写入参数个数 无 00H 参数和控制命令缓冲区首地址 无 02H 从器件内部地址 无 03H 从器件写地址 无 30H 写入闪烁控制字使闪烁速度最快 6 系统软件中各个子程序的功能描述 子程序名称 入口参数 出口参数 功能描述 INT_RCT 无 无 读取时间参数送数码管显示,并在整点时刻报警 BUZZL 无 无 蜂鸣器以500HZ频率发声 BUZZH 无 无 蜂鸣器以1500HZ频率发声 ADJUST 20H-26H单元 20H-26H单元 将20H-26H中从PCF8563中读出的7个参数无关位屏蔽掉 CHAIFEN 20H-26H单元 28H-2FH单元 38H-3FH单元 将20H-26H单元的参数拆分并在查表后送28H-2FH,38H-3FH CF 累加器A R4(H)R3 将A中的数据拆分为两个独立的BCD码并查表结果存于R4 R3 INT_7290 无 无 修改时间、回显、纠错、闪烁 FLASH SS 无 控制闪烁位置 RDKEY 无 累加器A 读键值子程序 WR8563 10H-1DH单元 无 向日历芯片写入时间参数 WRNBYT 无 无 多字节写操作 RDADD 无 无 多字节读操作 8 程序清单 SDA BIT P1.0 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 8040H ORG 8003H LJMP INT_RCT ORG 8013H LJMP INT_7290 ORG 8040H START: MOV SP,#60H CLR P1.7 ;ZLG7290复位 LCALL DELAY SETB 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 ;写入时间,控制命令到PCF8563T SETB 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,NEXT1 MOV A,20H ;判断是否为55秒 CJNE A,#55H,NEXT2 LCALL BUZZL SJMP NEXT NEXT2: CJNE A,#56H,NEXT3 LCALL BUZZL SJMP NEXT NEXT3: CJNE A,#57H,NEXT4 LCALL BUZZL SJMP NEXT NEXT4: CJNE A,#58H,NEXT5 LCALL BUZZL SJMP NEXT NEXT5: CJNE A,#59H,NEXT LCALL BUZZL SJMP NEXT NEXT1: CJNE A,#00H,NEXT MOV A,20H CJNE A,#00H,NEXT LCALL BUZZH NEXT: LCALL ADJUST ;调时间调整子程序 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 ;调7290显示子程序 JNB P3.2,$ RETI ;**************************************** ;BUZZ ;**************************************** BUZZL: PUSH 07H MOV TMOD,#01H ;方式1 MOV TL0,#66H ;低频500HZ MOV TH0,#0FCH MOV R7,#50 SETB TR0 LOOPL: JNB TF0,$ CLR TF0 MOV TL0,#66H MOV TH0,#0FCH CPL P3.4 ;驱动蜂鸣器 DJNZ R7,LOOPL SETB P3.4 POP 07H RET BUZZH: PUSH 07H MOV TMOD,#01H MOV TL0,#0CDH ;高频1500HZ MOV TH0,#0FEH MOV R7,#100 SETB TR0 LOOPH: JNB TF0,$ CLR TF0 MOV TL0,#0CDH MOV TH0,#0FEH CPL P3.4 ;驱动蜂鸣器 DJNZ R7,LOOPH SETB P3.4 POP 07H RET ;**************************************** ;键盘修改中断服务程序INT_7290 ;**************************************** INT_7290:PUSH 00H PUSH 02H PUSH 03H PUSH 04H PUSH 07H PUSH ACC PUSH PSW MOV R7,#07H ;写入参数个数 MOV R0,#20H ;参数和控制命令缓冲区首地址 MOV R2,#02H ;从器件内部从地址 MOV R3,#WSLA_8563;准备向8563写入数据串 MOV R4,#RSLA_8563;准备从8563读取数据串 LCALL RDADD MOV 12H,20H ;写入秒单元 MOV 13H,21H ;写入分单元 MOV 14H,22H ;写入时单元 RE: JB P3.3,$ ;以查询方式等待下一次按键 LCALL RDKEY ;读取键值 CJNE A,#0AH,BKEY;判断是否为A键 AKEY: MOV 51H,#80H LCALL FLASH JB P3.3,$ LCALL RDKEY CJNE A,#03H,HOUR1;判断键入的数是否满足小时十位的要求 HOUR1: JNC ERROR1;若键值大于2,则报错 SWAP A;将键值处理成小时数据的十位 ANL 14H,#0FH ORL 14H,A ;小时数据的十位生成 LCALL WR8563 ;写入8563 LCALL CF ;拆分,查表,R4(H),R3(L) MOV 3FH,R4 ;回显 MOV R7,#01H MOV R0,#3FH MOV R2,#17H MOV R3,#WSLA_7290 LCALL WRNBYT LJMP HOUR2 ERROR1: LCALL BUZZH;报错,返回重新键入 LJMP AKEY HOUR2: MOV 51H,#40H LCALL FLASH JB P3.3,$ LCALL RDKEY CJNE A,#0AH,STEP1;判断键值是否满足小时个位的要求(小于10) STEP1:JNC ERROR2 ANL 14H,#0F0H ORL 14H,A MOV A,14H CJNE A,#24H,JJJ;判断小时的值是否满足要求(小于24) JJJ: JNC ERROR2 LCALL WR8563 LCALL CF ;拆分,查表,R4(H),R3(L) MOV 3EH,R3 ;回显 MOV R7,#01H MOV R0,#3EH MOV R2,#16H MOV R3,#WSLA_7290 LCALL WRNBYT MOV 51H,#00H ;停止闪烁 LCALL FLASH LJMP DOWN ERROR2: LCALL BUZZH LJMP HOUR2 BKEY: CJNE A,#0BH,CKEY MOV 51H,#10H LCALL FLASH JB P3.3,$ LCALL RDKEY CJNE A,#06H,MIN1 MIN1: JNC ERROR3 SWAP A ANL 13H,#0FH ORL 13H,A LCALL WR8563 LCALL CF ;拆分,查表,R4(H),R3(L) MOV 3CH,R4 ;回显 MOV R7,#01H MOV R0,#3CH MOV R2,#14H MOV R3,#WSLA_7290 LCALL WRNBYT LJMP MIN2 ERROR3: LCALL BUZZH LJMP BKEY MIN2: MOV 51H,#08H LCALL FLASH JB P3.3,$ LCALL RDKEY CJNE A,#0AH,STEP2 STEP2: JNC ERROR4 ANL 13H,#0F0H ORL 13H,A LCALL WR8563 LCALL CF ;拆分,查表,R4(H),R3(L) MOV 3BH,R3 ;回显 MOV R7,#01H MOV R0,#3BH MOV R2,#13H MOV R3,#WSLA_7290 LCALL WRNBYT MOV 51H,#00H LCALL FLASH LJMP DOWN ERROR4: LCALL BUZZH LJMP MIN2 CKEY: CJNE A,#0CH,ERROR MOV 51H,#02H LCALL FLASH JB P3.3,$ LCALL RDKEY CJNE A,#06H,SEC1 SEC1: JNC ERROR5 SWAP A ANL 12H,#0FH ORL 12H,A LCALL WR8563 LCALL CF ;拆分,查表,R4(H),R3(L) MOV 39H,R4 ;回显 MOV R7,#01H MOV R0,#39H MOV R2,#11H MOV R3,#WSLA_7290 LCALL WRNBYT LJMP SEC2 ERROR5: LCALL BUZZH LJMP CKEY SEC2: MOV 51H,#01H LCALL FLASH JB P3.3,$ LCALL RDKEY CJNE A,#0AH,STEP3 STEP3: JNC ERROR6 ANL 12H,#0F0H ORL 12H,A LCALL WR8563 LCALL CF ;拆分,查表,R4(H),R3(L) MOV 38H,R3 ;回显 MOV R7,#01H MOV R0,#38H MOV R2,#10H MOV R3,#WSLA_7290 LCALL WRNBYT MOV 51H,#00H LCALL FLASH LJMP DOWN ERROR6: LCALL BUZZH LJMP SEC2 ERROR: LCALL BUZZH ;若键入数不为A、B、C中的一个,则报错 LCALL DELAY LCALL BUZZL DOWN: CLR IE1 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 MOV A,1FH DEC A RET ;**************************************** ;向日历芯片写入时间参数子程序 ;将RAM的10H-1DH中的时间参数(含控制字)写入芯片的00H-0DH单元 ;**************************************** WR8563: MOV R7,#0EH MOV R0,#10H MOV R2,#00H MOV R3,#WSLA_8563 LCALL WRNBYT RET ;**************************************** ;闪烁子程序 ;**************************************** FLASH: PUSH 00H PUSH 02H PUSH 03H PUSH 07H MOV 50H,#70H MOV R7,#02H MOV R0,#50H MOV R2,#07H MOV R3,#WSLA_7290 LCALL WRNBYT POP 07H POP 03H POP 02H POP 00H RET ;**************************************** ;各子程序 ;**************************************** CHAIFEN:PUSH PSW PUSH ACC PUSH 03H PUSH 04H MOV A,20H LCALL CF 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 ORL A,#01H 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 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,#01H DJNZ R1,$ DJNZ R0,DELAY1 POP 01H POP 00H RET ;**************************************** ;I2C子程序 ;**************************************** END 9 系统调试运行结果说明、分析所出现得问题,设计体会与建议 硬件环境:DP-51PROC单片机综合仿真实验台,TKSMonitor51仿真器。 软件环境:PC及Keil软件。 结果说明:可通过8563日历显示芯片将时间显示在数码管上,按KEY1键可显示日期,按A、B、C键可分别改变时、分、秒,按错键时会有警告音提醒并要求重新输入。可进行整点报时。 调试中出现的问题及解决方法: (1)显示两位小时、两位分钟和两位秒参数,相互之间有分隔符号功能:在该环节中,利用书上的参考程序,实现每1s进入一次中断实现读取时间参数,并进行拆分显示等操作。最后能够在数码管上显示出初始设置的时间,当按下key1键时可以显示初始设置的日期。 (2)整点报时功能:设置两个驱动蜂鸣器发声的子程序,一个发声频率为500HZ,另外一个为1500HZ。成功实现了当时间为59分55秒~59分59秒时以500HZ的频率发声,时间为整点时以1500HZ的频率发声 (3)键盘修改时间功能:这部分程序是整个程序的难点,修改的过程为从8563读取数据存入单片机,在单片机内修改后存回8563,并写入7290回显。我参照书上的程序写了A键基本的框架,发现修改完成后需要写入8563才能成功在数码管上显示,还需考虑键入值是否符合要求,比如小时十位不能大于2,小时不能大于24等等, 能成功键入后,我又相继添加了新的功能,比如输入错误时进行错误提醒,并要求重新输入,原本还想加入确认键,尝试了之后发现特别复杂,而且不加确认键也能很好的实现功能,就放弃了。最后一点是修改时响应位闪烁,修改完成后停止闪烁,退出该中断。 (4)回显功能:将值写入7290回显,参考教材上与之前实验的程序,实现起来没有太大问题。 (5)自动纠错功能:自动纠错环节我设置的功能是实现输入错误时间时蜂鸣器报警并要求重新输入。(6)参数闪烁功能:这部分我设置了闪烁子程序,每次调用之前都设置不同的入口参数,实现调整哪一位参数时哪一位的参数的数码闪烁的功能。 6 结论及设计体会 通过本次试验我学会了利用单片机设计时钟日历系统。 参照参考程序,可实现利用8563和7290显示两位小时、两位分钟和两位秒参数,相互之间有分隔符号的功能。我先加入了整点报时功能,在显示子程序中判断时间是否为59-55到00-00,若是,则调用BUZZL或BUZZH。这部分没有太大的难度,但我一开始怎么都运行不了,后来请教老师,老师发现在拆分程序开头我我加了ORG8300H,超出程序范围,修改之后程序立刻就好用了。实现了之后,我开始添加键盘修改时间功能。一开始没有什么思路,一边请教同学,一遍编程序。首先读取键值,判断是否为A、B、C或其他,这是大体方向,接下来具体写A键,首先需要闪烁,然后读取键值,判断是否符合小时十位的要求,若符合,则需处理,这部分可参考示例程序,处理完后需要写入8563,否则修改完后不能显示到数码管上,接着要进行拆分回显、取消闪烁。写完这一段之后,写个位就简单多了,流程大致相同,但是要判断输入个位后小时的大小是否小于24,否则不符合要求。B、C键都类似,差别仅在输入键值后的判断,分、秒的十位都不能大于5,个位都不能大于9。加入闪烁功能也没有太大问题,只要写好7290的闪烁命令字就行了。至此,整个程序大致完成。 本次试验我发现学会调程序非常重要,学会加断点,学会分步调试,很多错误光用看的根本看不出来。比如有时候程序运行不了,分布运行发现到哪一步之后程序就飞了,继续运行不了。比如没有关中断,程序返回不了,需要加断点分布运行,我才能知道哪一步出现了问题。 参考文献 MCS-51单片机应用实验教程,陈育斌著
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服