单片机课程设计实验报告电子时钟_第1页
单片机课程设计实验报告电子时钟_第2页
单片机课程设计实验报告电子时钟_第3页
单片机课程设计实验报告电子时钟_第4页
单片机课程设计实验报告电子时钟_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、单片机课程设计实验报告电子时钟姓名: 学号:08212013班级:自动化0801指导老师: 电子时钟一、 实验目的学习8051定时器时间计时处理、按键扫描及led数码管显示的设计方法。二、 设计任务及要求利用实验平台上4个led数码管, 设计带有闹铃功能的数字时钟,要求:1. 在4位数码管上显示当前时间。显示格式“时时分分”2. 由led闪动做秒显示。3. 利用按键可对时间及闹玲进行设置,并可显示闹玲时间。当闹玲时间到蜂鸣器发出声响,按停止键使可使闹玲声停止。4. 拓展:使数字时钟的闹铃为音乐。(电子音调发生器)三、 硬件设计1. 显示模块为了将时间在led数码管上显示,可采用静态显示法和动态

2、显示法,由于静态显示法需要数据锁存器等较多硬件,可采用动态显示法实现led显示。方法是将所有位的段选线相应并联,由一个8位i/o口控制,从而形成段选线的多路复用,同时各位的公共端分别由相应的i/o线控制,实现分时选通。硬件电路图如下,图中10k电阻起到限流作用;三极管起到驱动数码管的作用。若不使用三极管,数码管发光微弱。2. 闹铃模块闹铃声由交流蜂鸣器产生,电路图如下。当p1.7输出不同频率的方波,.蜂鸣器便会发出不同的声音。3. 整体硬件电路图四、 软件设计1. 计时模块利用单片机定时器0完成计时功能。定时器0计时中断程序每隔1ms中断一次并当作一个计数,每中断一次计数加1,当计数1000次

3、时,则表示1s到了,秒变量加1。当秒变量达到60时,秒变量清零同时分变量加1。分变量达到60时,分变量清零同时时变量加1。当时变量达到24时,时变量清零。由于实验要求由led闪动做秒显示,因此每隔0.5s即计数500次时,p11(驱动led灯)取反一次,从而实现led灯闪动一次为1s,秒变量加1。该模块流程图如下:2. 显示模块为在各位led上分别显示不同的字符,需要采用循环扫描显示的方法,即在某一时刻只选通一条位选线,并输出该位的字段码,其余位则处于关闭状态。可见,各位led显示的字符并不是同时出现的,但由于人眼的视觉暂留及led的余辉,可以达到同时显示的效果。程序流程图如下:采用动态显示时

4、,需要确定led各位显示的保持时间。由于led从导通到发光有延时,时间太短会造成发光微弱,显示不清晰;如果显示时间太长,则会占用较多的cpu时间。3. 按键判断及处理程序按键的闭合与否,反映在电压上就是呈现出高电平或低电平。由于机械触点的弹性作用,在闭合及断开的瞬间,电压信号伴随有一定时间的抖动,抖动时间与按键的机械特性有关,一般是510ms。为了保证cpu确认一次按键动作,既不重复也不遗漏,必须消除抖动的影响。通过软件消除抖动的方法为:在程序执行过程中检测到有按键按下时,调用一段延时(约10ms)子程序,然后判断该按键的电平是否仍然保持在闭合状态,如果是,则确认有键按下。按键判断流程图如下:

5、按键处理流程图如下:4. 音乐响铃模块音乐闹铃程序:单片机演奏一个音符,是通过引脚,周期性的输出一个特定频率的方波。这就需要单片机,在半个周期内输出低电平、另外半个周期输出高电平,周而复始。众所周知,周期为频率的倒数,可以通过音符的频率计算出周期;演奏时,要根据音符的不同,把对应的半个周期的定时时间初始值,送入定时器,再由定时器按时输出高低电平。另外,音乐的节拍是由延时实现的。我所使用的单片机音乐演奏程序中,包括了两个数据表,其中存放了事先算好的各种音符频率所对应的半周期的定时时间初始值。有了这些数据,单片机就可以演奏低音、中音、高音,三个八度共21个音符。演奏乐曲时,就根据音符的不同数值,从

