资源描述
课程设计报告
课程名称: 嵌入式程序基础
实验项目: 电子万年历设计
实验地点: 起点机房
专业班级:通信1002 学号:2010******
学生姓名:
指导教师:
2013年6月22日
太原理工大学信息工程学院
专业班级
通信1002
学生姓名
倪杨
课程名称
嵌入式系统基础
设计名称
电子万年历
设计周数
1.5
指导教师
温景国
设计
任务
主要
设计
参数
设计一个电子万年历,实现日历功能。
主要设计参数:
1. 显示年月日时分秒及星期信息;
2. 日历参数可调整;
3. 自动识别闰年
4. LED显示。
设计内容
设计要求
1.设计I2C接口电路;
2.设计LED显示电路;
3.设计I2C接口驱动程序及显示程序。
要求:仿真调试硬件电路,仿真调试程序
主要参考
资 料
1、 单片机原理与接口技术,李晓林等,电子工业出版社,2011。
2、 微型计算机控制技术,潘新民等,人民邮电出版社,1999。
3、 单片机应用系统设计技术,张齐等,电子林业出版社,2010。
学生提交
归档文件
课程设计说明书1份
课程设计任务书
注: 课程设计完成后,学生提交的归档文件应按,封面—任务书—说明书—图纸的顺序进行装订上交(大张图纸不必装订)
指导教师签名: 日期:
20
目录
一.实验目的 4
二.实验要求 4
三.实验原理 4
四.硬件系统设计 6
五.电路原理图 6
六.电路系统框图 7
七.LED显示数码管 7
八.程序流程图 8
九.设计程序 10
十.设计体会 20
一.实验目的
1、熟悉MCS-51定时/计数器、中断的应用。
2、熟悉时钟时、分、秒计时方法,掌握编程技巧。
3、掌握七段码LED显示器的结构,七段码LED显示器的工作方式和显示程序的编程。
二.设计要求
1.设计I2C接口电路;
2.设计LED显示电路;
3.设计I2C接口驱动程序及显示程序。
设计参数
设计一个电子万年历,实现日历功能。
主要设计参数:
1、 显示年月日时分秒及星期信息;
2、 日历参数可调整;
3、 自动识别闰年
4、 LED显示。
三.设计原理
显示部分设计
基本显示原理:时钟开始显示为0时0分0秒,也就是数码管显示000000,然后每秒秒位加1 ,到9后,10秒位加1,秒位回0。10秒位到5后,即59秒 ,分钟加1,10秒位回0。依次类推,时钟最大的显示值为23小时59分59秒。这里只要确定了1秒的定时时间, 其他位均以此为基准往上累加。 同时时钟达到最大值的时候天数也增加一位,知道显示了7后再变为1,同时阴历和阳历的天数也加1,根据不同的月份显示的天数阳历有28,29,30,31天,阴历就要经过计算得到,到了12个月后,年数自动增加1,以此类推,显示万年历的现实。
万年历优化算法
1.阳历算法
阳历的算法比较简单,每十月的总的天数相对来说是固定的。只有2月份,在闰年是29天,在非闰年是28天。每个月的日历排法.主要是确定每个月第一天是星期几。我们知道1901年1月1日是星期二,星期的变化是7天一个周期,比如说要计算1901年2月1日是星期几,可以这样推算:从1901年1月1日到1901年2月1日总共经过了31天(从表1可 看出),31对7取模是3:i901年1月1日是星期二,加三后,是星期五。因此1901年2月1日是星期五。同理,可以推算出从1901—2100年任何一天是星期几。
表1
月份 1 2 3 4 5 6 7 8 9 10 11 12
闰年 31 29 31 30 31 30 31 31 30 31 30 31
非闰年 31 28 31 30 31 30 31 31 30 31 30 31
2.阴历算法
阴历的算法比较复杂,它包含两个部分。一部分是阳历日和阴历日的对应关系;另一部分则是阳历日和农历节气的对应关系。下面只介绍与设计有关的阴历和阳历的关系。
表2
比特数 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
数据 ! ! ! ! ! 1 ! ! ! 1 ! 1 x x x x
我们先要做一个数据表,这个数据表里面每2个字节,表示T一个阴所年彝个月份的天教 2个字节(共16bit)的具体意义如表2。其中“!(0/1)中“0”表示30天,“1”表示29天。“x x x x(4个比特可表示数值范围0~15)”表示该年中是否有闰月,数值“0”表示无闰月,“ 1~12” 表示某一个闰月。闰月一般是29天;在200年中(1901~2100年),闰月是30天的,可用一个特殊语句来解决。这里2OO年需要200 x 2=400个字节,构成阴历压缩数据表。
有了阴历的数据表后,主要是要确定阳历日和胡历日的对应关系。我们知道阳历年1901年1月1日,对应的阴历年是对应的阴历日,可用以下算法:
(1)从阳历年1901年1月1日到1901年2月1日,计算出经过了31天;
(2)根据阴历数据表知道阴历年1900年11月有29天,因此31—29=2天。原来阳历年1901年1月1日对应的阴历日是11日,则有11+1=13。
(3)因为阴历1901年12月份有30天,而13<=30,所以阳历年1901年2月1日对应的阴历年是1900年12月13日。如果上一步相加得出的散大于当前阴历月的总的天敢,别应该继续减去当前阴历月的总的天数,直到符合条件。 对于月份增加时,还要通过数据表查看是否要经过闰月。对于其他任何一个阳历日和阴历日的对应关系,都可以通过以上算法求得结果。
四.硬件系统设计
本电路是由 AT89C52 单片机为控制核心,具有在线编程功能,低功耗,能在 3V 超低压工 作;时钟电路由 DS1302 提供,它是一种高性能、低功耗、带 RAM 的实时时钟电路,它可以 对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为 2.5V~5.5V。 采用三线接口与 CPU 进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或 RAM 数据。DS1302 内部有一个 31*8 的用于临时性存放数据的 RAM 寄存器。可产生年、月、日、 周日、时、分、秒,具有使用寿命长,精度高和低功耗等特点,同时具有掉电自动保存功能。
五.电路原理图
六.电路系统框图
七.LED显示数码管
常见的LED显示具有清晰明亮的特点。是显示接口也是绝大多数单片机应用系统必备的部件之一。
发光二极管组成的显示器是单片机应用产品中最常用的廉价输出设备。它由若干个发光二极管按一定的规律排列而成。当某一个发光二极管导通时,相应的一个点或一笔画被点亮,控制不同组合的二极管导通,就能显出各种字符。
1. 显示器的结构
常用的7段显示器的结构如图所示,发光二极管的阳极连在一起的称为共阳极显示器,阴极连在一起的成为共阴显示器。1位显示器由8个发光二极管组成,其中7个发光二极管A~g控制7个笔画的亮或暗,另一个控制一个小数点的亮和暗,这种笔画的七段显示器能显示的字符较少,字符的形状有些失真,但失控简单,使用方便。
八.程序流程图
九.设计程序
ORG 0000H
LJMP START
ORG 0003H
LJMP PROINT0 ; int0用来切换时钟调整位置
ORG 0013H ;用来调整时间,只加不减
LJMP PROINT1
ORG 001BH ;5ms的延迟,计数200次则为1秒
LJMP PROTIME
ORG 0030H
;主程序
TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;0 1 2 3 4 5 6 7 8 9
ORG 0050H
START: MOV TCON,#05H ;中断初始化
MOV IE ,#8DH
MOV TMOD,#10H
MOV TH1,#0eCH ;定时器初始化
MOV TL1,#78H
MOV 31H,#0AH ;10秒
MOV 32H,#1EH ;30分
MOV 33H,#09H ;9点
MOV 34H,#0AH ;10号
MOV 35H,#06H ;6月
MOV 36H,#0CH ;2012年
MOV 37H,#14H
;R7 存放切换标志 0 NORMAL , 1 HOUR ,2 MINUTE ,3 SECOND ,4 YEAR,5 MONTH,6 DAY
MOV R1,#00H ;确定在调时不按键的最长时间,10秒后返回normAl状态
MOV R7,#00H ;切换标志
MOV 40H,#00H ;十六进制转换BCD的高位
MOV 41H,#00H ;十六进制转换BCD的低位
MOV R6,#00H ;调时的位闪烁的时间间隔
MOV R4,#00H ;用来计数5ms的中断次数,200次则一秒
MOV R3,#00H
SETB TR1 ;开始计时
AGAIN: ACALL PROSHOW ;显示
AJMP AGAIN
PROSHOW: CJNE R3,#00H,SHOWDATE ;如果r3等于1就显示日期,等于0就显示时钟
CJNE R7,#04H,DATE1 ;显示程序
AJMP SHOWDATE ;showdate显示年月日
DATE1: CJNE R7,#05H,DATE2
AJMP SHOWDATE
DATE2: CJNE R7,#06H,SHOWCLOCK
AJMP SHOWDATE
SHOWCLOCK: MOV R0,33H ;showclock显示时分秒,先显示时
ACALL PROHTOD
CJNE R7,#01H,CLK1
INC R6
CJNE R6,#03H,CLK2 ;若处于调时状态,则该位闪烁
MOV R6 ,#00H
CLK1: CLR P2.4
MOV A,41H
MOV P0, A ;显示时的低位
ACALL DELAY3MS
CLK2: SETB P2.4
CLR P2.5
MOV A,40H
MOV P0,A ;显示时的高位
ACALL DELAY3MS
SETB P2.5
MOV R0,32H ;显示分
ACALL PROHTOD
CJNE R7,#02H,CLK3
INC R6
CJNE R6,#03H,CLK4 ;若处于调时状态,则该位闪
MOV R6,#00H
CLK3: CLR P2.2
MOV A,41H
MOV P0, A ;显示分的低位
ACALL DELAY3MS
CLK4: SETB P2.2
CLR P2.3
MOV A,40H
MOV P0,A ;显示分的高位
ACALL DELAY3MS
SETB P2.3
MOV R0,31H ;显示秒
ACALL PROHTOD
CJNE R7,#03H,CLK5
INC R6
CJNE R6,#03H,CLK6 ;若处于调时状态,则该位闪烁
MOV R6,#00H
CLK5: CLR P2.0
MOV A,41H
MOV P0, A ;显示秒的低位
ACALL DELAY3MS
CLK6: SETB P2.0
CLR P2.1
MOV A,40H
MOV P0,A ;显示秒的高位
ACALL DELAY3MS
SETB P2.1
RET
SHOWDATE: MOV R0,36H ;显示年
ACALL PROHTOD
CJNE R7,#04H,DAY1
INC R6
CJNE R6,#03H,DAY2 ;若处于调时状态,则该位闪烁
MOV R6,#00H
DAY1: CLR P2.4
MOV P0,41H ;显示年的低位
ACALL DELAY3MS
DAY2: SETB P2.4
CLR P2.5
MOV P0,40H ;显示年的高位
ACALL DELAY3MS
SETB P2.5
MOV R0,35H ;显示月
ACALL PROHTOD
CJNE R7,#05H,MONTH1
INC R6
CJNE R6,#03H,MONTH2 ;若处于调时状态,则该位闪烁
MOV R6,#00H
MONTH1: CLR P2.2
MOV P0,41H ;显示月的低位
ACALL DELAY3MS
MONTH2: SETB P2.2
CLR P2.3
MOV P0,40H ;显示月的高位
ACALL DELAY3MS
SETB P2.3
MOV R0,34H ;显示日
ACALL PROHTOD
CJNE R7,#06H,YEAR1
INC R6
CJNE R6,#03H,YEAR2 ;若处于调时状态,则该位闪烁
MOV R6,#00H
YEAR1: CLR P2.0
MOV P0,41H
ACALL DELAY3MS
YEAR2: SETB P2.0
CLR P2.1
MOV P0,40H
ACALL DELAY3MS
SETB P2.1
RET
PROHTOD: PUSH ACC ;十六进制数转换成bcd码,且可以直接输出p0口
MOV A,R0
MOV B,#0AH
DIV AB
MOV DPTR,#0030H
MOVC A,@A+DPTR
MOV 40H,A
MOV A,B
MOVC A,@A+DPTR
MOV 41H,A
POP ACC
RET
DELAY3MS:
DELAY3MS
MOV 45H,#08H
DELAY1: MOV 46H,#0FFH
DELAY2: DJNZ 46H,DELAY2
DJNZ 45H,DELAY1
RET
PROINT0: R EX0 ;切换键中断程序
MOV R3,#00H
ACALL PROSHOW
MOV C,P3.2
JC IEXIT0
MOV R1,#00H
INC R7
CJNE R7,#07H,IEXIT0
MOV R7,#00H
INT01: V C,P3.2
JC INT02
ACALL PROSHOW
AJMP INT01
INT02: ALL PROSHOW
IEXIT0: B EX0
RETI
PROINT1C: X1
ACALL PROSHOW
MOV C,P3.3
JC IEXIT1
LCALL ISYEAR ;判断平年闰年
LCALL ISMONTH ;判断月份,确定最大日数
MOV R1,#00H
CJNE R7,#00H,NEXT1;若不是调时状态,按此键就是切换显示日期、时钟
INC R3
CJNE R3,#02H,IEXIT1
MOV R3,#00H
AJMP IEXIT1
NEXT1: OV R3, #00H
CJNE R7,#03H,NEXT2 ;修改秒位
INC 31H
MOV A,31H
CJNE A,#3CH,INT11 ;遇60变0
MOV 31H,#00H
AJMP IEXIT1
NEXT2: NE R7,#02H,NEXT3 ;修改分位
INC 32H
MOV A,31H
CJNE A,#3CH,INT11 ;遇60变0
MOV 31H,#00H
AJMP IEXIT1
NEXT3: CJNE R7,#01H,NEXT4 ;修改时位
INC 33H
MOV A,33H
CJNE A,#18H,INT11 ;遇24变0
MOV 33H,#00H
AJMP IEXIT1
NEXT4: CJNE R7,#06H,NEXT5 ;修改日
INC 34H
MOV A,34H
CJNE A,49H,INT11 ;到月底就返回月初
MOV 34H,#01H
AJMP IEXIT1
NEXT5: CJNE R7,#05H,NEXT6 ;修改月
INC 35H
MOV A,35H
CJNE A,#0DH,INT11 ;十二月过后就跳回1月
MOV 35H,#01H
AJMP IEXIT1
NEXT6: CJNE R7,#04H,INT11 ;修改年
INC 36H
MOV A,36H
CJNE A,#64H,INT11
MOV 36H,#00H
INT11: MOV C,P3.3
JC INT12
ACALL PROSHOW
AJMP INT11
INT12: ACALL PROSHOW
IEXIT1: SETB EX1
RETI
PROTIME: MOV TMOD,#10H
MOV TH1,#3CH ;定时器初始化
MOV TL1,#60H
SETB TR1
NC R4
CJNE R4,#0c8H,EXIT
MOV R4,#00H ;计满1秒则清零
CJNE R7,#00H,DIAOSHI
AJMP NORMAL
DIAOSHI: INC R1 ;调时不按键的最长时间为10秒,在此期间又键按下重新计时
CJNE R1,#0AH,EXIT
MOV R7,#00H ;到10秒则返回正常显示状态
MOV R1,#00H
AJMP EXIT
NORMAL: ACALL ISYEAR ;判断平闰年,返回标志48H,0为平年,1为闰年
ACALL ISMONTH ;判断哪个月,返回该月的最大日数,存放在49H
NC 31H
MOV A,31H ;秒加一
CJNE A,#3CH,EXIT
MOV 31H,#00H
INC 32H ;分加一
MOV A,32H
CJNE A,#3CH,EXIT
MOV 32H,#00H
INC 33H ;时加一
MOV A,33H
CJNE A,#18H,EXIT
MOV 33H,#00H
INC 34H ;日加一
MOV A,34H
CJNE A,49H,EXIT
MOV 34H,#01H
INC 35H ;月加一
MOV A,35H
CJNE A,#0DH,EXIT
MOV 35H,#01H
INC 36H ;年加一
MOV A,36H
CJNE A,#64H,EXIT
MOV 36H,#00H
EXIT: RETI
ISYEAR: MOV A,36H ;判断平闰年
MOV B,#04H
DIV AB
MOV A,B
CJNE A,#00H,EXITYEAR1
MOV 48H,#01H ;闰年
SJMP EXITYEAR
EXITYEAR1: MOV 48H,#00H ;平年
EXITYEAR: RETI
MOV A,35H ;开始检查月份
CJNE A,#02H,NEXTMON1 ;判断二月
CJNE R2,#00H,RUNNIAN
MOV 49H,#1DH ;平年为28天,赋29给49H
AJMP EXITMONTH
RUNNIAN: MOV 49H,#1EH ;闰年为29天,赋30天给49H
AJMP EXITMONTH
NEXTMON1: CJNE A,#04H,NEXTMON2
AJMP XIAOYUE
NEXTMON2: CJNE A,#06H,NEXTMON3
AJMP XIAOYUE
NEXTMON3: CJNE A,#09H,NEXTMON4
AJMP XIAOYUE
NEXTMON4: CJNE A,#0BH,DAYUE
XIAOYUE: MOV 49H,#1FH ;四,六,九,十一月是小月,30天,但应该赋31天给比较值49H
AJMP EXITMONTH
DAYUE: MOV 49H,#20H ;其他月份为大月,31天,赋32天给49H
EXITMONTH: RETI
END
十.设计体会
本次课程设计,我学会了系统地设计一个具体的工程设计样品;了解了具体的设计过程。他包括前期的设计准备知识、相关电路和器件特性、具体实现算法的设计、相关程序实现、调试等过程。在这个过程中,我知道了查阅相关资料的重要性,也累计了许多电路和逻辑器件的知识。
展开阅读全文