基于单片机多功能电子万年历的设计.docx
《基于单片机多功能电子万年历的设计.docx》由会员分享,可在线阅读,更多相关《基于单片机多功能电子万年历的设计.docx(43页珍藏版)》请在冰豆网上搜索。
基于单片机多功能电子万年历的设计
(封面)
XXXXXXX学院
基于单片机的多功能万年历设计报告
题目:
院(系):
专业班级:
学生姓名:
指导老师:
时间:
年月日
一.绪言……………………………………………………………3
二.系统总体方案设计……………….………………………………3
三.硬件系统设计:
…………………….……………………….4
四.系统软件设计………………….……………………………5
五.设计总结……………………………………………………8
六.参考文献……………………………………………………8
七.附录………………………………………………………….9
一.绪论
随着电子技术的迅速发展,特别是随大规模集成电路出现,给人类生活带来了根本性的改变。
由其是单片机技术的应用产品已经走进了千家万户。
电子万年历的出现给人们的生活带来的诸多方便。
本文首先描述系统硬件工作原理,并附以系统结构框图加以说明,着重介绍了本系统所应用的各硬件接口技术和各个接口模块的功能及工作过程,其次,详细阐述了程序的各个模块和实现过程。
万年历是采用数字电路实现对.时,分,秒.数字显示的计时装置,广泛用于个人家庭,车站,码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。
诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,但是所有这些,都是以钟表数字化为基础的。
因此,研究万年历及扩大其应用,有着非常现实的意义。
本系统采用了以广泛使用的单片机技术为核心,软硬件结合,使硬件部分大为简化,提高了系统稳定性,并采用LED显示电路、键盘电路,使人机交互简便易行。
二.系统总体方案设计
1.系统设计硬件框图
振荡电路
按键调节
DS1302
AT89C51
LED显示频
2.实现的基本原理
在本实验中,我引用了DS1302的时,分,秒功能,当时计数字24时通过74LS164给模块年月日进位,当日模块对应其相应月份进行向月进位时,就给月进位,当月满12时,给年进位。
三.硬件系统设计
1.元器件介绍
名称
图形
功能
DS1302
可以对年、月、日、周日、时、分、秒进行计时,且具有闰年补偿等多种功能
74LS164
74LS164是一个串行输入并行输出的移位寄存器,并带有清除端。
其中;Q0—Q7并行输出端。
A,B串行输入端。
MR清除端,为0时,输出清零。
CP时钟输入端。
AT89C51
at89c51单片机是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含4Kbytes的可反复擦写的Flash只读程序存储器和128bytes的随机数据存储器(RAM),器件采用ATMEL公司的高密度,非易失性存储技术生产,兼容标准MCS-51指令系统。
功能强大的at89c51单片机可为您提供许多高性价比的应用场合,可灵活应用于各种控制领域。
2.硬件原理图
四.系统软件设计
仿真过程
1、打开PROTEUS软件,并出画单片机电子万年历具体运行电路图。
3、检查所画电路运行图,确保没有错误以后,加载源程序。
4、加载完成后,单击电路图框下的开始按钮,进行仿真,观察LED数码管现实情况,此时LED数码管开始显示数字。
调节开关进行时间的调节。
当秒的显示间隔快与或慢与实际间隔时,调节石英晶体震荡器的频率参数,从而使秒的间隔达到标准。
然后检查电路其它问题,并对其的各参数进行调整,使之正确。
仿真结果
通过对源程序的编译,改正了其中的很多错误,然后运行,保证源程序的正确性。
然后按原理图选择正确合理的电器元件,画出正确的电路图,加载源程序运行,顺利实现了单片机数字电子钟的“小时”、“分钟”、“秒”的显示。
1主程序流程图设计
开始
设置串行口工作方式
设置计数器工作方式
给计数器1,0赋初值
调用1302写操作
启动定时计数器0
定时时间到?
读年月日时分秒
把要显示的数据送到缓冲区
调用显示子程序
结束
N
调用定时中断
Y
2显示模块流程图
基本显示模块设计的重点是由显示代码取得相应的段码、显示段码数据的串行发送,程序流程如图1-11所示。
其中时个位的段码必须加上小数点,即带小数点显示时个位,目的是以小数点符代替时间分割符“-”。
软件秒脉冲发生器其实质是利用了定时器0的定时溢出中断,将它设定为100ms溢出中断,则10次中断的时间正好为1s。
将时间参数设计为100ms的原因有两个:
1)根据系统时钟主频为6M的特点,16位定时器最大定时时间为65536×2M(M为机器周期,这里是2μS),即131ms,取整数100便于计次数;
2)如取的太短,如10ms,则定时器频繁中断,干扰系统正常运行效果。
有了秒脉冲发生器,10次中断为1s,秒指示灯闪亮1次,秒变量单元加1,60后分变量单元加1,如果为60分则时变量单元加1。
任何一个变量的变化,则显示刷新一次(更新)。
上述思想的实现均集成在定时器0的中断子程序中。
该设计显示模块流程图如图
将16进制时分数据转化为BCD显示代码
关显示以免显示抖动
通过串口将时十位段码送入对应的LS164
将时个位段码送入对应的LS164
将分十位和个位段码送入各自对应LS164
打开显示
运行结果
主要参考资料:
[1]林志琦.基于Proteus的单片机可视化软硬件仿真[M].北京:
北京航空航天大学出版社,2006.9
[2]周润景,张丽娜.基于PROTEUS的电路及单片机系统设计与仿真[M].北京:
北京航空航天大学出版社,2006.5
[3]张靖武,周灵彬.单片机系统的PROTEUS设计与仿真[M].北京:
电子工业出版社,2007.4
[4]周润景,张丽娜.PROTEUS入门实用教程[M].北京:
机械工业出版社,2007.9
[5]戴俊峰.嵌入式系统大屏幕LED点阵显示器[J].现代电子技术,2004,27(19):
68-89,72.
[6]冯寿鹏.基于嵌入式系统的LED信息显示技术研究[J].现代电子技术,2005
(1):
15-47.
[7]楼然苗,李光飞.51系列单片机设计实例[M].北京:
北京航空航天大学出版社,2003.3
附录:
;*****************************
;*万年历程序*
;*****************************
;67H(高两位年)66H(低两位年)65H(月)64H(星期)
;63H(日)62H(小时)61H(分)60H(秒)57H(农历月)56H(农历日)
;显示缓冲单元CH~7BH(4CH~4BH)年低位,AH~79H(4AH~49H)月,
;78H(48H)星期,H~76H(47H~46H)日,H~74H(45H~44H)时,
;73H72H(43H~42H)分,H~70H(41H~40H)秒,EH~5DH(55H~54H)农历年
;5CH~5BH(53H~52H)农历月,AH~59H(51H~50H)农历日
;闰年标志为F0,定时器T1为调整时候闪烁用
;LCALLGETWEEK
;MOV78H,WEEk
SCLKBITP3.2
IOBITP3.3
RSTBITP3.4
TIME_YEARDATA66H
TIME_MONTHDATA65H
WEEKDATA64H
TIME_DAYDATA63H
HOURDATA62H
MINTUEDATA61H
SECONDDATA60H
DS1302_ADDRDATA32H
DS1302_DATADATA31H
start_yearEQU01;定义查询表起始年份,01--199表示1901-2099年
week_byte1DATA3AH
WEEK_BYTE2DATA3BH
WEEK_BYTE3DATA3CH
WEEK_BYTE4DATA3DH
WEEK_BYTE5DATA3EH
CONvert_yearDATA6dh
CONvert_monthDATA6eh;BIT7为1表示闰月
CONvert_dateDATA6fh
temp_Byte1DATA68h
temp_Byte2DATA69h
temp_Byte3DATA6Ah
temp_Byte4DATA6Bh
temp_Byte5DATA6Ch
;RSEQUP3.0
;RWEQUP3.1
;EEQUP3.5
ORG0000H
AJMPSTART
ORG0003H
RETI
ORG000BH
LJMPINTT2
ORG001BH
LJMPINTT1
ORG30H
;************************************
;*主程序*
;************************************
start:
movR1,#254h;清RAM128单元
movr0,#2
mova,#0
clear:
mov@r0,a
incr0
djnzr1,clear
movr0,A
MOVR1,A
MOVR7,#10;计数器初始计数值
SETBEA;打开总中断
;MOVT2CON,#0
;MOVT2MOD,#0
;MOVTH2,#0
;MOVTL2,#0
;SETBTR2
MOVSCON,#00H;串行输出,方式
MOVTMOD,#11H;计数器,方式;计数器,方式
MOVTL1,#00H;计数器初值65.5MS中断一次
MOVTH1,#00H
MOVTH0,#3CH;计数器50MS中断一次
MOVTL0,#0B0H
CLRP0.6
MOVDS1302_ADDR,#8EH
MOVDS1302_DATA,#00H;允许协
LCALLWRITE
MOVDS1302_ADDR,#90H
MOVDS1302_DATA,#0A6H;1302充电,充电电流.1mA
lcallwrite
SETBET0;打开秒闪定时器
SETBTR0
main1:
MOVDS1302_ADDR,#8DH;READOUTYEAR
LCALLREAD
MOVTIME_YEAR,DS1302_DATA
MOVDS1302_ADDR,#8BH;READOUTWEEK
LCALLREAD
MOVWEEK,DS1302_DATA
MOVDS1302_ADDR,#89H;READOUTMONTH
LCALLREAD
MOVTIME_MONTH,DS1302_DATA
MOVDS1302_ADDR,#87H;READOUTDAY
LCALLREAD
MOVTIME_DAY,DS1302_DATA
MOVDS1302_ADDR,#85H;READOUTHOUR
LCALLREAD
MOVHOUR,DS1302_DATA
MOVDS1302_ADDR,#83H;READOUTMINTUE
LCALLREAD
MOVMINTUE,DS1302_DATA
MOVDS1302_ADDR,#81H;READOUTSECOND
LCALLREAD
MOVSECOND,DS1302_DATA
MOVR0,TIME_YEAR;年分离,送显示缓存
LCALLDIVIDE
MOV7BH,R1
MOV4BH,R1
MOV7CH,R2
MOV4CH,R2
MOV78H,WEEK
MOV48H,WEEK
MOVR0,TIME_MONTH;月分离,送显示缓存
LCALLDIVIDE
MOV79H,R1
MOV49H,R1
MOV7AH,R2
MOV4AH,R2
MOVR0,TIME_DAY;日分离,送显示缓存
LCALLDIVIDE
MOV76H,R1
MOV46H,R1
MOV77H,R2
MOV47H,R2
MOVR0,HOUR;小时分离,送显示缓存
LCALLDIVIDE
MOV74H,R1
MOV44H,R1
MOV75H,R2
MOV45H,R2
MOVR0,MINTUE;分分离,送显示缓存
LCALLDIVIDE
MOV72H,R1
MOV42H,R1
MOV73H,R2
MOV43H,R2
MOVR0,SECOND;秒分离,送显示缓存
LCALLDIVIDE
MOV70H,R1
MOV40H,R1
MOV71H,R2
MOV41H,R2
LCALLGENGXIN;更新农历程序
MOVR0,CONVERT_MONTH;农历月分离,送显示缓存
LCALLDIVIDE
MOV5BH,R1
MOV52H,R1
MOV5CH,R2
MOV53H,R2
MOVR0,CONVERT_DATE
LCALLDIVIDE
MOV59H,R1
MOV50H,R1
MOV5AH,R2
MOV51H,R2
LCALLGETWEEK
MOV78H,WEEK
LCALLDISPLAY
GOON:
JNBP1.1,SETGG;调整日历
;JNBP1.4,QIDONG;启动秒钟指示灯
;LCALLQIDONG
AAA:
JNBF0,SSS
CLRP1.0;闰月,则p1.0清,指示灯亮
LJMPMAIN1
SSS:
SETBP1.0;非闰月,则p1.0置位,指示灯灭
LJMPMAIN1
SETGG:
LJMPSETG
QIDONG:
LCALLDISPLAY;秒钟指示灯开启/关闭
;JNBP1.4,QIDONG
;LCALLQIDONG
CPL30H;30
JB30H,ON
CLRTR0
CLRET0
AJMPQDOUT
ON:
SETBTR0
SETBET0
QDOUT:
AJMPAAA
;*****************************
;*秒灯闪烁程序*
;*****************************
INTT2:
PUSHACC;累加器入栈保护
PUSHPSW;状态字入栈保护
CLRET0;关T0中断允许
CLRTR0;关闭定时器T0
MOVA,#0B7H;中断响应时间同步修正
ADDA,TL0;低位初值修正
MOVTL0,A;重装初值(低位修正值)
MOVA,#3CH;高位初值修正
ADDCA,TH0;
MOVTH0,A;重装初值(高位修正值)
SETBTR0;开启定时器T0
CLRPSW.4
DJNZR7,INTT2OUT
MOVR7,#10
CPL20H
JB20H,S1
SETBP0.7;秒指示灯闪烁
AJMPINTT2OUT
S1:
CLRP0.7
INTT2OUT:
POPPSW;出栈
POPACC
SETBET0
RETI
;*********************************
;*写程序*
;*********************************
WRITE:
CLRSCLK
NOP
SETBRST
NOP
MOVA,DS1302_ADDR
MOVR4,#8
WRITE1:
RRCA;送地址给
NOP
NOP
CLRSCLK
NOP
NOP
NOP
MOVIO,C
SETBSCLK;送入地址在时钟上升沿有效
NOP
NOP
NOP
NOP
DJNZR4,WRITE1
CLRSCLK
NOP
MOVA,DS1302_DATA
MOVR4,#8
WRITE2:
RRCA
NOP;送数据给,时钟上升沿,数据输入
CLRSCLK
NOP
NOP
MOVIO,C
NOP
NOP
NOP
SETBSCLK
NOP
NOP
DJNZR4,WRITE2
CLRRST
RET
;*******************************
;*读程序*
;*******************************
READ:
CLRSCLK
NOP
NOP
SETBRST
NOP
MOVA,DS1302_ADDR
MOVR4,#8
READ1:
RRCA
NOP
MOVIO,C
NOP
NOP
NOP
SETBSCLK;送入地址在时钟上升沿有效
NOP
NOP
NOP
;CLRSCLK
CLRSCLK
NOP
NOP
DJNZR4,READ1
MOVR4,#8
READ2:
CLRSCLK
NOP
NOP
NOP
MOVC,IO
NOP
NOP
NOP
NOP
NOP;从ds1302中读取数据,时钟下降沿有效
RRCA
NOP
NOP
NOP
NOP
SETBSCLK
NOP
DJNZR4,READ2
MOVDS1302_DATA,A
CLRRST
RET
;*******************************
;*公历设置程序*
;*******************************
SETG:
CLRTR0
CLRET0
SETBTR1
SETBET1
CLR08H
CLR09H
CLR0AH
CLR0BH
CLR0CH
CLR0DH
CLR0EH
CLR0FH
MOVDS1302_ADDR,#8EH
MOVDS1302_DATA,#00H;允许写
LCALLWRITE
MOVDS1302_ADDR,#80H
MOVDS1302_DATA,#80H;1302停止振荡
LCALLWRITE
GWAIT:
LCALLDISPLAY
JNBP1.1,GWAIT
SETG1:
LCALLDISPLAY
JNBP1.1,SETGMON
JNBP1.3,GADDYEAR
JNBP1.4,GDECYEAR
JNBF0,SSSYEAR
CLRP1.0;闰月,则p1.1清,指示灯亮
LJMPSETG1
SSSYEAR:
SETBP1.0
AJMPSETG1
SETGMON:
AJMPSETG2
GADDYEAR:
MOVR7,66H;年加
LCALLADD1
MOV66H,A
GADDYEAR1:
LCALLGETWEEK;年加同时换算出星期
LCALLYMD;转换农历月日
MOVDS1302_ADDR,#8CH;年值送
MOVDS1302_DATA,66H
LCALLWRITE
MOVDS1302_ADDR,#8AH;星期值送
MOVDS1302_DATA,64H
LCALLWRITE
MOVR0,66H
LCALLDIVIDE;年分离送显示缓冲
MOV4BH,R1
MOV7BH,R1
MOV4CH,R2
MOV7CH,R2
MOVR0,64H
LCALLDIVIDE;星期分离送显示缓冲
MOV48H,week
MOV78H,week
WAIT1:
LCALLDISPLAY
JNBP1.3,WAIT1
AJMPSETG1
GDECYEAR:
MOVR7,66H;年减
LCALLDEC1
MOV66H,A
LCALLGETWEEK;年减同时换算出星期
LCALLYMD;转换农历月日
MOVDS1302_ADDR,#8CH;年值送
MOVDS1302_DATA,66H
LCALLWRITE
MOVDS1302_ADDR,#8AH;星期值送
MOVDS1302_DATA,64H
LCALLWRITE
MOVR0,66H
LCALLDIVIDE;年分离送显示缓冲
MOV4BH,R1
MOV7BH,R1
MOV4CH,R2
MOV7CH,R2
MOVR0,64H
LCALLDIVIDE;星期分离送显示缓冲
MOV48H,week
MOV78H,week
WAIT2:
LCALLDISPLAY
JNBP1.4,WAIT2
AJMPSETG1
SETG2:
SETB0AH;调月时闪标志
GWAIT3:
LCALLDISPLAY
JNBP1.1,GWAIT3
SETG3:
LCALLDISPLAY
JNBP1.1,SETGDAY
JNBP1.3,GADDMONTH
JNBP1.4,GDECMONTH
JNBP1.2,JUMPYEAR
JNBF0,SSSMONTH
CLRP1.0;闰月,则p1.1清,指示灯亮
LJMPSETG3
SSSMONTH:
SETBP1.0
AJMPSETG3
JUMPYEAR:
LCALLDISPLAY
CLR0AH
JNBP1.2,JUMPYEAR
AJMPSETG1
SETGDAY:
AJMPSETG4
GADDMONTH:
MOVR7,65H;月加
LCALLADD1
MOV65H,A
CJNEA,#13H,GADDMONTH1
MOV65H,#01H
GADDMONTH1:
LCALLGETWEEK;月加同时换算出星期
LCALLYMD;转换农历月日
MOVDS1302_ADDR,#88H;月值送
MOVDS1302_DATA,65H