6、表中找到定时时间初始值,送入定时器即可控制音调。通过调用延迟来实现节拍数。乐曲的数据,也要写个数据表:表中每三个数字,说明了一个音符,它们分别代表:第一个数字是音符的数值;第二个数字是123之一,代表低音、中音、高音;第三个数字是时间长度,以半拍为单位。乐曲数据表的结尾是三个0。音节与频率的关系如下表所示音调x音调x音调x低音1f921中音1fc8f高音1fe47低音2f9e1中音2fcee高音2fe77低音3fa8c中音3fd44高音3fea2低音4fad8中音4fd6b高音4feb6低音5fb68中音5fdb4高音5feda低音6fbe9中音6fdf4高音6fefa低音7fc5b中音7fe

7、2d高音7ff16程序流程图如下:5. 主函数流程图五、 程序清单#include #define uchar unsigned char#define uint unsigned intuchar code segcode=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;/共阳数码管09uchar code select=0x0e,0x0d,0x0b,0x07;/正常显示时数码管位选uchar code select1=0x0f,0x0d,0x0b,0x07;/高两位屏蔽时的位选(第2位只显示dp)uchar code select2=0x

8、0e,0x0d,0x0f,0x0f;/低两位屏蔽时的位选uchar buffer=0,0,0,0;/用来存放时间uint hour,min,sec;uint alarmhour,alarmmin;uint status=0;/模式值sbit music=p10;/闹铃sbit led=p11;/秒驱动led闪烁bit ringoff=1;/闹铃停止uint count=0;/定时器计数uchar keyinput;uchar buf=0xff;/用来存放按键值uchar timer1h,timer1l,time;/time为节拍(延迟时间),timer1l、timer1h为计数器1初值ucha

9、r code freqh=0xf9,0xf9,0xfa,0xfa,0xfb,0xfb,0xfc, /低音17 第一个八度 0xfc,0xfc,0xfd,0xfd,0xfd,0xfd,0xfe,/中音 17 第二个八度 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff;/高音 17 第三个八度uchar code freql = 0x21,0xe1,0x8c,0xd8,0x68,0xe9,0x5b, /低音1234567 0x8f,0xee,0x44,0x6b,0xb4,0xf4,0x2d, /中音 1234567 0x47,0x77,0xa2,0xb6,0xda,0xfa,

10、0x16; /高音 1234567/*uchar code song=3,2,2,3,2,2,4,2,2,5,2,2,5,2,2,4,2,2,3,2,2,2,2,2,1,2,2,1,2,2,2,2,2,3,2,2,3,2,3,2,2,1,2,2,4,3,2,2,3,2,2,4,2,2,5,2,2,5,2,2,4,2,2,3,2,2,2,2,2,1,2,2,1,2,2,2,2,2,3,2,2,2,2,3,1,2,1,1,2,4,2,2,2,2,2,2,3,2,2,1,2,2,2,2,2,3,2,1,4,2,1,3,2,2,1,2,2,2,2,2,3,2,1,4,2,1,3,2,2,2,2,2,1

11、,2,2,2,2,2,5,1,2,3,2,2,3,2,2,3,2,2,4,2,2,5,2,2,5,2,2,4,2,2,3,2,2,4,2,1,2,2,1,1,2,2,1,2,2,2,2,2,3,2,2,2,2,3,1,2,1,1,2,4,2,2,2,2,2,2,3,2,2,1,2,2,2,2,2,3,2,1,4,2,1,3,2,2,1,2,2,2,2,2,3,2,1,4,2,1,3,2,2,2,2,2,1,2,2,2,2,2,5,1,2,3,2,2,3,2,2,3,2,2,4,2,2,5,2,2,5,2,2,4,2,2,3,2,2,4,2,1,2,2,1,1,2,2,1,2,2,2,2,2,3

12、,2,2,2,2,3,1,2,1,1,2,4,0,0,0; /欢乐颂 */uchar code song=5,3,2,3,3,1,4,3,1,5,3,2,3,3,1,4,3,1,5,3,1,5,2,1,6,2,1,7,2,1,1,3,1,2,3,1,3,3,1,4,3,1,3,3,2,1,3,1,2,3,1,3,3,2,3,2,1,4,2,1,5,2,1,6,2,1,5,2,1,4,2,1,5,2,1,3,2,1,4,2,1,5,2,1,4,2,2,6,2,1,5,2,1,4,2,2,3,2,1,2,2,1,3,2,1,2,2,1,1,2,1,2,2,1,3,2,1,4,2,1,5,2,1,6

