1、大连理工大学本科设计报告题目:基于7290的LED时钟系统设计 课程名称: 单片机综合设计 学院(系): 电子信息与电气工程学部专 业: 电子信息工程 班 级 电子0804 学 号: 200801204 学生姓名: 宋陆阳 成 绩: 2011 年 05 月 23 日题目:基于7290的LED时钟系统设计1 设计要求1)显示功能:a.用开关K1K2切换用8位数码管显示当前“时-分-秒”;b.用开关K1K2切换用8位数码管显示当前“年-月-分”;c.用开关K1K2切换用8位数码管显示报警“日.时-分”。2)修改功能: a.能够通过按键操作修改当前时、分、秒并显示;b.能够通过按键操作修改报警时、分
2、并显示。3) 错误提示功能:当输入修改值不符合时间合法数值时即时大于24,分大于60,秒大于60,提示Error错误,并返回正常走表。4)报警功能:a.整点报时功能:59分55秒开始每秒响一下,且00秒频率提高;b.定时报警:当当前走表时间与所设置的报警时间一致时,驱动蜂鸣器产生“DO.RA.MI.FA.SO.LA.XI.DUO.”的铃音进行定时报警。2 设计分析及系统方案设计1. 主程序结构:无限循环结构.完成初始化功能:进行7290复位,初始化PCF8563T的时间数据,对中断INT0,INT1进行工作方式设置,开中断,并进入无限循环且等待中断产生.2.中断INT0:顺序结构每秒钟PCF8
3、567的CLKOUT产生一个中断,从PCF8563T中读入数据进行调整拆分送入内存,时钟秒加一并显示,当K1=1,K2=1时,8位数码管显示当前“时-分-秒”;当K1=0时,8位数码管显示当前“年-月-分”;K1=1,K2=0时,8位数码管显示报警“日.时-分”.判断当前时间是否为整点,若是,则从分秒开始每秒钟驱动蜂鸣器每秒响1000HZ铃音0.5秒,秒频率提高;判断当前时间是否与所设置报警时间相同,若满足要求,则驱动蜂鸣器产生一个“DO.RA.MI.FA.SO.LA.XI.DUO.”的铃声。.中断INT1:顺序结构当有按键操作时产生中断。读取键值,当按链介于“AE”选择需修改的内容:A:修改
4、当前时间“时”;B:修改当前时间“秒”;C:修改当前时间“分”;D:修改报警时间“时”;E:修改报警时间“分”,然后等待输入2次按键0-9所修改数据,当输入数据部符合时间格式时,即时大于24,分大于60,秒大于60,显示提示“Error”并返回主程序,当输入数据符合正常时间格式时,回显,并退出中断;若输入其它键则无操作退出中断.3系统电路图ZLG7290BPCF8563T4 外围接口模块硬件电路功能描述P3.2接PC8567的CLKOUT,每秒产生一次中断;P3.3接ZLG7290B,当有按键操作时产生中断;P1.3接蜂鸣器;P1.2接开关K1,选择切换显示当前“时分秒”或“年月日”;P1.4
5、接开关K2,选择切换显示当前时间或报警“日时分”;P1.7接ZLG7290复位键;P1.0接I2C通讯线SDA;P1.1接I2C通讯线SCK。89C51:89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROMFalsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。89C2051是一种带2K字节闪烁可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CP
6、U和闪烁存储器组合在单个芯片中,ATMEL的89C51是一种高效微控制器,89C2051是它的一种精简版本。89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。 ZLG7290B:ZLG7290B是广州周立功单片机发展有限公司自行设计的数码管动态显示驱动、建键盘扫描管理芯片。能够驱动8位共阴极结构的LED数码管或64位独立的LED,同时还能扫描管理多达64个按键(S1-S56、F0-F7)的扫描识别。其中8只健(F0-F7)可以作为功能键使用就像电脑键盘上的Ctrl、Shift、Alt键一样。另外ZLG7290B 内部还设置有连击计数器,能够使某些按键按下后不松手而连续有效。接口采
7、用I2C结构。该芯片为工业级芯片,被广泛运用于仪器仪表等工业测量领域的电路设计中。特点:直接驱动1英寸以下的8位LED共阴极数码管或独立的64位LED ;能够管理多达64只按键。具有自动去抖,其中8只按键可直接作为功能键使用;段电流可达20mA。位电流可达100mA以上;利用外接功率驱动器可以驱动一英寸以上的大型数码管;具有闪烁、段点亮、段熄灭、功能键、连击计数等功能;提供10种数字、21种字母的译码显示功能,也可以将字形码写入显示寄存器直接显示数据;系统仅使用键盘电路时,工作电流为1mA;与主控器之间采用I2C 接口,仅需两条信号线;工作电压范围:+3.3+5.5V;工作温度范围:-40+8
8、5;封装:DIP24(窄体) 或SOP-24.PCF8563T:PCF8563T 是低功耗CMOS实时时钟/日历芯片,它具有一个可编程的时钟输出,一个中断输出和掉电检测电路,与外部主控器之间通过I2C总线连接。最大总线速度为400KHZ。每次对其的读写操作内部的地址寄存器都会自动产生增量。PCF8563T内部具有16个8位的寄存器;一个可自动增量的地址寄存器;一个32.768KHZ的振荡器(具有集成的补偿电容),一个用与为实时时钟RTC提供时钟源的分频器;一个可编程的时钟输出电路;一个定时器;一个报警器;一个掉电检测电路和一个400KHZ的I2C总线接口5 主程序中主要变量定义变量名称RAM单
9、元/寄存器功能当前时间值10H-1DH程序初始时存储初始时间,当运行后存当前时间PC8563时间20H-29H存储从PC8563中读出当前的时间参数当前时间130H-37H存储处理无效位后当前日、月、年信息当前时间238H-3FH存储处理无效位后当前秒、时、分信息报警时间40H-47H存储处理无效位后报警日、时、分信息Data50H-57H存储“Error”的查表信息数据个数R7I2C操作时读入数据个数目标地址R0I2C操作时目标数据块首址器件地址R2I2C操作时器件内部从地址写地址R3I2C写操作时地址读地址R4I2C读操作时地址6系统软件中各个子程序的功能描述子程序名称入口参数出口参数功能
10、 描述INT_RCT无无走表中断子程序,并且判断整点闹铃以及报警INT_7290无无按键中断子程序,修改当前“时分秒”或者报警“时分”可以进行输入错误提示,回显等功能ALARM无无产生0.5秒1000HZ音频ALARM1R5、R6无产生指定频率音频0.5秒CHAFEN20H-2AH30H-47H对20H-2AH数据进行拆分CFAR3、R4把A拆分成独立BCD码ADJUST20H-26H20H-26H屏蔽PCF8563读出无关位DIS_ERR无无LED显示“Error”RDKEY无A读按键值WR8563写8563操作DELAY无无延时子程序7 主程序程序流程图开辟一个数据区10H-1DH存储时间
11、、data-data+7存储显示命令参数等待中断主程序流程图主程序将10H-1DH存储时间、命令参数送PCF8563T中A键?查询按键?按键定义A键:修改小时B键:修改分;C键:修改秒;D键:修改按键时;E键:修改按键分;YYNYINT1读取键值查询按键?N读取键值送小时的位RETINC键?B键?当前分钟处理( 同小时 处理 )当前秒处理 ( 同小时处理 )开中断YN关中断YYN调拆分、查表送28H-2FH 送7290调显示N将51的10H-1DH的数据送PCF8563TD键?报警时处理 ( 同小时处理 )D键?报警时处理 ( 同小时处理 )NYYN数据合法NY读取键值送小时的时位数据合法YN
12、调程序显示Error按键中断INT_7290利用RDADD从PCF8563T中读出时间参数送20H-2AH利用ADJUST屏蔽掉参数中的无用的位中断服务NINTernetINTernet调CHAFEN子程序将时间分别送28H-2FH、38H-3FH缓冲区P1.2=1?RETI显示时分秒显示年月日NY报警时间到整点时间到P1.4=1?显示报警日时分产生报警闹铃产生整点闹铃YYNN终端服务INT0闹铃1000HZ,0.5ms ALARM:程序入口PUSH PSWPUSH 07HT0.T1初始化R710启动T0.T1NTF0=1?YT0初值,TF00驱动BUZZNYTF1=1?T1初值,TF10NR
13、7-1R7 R7=0?Y关闭T0.T1POP 07HPOP PSW8程序清单SDABITP1.0;定义I2C信号引脚SCLBITP1.1 WSLAEQU070HRSLAEQU071HDISDAEQU20H;源数据块首地址DISCONEQU08H;写入数据个数DATA_1EQU50H;变量区首地址WSLA_8563EQU0A2H;PCF8563口地址RSLA_8563EQU0A3HWSLA_7290EQU70H;ZLG7290口地址RSLA_7290EQU71HORG8000HLJMP8100H ORG8003HLJMPINT_RCTORG8100HORG8013HLJMPINT_7290ORG
14、8100HSTART: MOVSP,#60HCLRP1.7 ;7290复位LCALLDELAYSETBP1.7;*;设定PCF8563的时间和命令参数(参数和控制命令缓冲区10H-1DH);*MOV10H,#00H;启动控制字MOV11H,#1FH;设置报警及定时器中断MOV12H,#55H ;秒单元MOV13H,#37H;分单元MOV14H,#10H;小时单元MOV15H,#26H ;日期单元MOV16H,#03H ;星期单元MOV17H,#05H ;月单元 MOV18H,#10H;年单元MOV19H,#36H ;设定分报警MOV1AH,#10H;设定小时报警MOV1BH,#26H ;设定日
15、报警MOV1CH,#03H;设定星期报警MOV1DH,#83H;设定CLKOUT的频率(1S)MOVDATA_1, #13H;变量缓冲区(显示 Error )MOVDATA_1+1,#13H;注意:MOVDATA_1+2,#13H ;变量取值范围0-FMOVDATA_1+3,#11HMOVDATA_1+4,#12HMOVDATA_1+5,#11HMOVDATA_1+6,#11H MOVDATA_1+7,#10H;*MOVR7,#0EH;写入参数个数(时间和控制字) MOVR0,#10H ;参数和控制命令缓冲区首地址MOVR2,#00H;从器件内部从地址MOVR3,#WSLA_8563;准备向P
16、CF8563T写入数据串LCALLWRNBYT;写入时间、控制命令到8563 SETBEAMOVTCON,#00HSETBEX0CLRIT0SETBEX1SETBIT1SJMP$ ;等待中断;*;中断服务INT_RCT子程序;*INT_RCT:MOVR7,#0AH;读出数个数MOVR0,#20H ;目标数据块首址MOVR2,#02H;从器件内部从地址MOVR3,#WSLA_8563MOVR4,#RSLA_8563;准备读PCF8563T的时间参数LCALLRDADD;调读数据子程序,将读出的数据;存放于单片机20-26H中LCALLADJUST;调时间调整子程序MOV12H,20HMOV13H
17、,21HMOV14H,22HMOV19H,27HMOV1AH,28HMOV1BH,29HLCALLCHAFEN ;调拆分子程序(包含查表) MOVA,22H;判断是否到定时时间CJNEA,28H,MMBUYMOVA,21HCJNEA,27H,MMBUYMOVA,#00HCJNEA,20H,MJ_1MOVR5,#21HMOVR6,#0F9HCALLALARM1MJ_1:MOVA,#01HCJNEA,20H,MJ_2MOVR5,#0E0HMOVR6,#0F9HCALLALARM1MJ_2:MOVA,#02HCJNEA,20H,MJ_3MOVR5,#8BHMOVR6,#0FAHCALLALARM1M
18、J_3:MOVA,#03HCJNEA,20H,MJ_4MOVR5,#0D7HMOVR6,#0FAHCALLALARM1MJ_4:MOVA,#04HCJNEA,20H,MJ_5MOVR5,#67HMOVR6,#0FBHCALLALARM1MJ_5:MOVA,#05HCJNEA,20H,MJ_6MOVR5,#0E8HMOVR6,#0FBHCALLALARM1MJ_6:MOVA,#06HCJNEA,20H,MJ_7MOVR5,#5BHMOVR6,#0FCHCALLALARM1MJ_7:MOVA,#07HCJNEA,20H,MMBUYMOVR5,#8EHMOVR6,#0FCHCALLALARM1MMB
19、UY:MOVA,#59H;判断是否整点CJNEA,21H,LCMOVA,#55HCJNEA,20H,LC_1LCALLALARMLC_1:MOVA,#56HCJNEA,20H,LC_2CALLALARMLC_2:MOVA,#57HCJNEA,20H,LC_3CALLALARMLC_3:MOVA,#58HCJNEA,20H,LC_4CALLALARMLC_4:MOVA,#59HCJNEA,20H,LCCALLALARMLC:MOVA,#00HCJNEA,21H,LCCCJNEA,20H,LCCMOVR5,#44HMOVR6,#0FEHCALLALARM1LCC:MOVR7,#08HMOVR2,#
20、10HMOVR3,#WSLA_7290JNBP1.2,YEARS;使用P1.2控制显示内容JNBP1.4,BAOJINMOVR0,#38H;显示小时、分钟和秒SJMPDISPYEARS:MOVR0,#30H ;显示年、月和日期SJMPDISPBAOJIN:MOVR0,#40HDISP:LCALLWRNBYT;调7290显示JNBP3.2,$RETI;*;ALARM;*ALARM:PUSHPSW;产生0.5秒1000HZ音频PUSH07HMOVTMOD,#11HMOVTL0,#33HMOVTH0,#0FEHMOVTL1,#0FCHMOVTH1,#4BHSETBTR0SETBTR1LOOPC:JN
21、BTF0,$MOVTL0,#33HMOVTH0,#0FEHCLRTF0CPLP1.3JBTF1,LOOPCMOVTL1,#0FCHMOVTH1,#4BHCLRTF1DJNZR7,LOOPCCLRTR0CLRTR1POP07HPOPPSWRETALARM1:PUSHPSW;产生指定频率音频0.5秒PUSH07HMOVTMOD,#11HMOVTL0,R5MOVTH0,R6MOVTL1,#0FCHMOVTH1,#4BHSETBTR0SETBTR1LOOPD:JNBTF0,$MOVTL0,R5MOVTH0,R6CLRTF0CPLP1.3JBTF1,LOOPDMOVTL1,#0FCHMOVTH1,#4B
22、HCLRTF1DJNZR7,LOOPDCLRTR0CLRTR1POP07HPOPPSWRET;*;各子程序;* ORG8300H CHAFEN:PUSHPSW ;对20H-2AH单元的参数拆分,PUSHACC;查表后送28H-2FH(年月日) PUSH 03H ;和38H-3FH (时分秒)PUSH04HMOVA,20H;取秒参数LCALLCF ;拆分、查表在R4(H)、R3中MOV38H,R3;送秒的个位MOV39H,R4;送秒的十位MOV3AH,#02H;送分隔符-MOVA,21H;取分参数LCALLCF ;拆分、查表在R4(H)、R3中MOV3BH,R3;送分的个位MOV3CH,R4;送
23、分的十位MOV3DH,#02H;送分隔符-MOVA,22H;取小时参数LCALLCF ;拆分、查表在R4(H)、R3中MOV3EH,R3;送小时的个位MOV3FH,R4;送小时的十位MOVA,23H;取日起参数LCALLCFMOVA,R3ORLA,#01HMOVR3,AMOV30H,R3MOV31H,R4MOVA,25H;取月参数LCALLCFMOVA,R3ORLA,#01HMOVR3,AMOV32H,R3MOV33H,R4MOVA,26H;取年参数LCALLCFMOVA,R3ORLA,#01HMOVR3,AMOV34H,R3MOV35H,R4MOV36H,#0FCH;年的高两位处理MOV37
24、H,#0DAHMOVA,27H;报警分LCALLCFMOV40H,R3MOV41H,R4MOV42H,#02HMOVA,28H;报警时LCALLCFMOV43H,R3MOV44H,R4MOV45H,#01MOVA,29H;报警日LCALLCFMOV46H,R3MOV47H,R4POP04HPOP03HPOPACCPOPPSW;*CF:PUSH02H ;将A中的数据拆分为两个独立的PUSHDPH; BCD码并查表PUSHDPL; 结果分别存于R4、R3中MOVDPTR,#LEDSEGMOVR2,AANLA,#0FHMOVCA,A+DPTRMOVR3,AMOVA,R2SWAPAANLA,#0FHM
25、OVCA,A+DPTRMOVR4,APOPDPLPOPDPHPOP02HRET;*;将20H -26H中从PCF8563中读出的7个字节参数的无关位屏蔽掉(参见表8.7);*ADJUST:PUSHACCMOVA,20H ;处理秒单元ANLA,#7FHMOV20H,AMOVA,21H;处理分单元ANLA,#7FHMOV21H,AMOVA,22H;处理小时单元ANLA,#3FHMOV22H,AMOVA,23H;处理日期单元ANLA,#3FHMOV23H,AMOVA,24H;处理星期单元ANLA,#07HMOV24H,AMOVA,25H;处理月单元ANLA,#1FHMOV25H,APOPACCRET
26、;*;中断服务INT_7290子程序;*INT_7290:PUSH00HPUSH02HPUSH03HPUSH04HPUSH07HPUSHACCPUSHPSWLCALLRDKEY;读取第一个按键值(功能键)CJNEA,#0AH,MINUTE;判断是A键吗?;是A键时开始处理小时数据AKEY_1:JBP3.3,$;以查询的方式等待下一次按键操作LCALLRDKEY;读取第二个按键值(小时的十位数?SWAPA;处理输入的数据(十位)CJNEA,#00H,X_1SJMPXXX_1:CJNEA,#10H,X_2SJMPXXX_2:CJNEA,#20H,X_3SJMPXXX_3:LJMPDIS_ERRXX
27、:ANL14H,#0FHORL14H,AJBP3.3,$;以查询的方式等待下一次按键操作LCALLRDKEY;读取第三个按键值(小时的个位数)CJNEA,#00H,Y_1LJMPYYY_1:CJNEA,#01H,Y_2LJMPYYY_2:CJNEA,#02H,Y_3LJMPYYY_3:CJNEA,#03H,Y_4LJMPYYY_4:CJNEA,#04H,Y_5LJMPYYY_5:LJMPDIS_ERRYY:ANL14H,#0F0H;处理输入的数据(个位)ORL14H,ALCALLWR8563LJMPBACKMINUTE:CJNEA,#0BH,SECOND;判断是B键吗?是B键时开始处理分数据A
28、KEY_2:JBP3.3,$;以查询的方式等待下一次按键操作LCALLRDKEY;读取第二个按键值(分钟的十位数?SWAPA;处理输入的数据(十位)CJNEA,#00H,Z_1SJMPZZZ_1:CJNEA,#10H,Z_2SJMPZZZ_2:CJNEA,#20H,Z_3SJMPZZZ_3:CJNEA,#30H,Z_4SJMPZZZ_4:CJNEA,#40H,Z_5SJMPZZZ_5:CJNEA,#50H,Z_6SJMPZZZ_6:LJMPDIS_ERRZZ:ANL13H,#0FHORL13H,AJBP3.3,$;以查询的方式等待下一次按键操作LCALLRDKEY;读取第三个按键值(分钟的个位
29、数)ANL13H,#0F0H;处理输入的数据(个位)ORL13H,ALCALLWR8563;将修改后的时间参数送PCF8563LJMPBACKSECOND:CJNEA,#0CH,HOUR_1;判断是C键吗?是C键时开始处理秒数据AKEY_3:JBP3.3,$;以查询的方式等待下一次按键操作LCALLRDKEY;读取第二个按键值(秒的十位数?SWAPA;处理输入的数据(十位)CJNEA,#00H,Q_1SJMPQQQ_1:CJNEA,#10H,Q_2SJMPQQQ_2:CJNEA,#20H,Q_3SJMPQQQ_3:CJNEA,#30H,Q_4SJMPQQQ_4:CJNEA,#40H,Q_5SJ
30、MPQQQ_5:CJNEA,#50H,Q_6SJMPQQQ_6:LJMPDIS_ERRQQ:ANL12H,#0FHORL12H,AJBP3.3,$;以查询的方式等待下一次按键操作LCALLRDKEY;读取第三个按键值(秒的个位数)ANL12H,#0F0H;处理输入的数据(个位)ORL12H,ALCALLWR8563;将修改后的时间参数送PCF8563LJMPBACKHOUR_1:CJNEA,#0DH,MIN_1;判断是D键吗?;是D键时开始处理报警小时数据AKEY_4:JBP3.3,$;以查询的方式等待下一次按键操作LCALLRDKEY;读取第二个按键值(小时的十位数?SWAPA;处理输入的数
31、据(十位)CJNEA,#00H,E_1SJMPEEE_1:CJNEA,#10H,E_2SJMPEEE_2:CJNEA,#20H,E_3SJMPEEE_3:LJMPDIS_ERREE:ANL1AH,#0FHORL1AH,AJBP3.3,$;以查询的方式等待下一次按键操作LCALLRDKEY;读取第三个按键值(小时的个位数)CJNEA,#00H,F_1LJMPFFF_1:CJNEA,#01H,F_2LJMPFFF_2:CJNEA,#02H,F_3LJMPFFF_3:CJNEA,#03H,F_4LJMPFFF_4:CJNEA,#04H,F_5LJMPFFF_5:LJMPDIS_ERRFF:ANL1A
32、H,#0F0H;处理输入的数据(个位)ORL1AH,ALCALLWR8563SJMPBACKMIN_1:CJNEA,#0EH,BACK;判断是E键吗?;是E键时开始处理报警分数据AKEY_5:JBP3.3,$;以查询的方式等待下一次按键操作LCALLRDKEY;读取第二个按键值(分钟的十位数?SWAPA;处理输入的数据(十位)CJNEA,#00H,S_1SJMPSSS_1:CJNEA,#10H,S_2SJMPSSS_2:CJNEA,#20H,S_3SJMPSSS_3:CJNEA,#30H,S_4SJMPSSS_4:CJNEA,#40H,S_5SJMPSSS_5:CJNEA,#50H,S_6SJ
33、MPSSS_6:LJMPDIS_ERRSS:ANL19H,#0FHORL19H,AJBP3.3,$;以查询的方式等待下一次按键操作LCALLRDKEY;读取第三个按键值(分钟的个位数)ANL19H,#0F0H;处理输入的数据(个位)ORL19H,ALCALLWR8563;将修改后的时间参数送PCF8563SJMPBACKBACK:CJNEA,#0FH,DOWNDOWN:CLRIE0;清标志POPPSWPOPACCPOP07HPOP04HPOP03HPOP02HPOP00HRETI;*;DISPAY Error;*DIS_ERR:PUSH07HPUSH00HPUSH01HPUSH02HPUSH0
34、3HMOVDPTR,#LEDSEG ;开始对变量查表MOVR7,#DISCON;写入数据个数MOVR0,#DISDA ;源数据块首地址MOVR1,#DATA_1LOOP1:MOVA,R1MOVCA,A+DPTR ;查表得对应的字形码MOVR0,A ;送显示缓冲区INCR1INCR0DJNZR7,LOOP1 MOV28H,#00HLOOP:MOVR7,#DISCONMOVR2,#10HMOVR3,#WSLAMOVR0,#DISDA LCALLWRNBYT;调显示子程序LCALLDELAY LCALLDELAYPOP03HPOP02HPOP01HPOP00HPOP07HSJMPDOWN;*;读键值
35、子程序 (;出口参数累加器A-获取到的键值) ;*RDKEY:MOVR0,#1FH;键值缓冲单元MOVR7,#01H;取一个数据(键值)MOVR2,#01H ;指向内部数据键值寄存器地址MOVR3,#WSLA_7290;取器件地址(写)MOVR4,#RSLA_7290;取器件地址(读) LCALLRDADD;读出7290的01H单元中的键值MOVA,1FH;取健值送缓冲单元DECARET;*;向日历芯片写入时间参数子程序;将RAM的10H-1DH中的时间参数(含控制字)写入芯片的00H-0DH单元;*WR8563:MOVR7,#0EH;写入参数个数(时间和控制字) MOVR0,#10H ;参数和控制命令缓冲区首地址MOVR2,#00H;从器件内部从地址MOVR3,#WSL
©2010-2024 宁波自信网络信息技术有限公司 版权所有
客服电话:4008-655-100 投诉/维权电话:4009-655-100