单片机综合设计说明.docx
《单片机综合设计说明.docx》由会员分享,可在线阅读,更多相关《单片机综合设计说明.docx(41页珍藏版)》请在冰豆网上搜索。
单片机综合设计说明
大连理工大学本科设计报告
题目:
基于7290的LED时钟系统设计
课程名称:
单片机综合设计
学院(系):
电子信息与电气工程学部
专业:
电子信息工程
班级电子0804
学号:
200801204
学生姓名:
宋陆阳
成绩:
2011年05月23日
题目:
基于7290的LED时钟系统设计
1设计要求
1)显示功能:
a.用开关K1\K2切换用8位数码管显示当前“时-分-秒”;
b.用开关K1\K2切换用8位数码管显示当前“年-月-分”;
c.用开关K1\K2切换用8位数码管显示报警“日.时-分”。
2)修改功能:
a.能够通过按键操作修改当前时、分、秒并显示;
b.能够通过按键操作修改报警时、分并显示。
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:
顺序结构
每秒钟PCF8567的CLKOUT产生一个中断,从PCF8563T中读入数据进行调整拆分送入内存,时钟秒加一并显示,当K1=1,K2=1时,8位数码管显示当前“时-分-秒”;当K1=0时,8位数码管显示当前“年-月-分”;K1=1,K2=0时,8位数码管显示报警“日.时-分”.
判断当前时间是否为整点,若是,则从59分55秒开始每秒钟驱动蜂鸣器每秒响1000HZ铃音0.5秒,00秒频率提高;
判断当前时间是否与所设置报警时间相同,若满足要求,则驱动蜂鸣器产生一个“DO.RA.MI.FA.SO.LA.XI.DUO.”的铃声。
3.中断INT1:
顺序结构
当有按键操作时产生中断。
读取键值,当按链介于“A—E”选择需修改的内容:
A:
修改当前时间“时”;B:
修改当前时间“秒”;C:
修改当前时间“分”;D:
修改报警时间“时”;E:
修改报警时间“分”,然后等待输入2次按键"0-9"所修改数据,当输入数据部符合时间格式时,即时大于24,分大于60,秒大于60,显示提示“Error”并返回主程序,当输入数据符合正常时间格式时,回显,并退出中断;若输入其它键则无操作退出中断.
3系统电路图
4外围接口模块硬件电路功能描述
P3.2接PC8567的CLKOUT,每秒产生一次中断;
P3.3接ZLG7290B,当有按键操作时产生中断;
P1.3接蜂鸣器;
P1.2接开关K1,选择切换显示当前“时分秒”或“年月日”;
P1.4接开关K2,选择切换显示当前时间或报警“日时分”;
P1.7接ZLG7290复位键;
P1.0接I2C通讯线SDA;
P1.1接I2C通讯线SCK。
89C51:
89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)的低电压,高性能CMOS8位微处理器,俗称单片机。
89C2051是一种带2K字节闪烁可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除100次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的89C51是一种高效微控制器,89C2051是它的一种精简版本。
89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
ZLG7290B:
ZLG7290B是广州周立功单片机发展有限公司自行设计的数码管动态显示驱动、建键盘扫描管理芯片。
能够驱动8位共阴极结构的LED数码管或64位独立的LED,同时还能扫描管理多达64个按键(S1-S56、F0-F7)的扫描识别。
其中8只健(F0-F7)可以作为功能键使用就像电脑键盘上的Ctrl、Shift、Alt键一样。
另外ZLG7290B内部还设置有连击计数器,能够使某些按键按下后不松手而连续有效。
接口采用I2C结构。
该芯片为工业级芯片,被广泛运用于仪器仪表等工业测量领域的电路设计中。
特点:
直接驱动1英寸以下的8位LED共阴极数码管或独立的64位LED;能够管理多达64只按键。
具有自动去抖,其中8只按键可直接作为功能键使用;段电流可达20mA。
位电流可达100mA以上;利用外接功率驱动器可以驱动一英寸以上的大型数码管;具有闪烁、段点亮、段熄灭、功能键、连击计数等功能;提供10种数字、21种字母的译码显示功能,也可以将字形码写入显示寄存器直接显示数据;系统仅使用键盘电路时,工作电流为1mA;与主控器之间采用I2C接口,仅需两条信号线;工作电压范围:
+3.3~+5.5V;工作温度范围:
-40℃~+85℃;封装:
DIP24(窄体)或SOP-24.
PCF8563T:
PCF8563T是低功耗CMOS实时时钟/日历芯片,它具有一个可编程的时钟输出,一个中断输出和掉电检测电路,与外部主控器之间通过I2C总线连接。
最大总线速度为400KHZ。
每次对其的读写操作内部的地址寄存器都会自动产生增量。
PCF8563T内部具有16个8位的寄存器;一个可自动增量的地址寄存器;一个32.768KHZ的振荡器(具有集成的补偿电容),一个用与为实时时钟RTC提供时钟源的分频器;一个可编程的时钟输出电路;一个定时器;一个报警器;一个掉电检测电路和一个400KHZ的I2C总线接口
5主程序中主要变量定义
变量名称
RAM单元/寄存器
功能
当前时间值
10H-1DH
程序初始时存储初始时间,
当运行后存当前时间
PC8563时间
20H-29H
存储从PC8563中读出当前的时间参数
当前时间1
30H-37H
存储处理无效位后当前日、月、年信息
当前时间2
38H-3FH
存储处理无效位后当前秒、时、分信息
报警时间
40H-47H
存储处理无效位后报警日、时、分信息
Data
50H-57H
存储“Error”的查表信息
数据个数
R7
I2C操作时读入数据个数
目标地址
R0
I2C操作时目标数据块首址
器件地址
R2
I2C操作时器件内部从地址
写地址
R3
I2C写操作时地址
读地址
R4
I2C读操作时地址
6系统软件中各个子程序的功能描述
子程序名称
入口参数
出口参数
功能描述
INT_RCT
无
无
走表中断子程序,并且
判断整点闹铃以及报警
INT_7290
无
无
按键中断子程序,
修改当前“时分秒”或者报警“时分”可以进行输入错误提示,回显等功能
ALARM
无
无
产生0.5秒1000HZ音频
ALARM1
R5、R6
无
产生指定频率音频0.5秒
CHAFEN
20H-2AH
30H-47H
对20H-2AH数据进行拆分
CF
A
R3、R4
把A拆分成独立BCD码
ADJUST
20H-26H
20H-26H
屏蔽PCF8563读出无关位
DIS_ERR
无
无
LED显示“Error”
RDKEY
无
A
读按键值
WR8563
写8563操作
DELAY
无
无
延时子程序
7主程序程序流程图
终端服务INT0闹铃1000HZ,0.5msALARM:
POP07H
POPPSW
8程序清单
SDABITP1.0;定义I2C信号引脚
SCLBITP1.1
WSLAEQU070H
RSLAEQU071H
DISDAEQU20H;源数据块首地址
DISCONEQU08H;写入数据个数
DATA_1EQU50H;变量区首地址
WSLA_8563EQU0A2H;PCF8563口地址
RSLA_8563EQU0A3H
WSLA_7290EQU70H;ZLG7290口地址
RSLA_7290EQU71H
ORG8000H
LJMP8100H
ORG8003H
LJMPINT_RCT
ORG8100H
ORG8013H
LJMPINT_7290
ORG8100H
START:
MOVSP,#60H
CLRP1.7;7290复位
LCALLDELAY
SETBP1.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;设定日报警
MOV1CH,#03H;设定星期报警
MOV1DH,#83H;设定CLKOUT的频率(1S)
MOVDATA_1,#13H;变量缓冲区(显示"Error")
MOVDATA_1+1,#13H;注意:
MOVDATA_1+2,#13H;变量取值范围0-F
MOVDATA_1+3,#11H
MOVDATA_1+4,#12H
MOVDATA_1+5,#11H
MOVDATA_1+6,#11H
MOVDATA_1+7,#10H
;************************************************************
MOVR7,#0EH;写入参数个数(时间和控制字)
MOVR0,#10H;参数和控制命令缓冲区首地址
MOVR2,#00H;从器件内部从地址
MOVR3,#WSLA_8563;准备向PCF8563T写入数据串
LCALLWRNBYT;写入时间、控制命令到8563
SETBEA
MOVTCON,#00H
SETBEX0
CLRIT0
SETBEX1
SETBIT1
SJMP$;等待中断
;*************************************************************
;中断服务INT_RCT子程序
;***************************************************************
INT_RCT:
MOVR7,#0AH;读出数个数
MOVR0,#20H;目标数据块首址
MOVR2,#02H;从器件内部从地址
MOVR3,#WSLA_8563
MOVR4,#RSLA_8563;准备读PCF8563T的时间参数
LCALLRDADD;调读数据子程序,将读出的数据
;存放于单片机20-26H中
LCALLADJUST;调时间调整子程序
MOV12H,20H
MOV13H,21H
MOV14H,22H
MOV19H,27H
MOV1AH,28H
MOV1BH,29H
LCALLCHAFEN;调拆分子程序(包含查表)
MOVA,22H;判断是否到定时时间
CJNEA,28H,MMBUY
MOVA,21H
CJNEA,27H,MMBUY
MOVA,#00H
CJNEA,20H,MJ_1
MOVR5,#21H
MOVR6,#0F9H
CALLALARM1
MJ_1:
MOVA,#01H
CJNEA,20H,MJ_2
MOVR5,#0E0H
MOVR6,#0F9H
CALLALARM1
MJ_2:
MOVA,#02H
CJNEA,20H,MJ_3
MOVR5,#8BH
MOVR6,#0FAH
CALLALARM1
MJ_3:
MOVA,#03H
CJNEA,20H,MJ_4
MOVR5,#0D7H
MOVR6,#0FAH
CALLALARM1
MJ_4:
MOVA,#04H
CJNEA,20H,MJ_5
MOVR5,#67H
MOVR6,#0FBH
CALLALARM1
MJ_5:
MOVA,#05H
CJNEA,20H,MJ_6
MOVR5,#0E8H
MOVR6,#0FBH
CALLALARM1
MJ_6:
MOVA,#06H
CJNEA,20H,MJ_7
MOVR5,#5BH
MOVR6,#0FCH
CALLALARM1
MJ_7:
MOVA,#07H
CJNEA,20H,MMBUY
MOVR5,#8EH
MOVR6,#0FCH
CALLALARM1
MMBUY:
MOVA,#59H;判断是否整点
CJNEA,21H,LC
MOVA,#55H
CJNEA,20H,LC_1
LCALLALARM
LC_1:
MOVA,#56H
CJNEA,20H,LC_2
CALLALARM
LC_2:
MOVA,#57H
CJNEA,20H,LC_3
CALLALARM
LC_3:
MOVA,#58H
CJNEA,20H,LC_4
CALLALARM
LC_4:
MOVA,#59H
CJNEA,20H,LC
CALLALARM
LC:
MOVA,#00H
CJNEA,21H,LCC
CJNEA,20H,LCC
MOVR5,#44H
MOVR6,#0FEH
CALLALARM1
LCC:
MOVR7,#08H
MOVR2,#10H
MOVR3,#WSLA_7290
JNBP1.2,YEARS;使用P1.2控制显示内容
JNBP1.4,BAOJIN
MOVR0,#38H;显示小时、分钟和秒
SJMPDISP
YEARS:
MOVR0,#30H;显示年、月和日期
SJMPDISP
BAOJIN:
MOVR0,#40H
DISP:
LCALLWRNBYT;调7290显示
JNBP3.2,$
RETI
;**************************************************************
;ALARM
;**************************************************************
ALARM:
PUSHPSW;产生0.5秒1000HZ音频
PUSH07H
MOVTMOD,#11H
MOVTL0,#33H
MOVTH0,#0FEH
MOVTL1,#0FCH
MOVTH1,#4BH
SETBTR0
SETBTR1
LOOPC:
JNBTF0,$
MOVTL0,#33H
MOVTH0,#0FEH
CLRTF0
CPLP1.3
JBTF1,LOOPC
MOVTL1,#0FCH
MOVTH1,#4BH
CLRTF1
DJNZR7,LOOPC
CLRTR0
CLRTR1
POP07H
POPPSW
RET
ALARM1:
PUSHPSW;产生指定频率音频0.5秒
PUSH07H
MOVTMOD,#11H
MOVTL0,R5
MOVTH0,R6
MOVTL1,#0FCH
MOVTH1,#4BH
SETBTR0
SETBTR1
LOOPD:
JNBTF0,$
MOVTL0,R5
MOVTH0,R6
CLRTF0
CPLP1.3
JBTF1,LOOPD
MOVTL1,#0FCH
MOVTH1,#4BH
CLRTF1
DJNZR7,LOOPD
CLRTR0
CLRTR1
POP07H
POPPSW
RET
;************************************************************
;各子程序
;*************************************************************
ORG8300H
CHAFEN:
PUSHPSW;对20H-2AH单元的参数拆分,
PUSHACC;查表后送28H-2FH(年月日)
PUSH03H;和38H-3FH(时分秒)
PUSH04H
MOVA,20H;取秒参数
LCALLCF;拆分、查表在R4(H)、R3中
MOV38H,R3;送秒的个位
MOV39H,R4;送秒的十位
MOV3AH,#02H;送分隔符-
MOVA,21H;取分参数
LCALLCF;拆分、查表在R4(H)、R3中
MOV3BH,R3;送分的个位
MOV3CH,R4;送分的十位
MOV3DH,#02H;送分隔符-
MOVA,22H;取小时参数
LCALLCF;拆分、查表在R4(H)、R3中
MOV3EH,R3;送小时的个位
MOV3FH,R4;送小时的十位
MOVA,23H;取日起参数
LCALLCF
MOVA,R3
ORLA,#01H
MOVR3,A
MOV30H,R3
MOV31H,R4
MOVA,25H;取月参数
LCALLCF
MOVA,R3
ORLA,#01H
MOVR3,A
MOV32H,R3
MOV33H,R4
MOVA,26H;取年参数
LCALLCF
MOVA,R3
ORLA,#01H
MOVR3,A
MOV34H,R3
MOV35H,R4
MOV36H,#0FCH;年的高两位处理
MOV37H,#0DAH
MOVA,27H;报警分
LCALLCF
MOV40H,R3
MOV41H,R4
MOV42H,#02H
MOVA,28H;报警时
LCALLCF
MOV43H,R3
MOV44H,R4
MOV45H,#01
MOVA,29H;报警日
LCALLCF
MOV46H,R3
MOV47H,R4
POP04H
POP03H
POPACC
POPPSW
;*******************************************************************
CF:
PUSH02H;将A中的数据拆分为两个独立的
PUSHDPH;BCD码并查表
PUSHDPL;结果分别存于R4、R3中
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
;*******************************************************************
;将20H-26H中从PCF8563中读出的7个字节参数的无关位屏蔽掉(参见表8.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
;*************************************************************
;中断服务INT_7290子程序
;***************************************************************
INT_7290:
PUSH00H
PUSH02H
PUSH03H
PUSH04H
PUSH07H
PUSHACC
PUSHPSW
LCALLRDKEY;读取第一个按键值(功能键)
CJNEA,#0AH,MINUTE;判断是A键吗?
;是A键时开始处理小时数据
AKEY_1:
JBP3.3,$;以查询的方式等待下一次按键操作
LCALLRDKEY;读取第二个按键值(小时的十位数?
SWAPA;处理输入的数据(十位)
CJNEA,#00H,X_1
SJMPXX
X_1:
CJNEA,#10H,X_2
SJMPXX
X_2:
CJNEA,#20H,X_3
SJMPXX
X_3:
LJMPDIS_ERR
XX:
ANL14H,#0FH
ORL14H,A
JBP3.