13、,2,1,4,2,2,6,2,1,5,2,1,6,2,2,7,2,1,1,3,1,5,2,1,6,2,1,7,2,1,1,3,1,2,3,1,3,3,1,4,3,1,5,3,1,3,3,2,1,3,1,2,3,1,3,3,2,2,3,1,1,3,1,2,3,1,7,2,1,1,3,1,2,3,1,3,3,1,2,3,1,1,3,1,7,2,1,1,3,2,6,2,1,7,2,1,1,3,2,1,2,1,2,2,1,3,2,1,4,2,1,3,2,1,2,2,1,3,2,1,1,3,1,7,2,1,1,3,1,6,2,2,1,3,2,7,2,1,6,2,2,5,2,1,4,2,1,5,2,1,4

14、,2,1,3,2,1,4,2,1,5,2,1,6,2,1,7,2,1,1,2,1,6,2,2,1,3,1,7,2,1,1,3,2,7,2,1,6,2,1,7,2,1,1,3,1,2,3,1,1,3,1,7,2,1,1,3,1,6,2,1,7,2,1,0,0,0;/卡农/一个音符有三个数字。前为音节、中为第几个八度、后为时长(以半拍为单位)。/*延迟tms程序*/void delay1ms(uint t) uint i;while(t-)for(i=0;i=5) status=0;break;/第一个键被按下,模式值+1case 0xd0: /第二个键被按下switch(status)case

15、0x01:if(hour23) hour+; else hour=0;break;/模式1小时+1,到24变成0case 0x02:if(min59) min+; else min=0;break; /模式2分钟+1case 0x03:if(alarmhour23) alarmhour+; else alarmhour=0;break;/模式3闹铃小时+1case 0x04:if(alarmmin0) hour-; else hour=23;break;case 0x02:if(min0) min-; else min=59;break;case 0x03:if(alarmhour0) ala

16、rmhour-; else alarmhour=23;break;case 0x04:if(alarmmin0) alarmmin-; else alarmmin=59;break;break;case 0x70:ringoff=ringoff; break;/第四个键按下,闹铃开关。default:break;/*正常走时时数码管显示程序*/void display() uint i;if(status=3|status=4) /闹铃时间buffer0=alarmhour/10;buffer1=alarmhour%10;buffer2=alarmmin/10;buffer3=alarmmin

17、%10;else/正常时间buffer0=hour/10;buffer1=hour%10;buffer2=min/10;buffer3=min%10;for(i=0;i4;i+)if(i=1)p0=segcodebufferi-0x80;/第二个数码管显示dpp2=selecti;delay1ms(1); /否则数码管上无显示p2=0xff;/否则乱码elsep0=segcodebufferi;/查找段码值p2=selecti; /查找位选delay1ms(1); /否则数码管上无显示p2=0xff;/否则乱码/*高两位屏蔽时的显示程序*/void display1() uint i;if(s

18、tatus=1)buffer0=hour/10;buffer1=hour%10;buffer2=min/10;buffer3=min%10;else /status=3时buffer0=alarmhour/10;buffer1=alarmhour%10;buffer2=alarmmin/10;buffer3=alarmmin%10;for(i=0;i4;i+)if(i=1)p0=0x7f; /只显示小数点p2=select1i;delay1ms(1); /否则数码管上无显示p2=0xff;/否则乱码elsep0=segcodebufferi;p2=select1i;delay1ms(1); /

