单片机课程设计实验报告电子时钟

上传人:仙*** 文档编号:30274257 上传时间:2021-10-10 格式:DOC 页数:18 大小:3.78MB
收藏 版权申诉 举报 下载
单片机课程设计实验报告电子时钟_第1页
第1页 / 共18页
单片机课程设计实验报告电子时钟_第2页
第2页 / 共18页
单片机课程设计实验报告电子时钟_第3页
第3页 / 共18页
资源描述:

《单片机课程设计实验报告电子时钟》由会员分享,可在线阅读,更多相关《单片机课程设计实验报告电子时钟(18页珍藏版)》请在装配图网上搜索。

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;/一个音符发送完后关计数若

26、将display()放在第二重for循环内,会对音乐有较大的影响。6. 问题:时钟计时的准确性不是很好解决方法:定时器0计时中断程序每隔1ms中断一次并当作一个计数,当达到0.5s时,count应为500。实际中,可以通过调整count的值来调整其准确性。if(count=500) / 定时 0.5S 到。根据实际情况调整count的值led=led;count=0;if(led=0) /达到1ssec+; 七、 实验感想这次课程设计是我第一次真正的接触单片机。从选题到定稿,从理论到实践,在这十多天里,我学到了很多的东西。一开始我从参考书上找来了课题,但是毕竟是参考书,做到后来发现很多程序都是

27、不完善的,比如说当有按键按下时,数码管的显示会有所闪烁等等。在解决问题的过程中,我利用了proteus和keil的联调,通过软件仿真来检验程序的正确性。不仅巩固了以前所学的内容,而且还学到了很多在书本上没有学到的知识。其中收获最大的就是学会了中断的使用,利用定时器的中断计数来进行计时。为了使操作更加人性化,我还添加了一些特殊效果:当对时钟进行调整时,相应数码管会进行闪烁。同时,在这次设计中也遇到了很多实际性的问题。在实际设计中才发现,书本上理论性的东西与在实际运用中的还是有一定出入的,所以有些问题不但要深入地理解,而且要不断地更正以前的错误思维。一切问题必须要靠自己一点一滴的解决,而在解决的过

28、程当中你会发现自己在飞速的提升。对于单片机设计,其硬件电路是比较简单的,主要是解决程序设计中的问题,而程序设计是一个很灵活的东西,它反映了你解决问题的逻辑思维和创新能力,它才是一个设计的灵魂所在。因此在整个设计过程中大部分时间是用在程序上面的。很多子程序是可以借鉴书本上的,但怎样衔接各个子程序才是关键问题所在。比如在音乐响铃时,会导致数码管没有显示。这就要求我们仔细分析程序的结构,在响铃程序的相应位置调用数码管显示子程序。通过这次课程设计我也发现了自身存在的不足之处,虽然感觉理论上已经掌握,但在运用到实践的过程中仍有意想不到的困惑,经过一番努力才得以解决。不过因此也培养了我独立工作的能力,树立了对自己工作能力的信心,相信会对今后的学习工作生活有非常重要的影响。而且大大提高了我的动手的能力,使我充分体会到了在创造过程中探索的艰难和成功时的喜悦。八、 参考文献1. 戴胜华,蒋大明,杨世武等. 单片机原理与应用M. 北京:北京交通大学出版社,2008. 2. 张毅刚. 单片机原理与应用M. 北京: 高等教育出版社, 2004.3. 周航慈. 单片机程序设计基础M. 北京: 北京航空航天大学出版社,1997.附录(作品实物)

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!