1、数字电子时钟实验报告重庆理工大学嵌入式接口技术综合实验报告题目: 数字时钟程序设计 二级学院计算机科学与工程 专 业计算机科学与技术班 级37-3 学生姓名许鸿兴 教 师 时 间 成 绩一、实验名称二、实验目的三、实验设备与环境四、实验基本原理五、实验内容(包括主要算法分析与流程图)六、实验源程序及分析七、实验运行结果及分析八、实验心得体会1、实验名称数字时钟程序设计2、实验目的熟悉单片机数码管、按键等的应用,了解并掌握单片机中断、定时的使用等。三、实验设备与环境微机、AT 89S52单片机、Keil uVision4软件等。4、实验基本原理本实验采用的数码管为共阳极数码管。数码管是一种把多个
2、LED显示段集成在一起的显示设备。有两种类型,一种是共阳型,一种是共阴型。共阳型就是把多个LED显示段的阳极接在一起,又称为公共端。共阴型就是把多个LED显示段的阴极接在一起,即为公共端。阳极即为二极管的正极,又称为正极,阴极即为二极管的负极,又称为负极。通常的数码管又分为8段,即8个LED显示段,这是为工程应用方便如设计的,分别为A、B、C、D、E、F、G、DP,其中DP是小数点位段。而多位数码管,除某一位的公共端会连接在一起,不同位的数码管的相同端也会连接在一起。即,所有的A段都会连在一起,其它的段也是如此,这是实际最常用的用法。数码管显示方法可分为静态显示和动态显示两种。动态显示:所谓动
3、态显示,就是一位一位的轮流点亮各个位,对于显示器的每一位来说,每隔一段时间点亮一次。利用人的视觉暂留功能可以看到整个显示,但必须保证扫描速度足够快,字符才不闪烁。显示器的亮度既与导通电流有关,也于点亮时间与间隔时间的比例有关。调整参数可以实现较高稳定度的显示。动态显示节省了I/O口,降低了能耗。5、实验内容(包括主要算法分析与流程图)整个系统采用AT89S52作为时钟控制芯片,利用单片机内部的定时器计数器来实现的,它的处理过程如下:首先设定单片机内部的一个定时器计数器工作于定时方式,对机器周期计数形成基准时间,然后用另一个定时器计数器或软件计数的方法对基准时间计数形成秒,秒计60次形成分,分计
4、60次形成小时,小时计24次则计满一天,再通过判断平年、闰年,计数相应的月份天数以及年份天数。然后通过数码管把它们的内容在相应位置显示出来即可。数码管显示采用动态显示方法,动态显示方法线路相对简单,但需动态扫描,扫描频率要大于人眼视觉暂留频率,信息看起来才稳定。在具体处理时,定时器计数器采用中断方式工作,对时钟的形成在中断服务程序中实现。在主程序中只需对定时器计数器初始化、调用显示子程序和控制子程序。另外,为了使用方便,设计了简单的按键,可以通过按键实现时间调整和复位。函数Jude_Show();进行时间判断并输出显示。首先使用定时器0方式2进行计时,计时1S后Sec自加,Sec自加至60(6
5、0秒)后Min自加并将Sec置零,Min自加至60(60分)后Hour自加,并将Min置零,Hour自加至24(24小时)Day自加并将Hour清零。此时进行平年闰年的判断,如果年份为闰年,则2月天数为28天,如果为平年,则2月的天数为29天,其余相同。当天数记满相应的一个月后,Month自加,当月数自加至12(12月)后,年份自加。而后刷新显示缓存输出显示。主要流程图如下:1、主流程图:方式二 动态扫描 闹钟判断 2、万年历: 秒=60分=60时=24天=相应月份天数月份=126、实验源程序及分析#includeunsigned int Year=0,Month=0,Day=0,Sec=0,
6、Min=0,Hour=0; /初始显示的时间unsigned int Fir_year=0,Fir_month=0,Fir_day=0,Fir_Sec=0,Fir_Min=0,Fir_Hour=0; /设置闹钟的时间1unsigned int Sec_year=0,Sec_month=0,Sec_day=0,Sec_Sec=0,Sec_Min=0,Sec_Hour=0; /设置闹钟的时间2unsigned int Thi_year=0,Thi_month=0,Thi_day=0,Thi_Sec=0,Thi_Min=0,Thi_Hour=0; /设置闹钟的时间3unsigned int Fou_
7、year=0,Fou_month=0,Fou_day=0,Fou_Sec=0,Fou_Min=0,Fou_Hour=0; /设置闹钟的时间4unsigned int Os=0; /系统时钟unsigned int shift=0xfe,pDG=0; /初始位码以及动态扫描初值unsigned char Dis8; /缓存显示码sbit beep=P37; /蜂鸣器unsigned char code display = 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF;/0-9以及”-”段码void First_Time() /设置初
8、始显示的时间 Year=2016; Month=4; Day=3; Hour=12; Min=23; Sec=35;void Set_Time() Fir_year=2016; /设置闹钟1时间 Fir_month=4; Fir_day=3; Fir_Hour=12; Fir_Min=23; Fir_Sec=40; Sec_year=2016; /设置闹钟2时间 Sec_month=4; Sec_day=3; Sec_Hour=12; Sec_Min=23; Sec_Sec=45; Thi_year=2016; /设置闹钟3时间 Thi_month=4; Thi_day=3; Thi_Hour
9、=12; Thi_Min=23; Thi_Sec=50; Fou_year=2016; /设置闹钟4时间 Fou_month=4; Fou_day=3; Fou_Hour=12; Fou_Min=23; Fou_Sec=55; void Jude_Time() /判断时间是否到闹钟时间 if(Year=Fir_year&Month=Fir_month&Day=Fir_day&Hour=Fir_Hour&Min=Fir_Min&Sec=Fir_Sec) beep=!beep;/蜂鸣器响3秒 else if(Year=Sec_year&Month=Sec_month&Day=Sec_day&Hou
10、r=Sec_Hour&Min=Sec_Min&Sec=Sec_Sec) beep=!beep;/蜂鸣器响3秒 else if(Year=Thi_year&Month=Thi_month&Day=Thi_day&Hour=Thi_Hour&Min=Thi_Min&Sec=Thi_Sec) beep=!beep;/蜂鸣器响3秒 else if(Year=Fou_year&Month=Fou_month&Day=Fou_day&Hour=Fou_Hour&Min=Fou_Min&Sec=Fou_Sec) beep=!beep;/蜂鸣器响3秒 void Jude_Show() /判断显示 Sec+;
11、if(Sec=60) Min+; Sec=0; /秒自加到60自身置零,分+1 if(Min=60) Hour+; Min=0; /分自加到60自身置零,时+1 if(Hour=24) Day+; if(Year%400=0)|(Year%4=0)&(Year%100!= 0)/判断闰年 if(Month=1|Month=3|Month=5|Month=7|Month=8|Month=10|Month=12)/每个有月31天的月份 if(Day=31)/天数增至31,月份加1,Day置零 Month+; Day=0; else if(Month=4|Month=6|Month=9|Month=
12、11)/每个月有30天的月数 if(Day=30)/天数增至30,月份加1,Day置零 Month+; Day=0; else /二月 if(Day=28)/天数增至28,月份加1,Day置零 Month+; Day=0; if(Month=12)/月份增至12,年份自加 Year+; else /平年 if(Month=1|Month=3|Month=5|Month=7|Month=8|Month=10|Month=12)/每个有月31天的月份 if(Day=31)/天数增至31,月份加1,Day置零 Month+; Day=0; else if(Month=4|Month=6|Month=
13、9|Month=11)/每个月有30天的月数 if(Day=30)/天数增至30,月份加1,Day置零 Month+; Day=0; else /二月 if(Day=29)/天数增至29,月份加1,Day置零 Month+; Day=0; if(Month=12)/月份增至12,年份自加 Year+; /刷新显示缓冲区 Dis6=displayHour%10; /时个位显示码 Dis7=displayHour/10; /时十位显示码 Dis3=displayMin%10 ; /分个位显示码 Dis4=displayMin/10; /分十位显示码 Dis0=displaySec%10; /秒个位
14、显示码 Dis1=displaySec/10; /秒十位显示码void Task1ms() P2 = 0xff; /初始关闭显示 P0 = DispDG; /送段码 P2 = shift; /送位码 shift = (shift1)|1; /左移一位,修改位码 pDG+; if(pDG=8) /循环动态扫描 pDG=0; shift = 0xfe; /位码加至8循环至1 void intt()/初始化 TMOD = 0x02; /工作方式2 TH0 = TL0 = 0x1A; /250us定时常数256-(250*11.0592/12)=25.6(D)=1A(H) TR0 = 1; /开启Ti
15、mer0中断 ET0 = 1; /允许Timer0中断 EA = 1; /允许总中断void main(void) P0 = 0xff; /端口初始化 P1 = 0xff; P2 = 0xff; P3 = 0xff; intt(); /初始化 Dis5=Dis2=display10; /显示- Dis0=Dis1=Dis3=Dis4=Dis6=Dis7=display0; /显示0 First_Time(); /设置初始时间Set_Time();/设置闹钟时间 while(1) Jude_Time(); Jude_Show(); void Time0(void) interrupt 1 / Time0中断服务子函数 (负责计时1s) Os+; if(Os=4000) Sec+; Os=0; Task1ms();7、实验运行结果及分析数码管稳定显示以秒为基本单位的时间显示,到达设定的闹钟时间,蜂鸣器响三秒,内部生成万年历。8、实验心得体会通过这次试验设计,我更加熟悉、掌握了一定的有关单片机的程序设计开发,加固了多编写代码的好习惯。
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2