19、否则数码管上无显示p2=0xff;/否则乱码/*低两位屏蔽时的显示程序*/void display2() uint i;if(status=2)buffer0=hour/10;buffer1=hour%10;buffer2=min/10;buffer3=min%10;else /status=4时buffer0=alarmhour/10;buffer1=alarmhour%10;buffer2=alarmmin/10;buffer3=alarmmin%10;for(i=0;i=60)sec=0;min+;if(min=60)min=0;hour+;if(hour=24)hour=0;/*定时器

20、t1中断。用来产生不同频率方波*/void t1() interrupt 3 tr1=0;/先关中断music=music; /产生方波th1=timer1h;tl1=timer1l; /重新装入初值tr1=1; /在开始计数/*延迟半节拍数*/void delay(uchar t) uchar t1;unsigned long t2;for(t1=0;t110*t;t1+)display(); /防止响音乐时数码管无显示press();for(t2=0;t2200;t2+) ;tr1=0;/一个音符发送完后关计数/*产生音乐程序*/void send() th1=timer1h;tl1=ti

21、mer1l;tr1=1;delay(time); /根据节拍数调用延迟/*主函数*/void main() uint h=0;uint i,k;music=1;tmod=0x11;th0=(65536-1000)/256;/1ms计数初值tl0=(65536-1000)%256;ea=1;et0=1;/开中断et1=1;p3=0xff;while(1)if(status=1|status=2)tr0=0;/当调整时间时,秒不走。else tr0=1;/开始计数if(status=0) p3=0xff;if(status=1|status=2) p3=0xfe; /调整时间指示灯if(statu

22、s=3|status=4) p3=0xfd; /调整闹铃指示灯press(); /判断是否有键按下并处理if(hour=alarmhour&min=alarmmin)/闹铃时间到 i=0;time=1;while(!ringoff)k=songi+7*songi+1-8;/找到相应音符的计数初值timer1h=freqhk;timer1l=freqlk;/装入计数初值time=songi+2;i=i+3;if(time!=0) send(); /播放音符else i=0; /循环播放music=1; if(status=0) /给显示加上一些效果display();else if(status

23、=1|status=3) /高两位闪烁if(h75) display();h+;else display1();h+;if(h=150) h=0;else /低两位闪烁if(h75) display(); h+;else display2();h+;if(h=150) h=0;六、 实验遇到的问题及解决方法1. 问题:数码管上无显示解决方法:用三极管来驱动数码管的位选端,否则数码管发光微弱。2. 问题:数码管显示出现乱码解决方法:动态显示时,需要确定led各位显示的保持时间。在某一位显示结束后,应将p2口置为0xff。3. 问题:按下按键时,数码管上的数字跳跃式变化。解决方法:按键处理程序调用

24、的位置错误。当有键按下时,将按键值赋给buf,松开按键时,才对buf中的数据进行按键处理,并重新将buf置为0xff。若在键按下时进行处理,会导致数字跳跃式变化。if(keyinput!=0xf0)buf=keyinput;/有键按下时赋给bufelsekeyprocess(buf);/当松开按键时(无键按下)才进行按键处理buf=0xff; 4. 问题:按下按键时,数码管的显示闪烁一次解决方法:在程序执行过程中检测到有按键按下时,会调用一段延时(约10ms)子程序来消抖。若通过执行空操作来实现延时10ms,则会使动态扫描的时间间隔变长,数码管亮度变暗。因此我通过调用数码管显示程序来实现延时1

25、0ms,即如下: void delaydd(uint p)uint k;for(k=p;k!=0;k-)display();/延迟时也显示,避免数码管闪烁5. 问题:在放音乐过程中,数码管上无显示解决方法:音乐的节拍是由延时实现的。当放音乐时,一直在调用延时程序,因此在延时程序中调用数码管显示程序,问题即可得到解决。如下:void delay(uchar t) uchar t1;unsigned long t2;for(t1=0;t110*t;t1+)display(); /防止响音乐时数码管无显示press();for(t2=0;t2200;t2+) ;tr1=0;/一个音符发送完后关计数若将display()放在第二重for循环内,会对音乐有较大的影响。6. 问题:时钟计时的准确性不是很好解决方法:定时器0计时中断程序每隔1ms中断一次并当作一个计数,当达到0.5s时,count应为500。实际中,可以通过调整count的值来调整其准确性。if(count=500) / 定时 0.5s 到。根据实际情况调整count的值led=led;count=0;if(led=0) /达到1ssec+; 七、 实验感想这次课程设计是我第一次真正的接触单片机。从选题到定稿,从理论到实践,在这十多天里,我

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论