基于mega16单片机的数字时钟实验报告_第1页
基于mega16单片机的数字时钟实验报告_第2页
基于mega16单片机的数字时钟实验报告_第3页
基于mega16单片机的数字时钟实验报告_第4页
基于mega16单片机的数字时钟实验报告_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

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

文档简介

1、基于AVR ATmage16的电子时钟设计简介:该电子时钟设置有两个按键,完成电子时钟的正常计时、校时、闹铃设置、闹铃开关等功能。目录一、使用说明1二、硬件设计1三、软件设计21、对端口初始化程序22、对数码管的扫描33、对按键状态的读取34、对时钟校时的移位调整(时钟校时)35、闹铃和当前时间显示的切换86、对闹铃的调整87、PORTD.0标志闹铃开关88、闹铃的设计9一、使用说明1、当时钟正常走的的时候,按一下key2,第一位开始闪亮,且通过key1来对该位进行加1操作,通过key2来向右移动要调节的位的闪亮和通过key1进行加操作完成校时功能,知道按到数码管不再闪亮。2、当时钟正常走的的

2、时候按一下KEY1可以选择打开闹铃功能,并且发光二极管D1亮。3、当时钟正常走的的时候按住key1不放则进入闹铃调节。key1来控制闪亮位的加1操作,key2来控制闪亮位的移动,直到按到最后一下数码管切换到时钟正常走的显示则完成了闹铃的设定。二、硬件设计本设计采样4M时钟。在proteus中仿真的电路图如下所示:如图:D1为闹铃指示灯;key1和key2按键;显示时钟的数码管;闹铃响的蜂鸣器。三、软件设计1、对端口初始化程序 PORTA = 0x00; / 显示控制I/O端口初始化 DDRA = 0xFF; PORTC = 0x3F; DDRC = 0x3F; PORTD.5=0; DDRD

3、= 0x21; PORTD.0=0;2、对数码管的扫描通过void display(void)函数每2ms产生一个中断来扫描一个数码管,扫描一次6个数码管所需要的时间是12ms,根据人的视觉延迟看到数码管是一起显示的。3、对按键状态的读取利用四种状态机来实现对Key1按键的消抖和状态的读取,没10ms扫描一次按键。当按一次key1的时候子函数返回1值,当长按key11s时扫描按键key1的子函数返回2值。通过在主函数中不断扫描按键来读取按键的状态。利用三种状态实现对key2按键的消抖处理。该按键的子函数只是当检测到按键的时候返回1值。没10ms扫描一次。4、对时钟校时的移位调整(时钟校时)对数

4、码管进行编码,从右到左依次是,0;1;2;3;4;5;定义tiaowei的状态来判断哪个数码管闪亮且对其调整。Tiaowei的初始值为6,此时没有数码管闪亮,且不对任何值进行调整。当每检测到一次key2的按键时tiaowei自动减一次1,且对该编码的数码管进行半秒钟亮一次的操作和通过key1的按键来实现对其对应时钟的位进行调整。如下是其调整的部分代码: if(tiaowei=6) if(read_key_6() if(tiaowei=0) tiaowei=6; else tiaowei-; switch (read_key_7() case 1: PORTD.0 = PORTD.0; brea

5、k; case 2: enter_alarm = 1; break; else if(read_key_6() if(tiaowei=0) tiaowei=6; else tiaowei-; temp1 = tiaowei%2; /检测tiaowei为奇数还是偶数 temp2 = tiaowei/2; /确定调整的是time数组的第几个 if(temp1 =2) temp1 =tiaowei%2; switch (read_key_7() case 1: /*对分钟进行调整*/ if(temp2=2) /对时钟小时位的调整 if(temp1) /调节小时位的十位 timetemp2=timet

6、emp2+10; if(timetemp2=24) timetemp2=timetemp2-30; else /调节小时位的个位 timetemp2+; if(timetemp2=10) timetemp2=0; if(timetemp2=20) timetemp2=10; if(timetemp2=24) timetemp2=20; if(timetemp2=24) timetemp2=timetemp2-24; /*对分秒进行调整*/ else /调节分钟或者秒位 if(temp1) /调节分钟或者秒的十位 timetemp2=timetemp2+10; if(timetemp2=60)

7、timetemp2=timetemp2-60; else /调节分钟或者秒的个位 timetemp2+; temp5=timetemp2%10; if(temp5=0) timetemp2=timetemp2-10; if(timetemp2=60) timetemp2=timetemp2-60; break; case 2: enter_alarm = 1; break; 5、闹铃和当前时间显示的切换设置标志位enter_alarm,当检测到按键key1返回的状态为2时令enter_alarm=1,通过查询该位来判断把闹铃设置的值送到缓冲区还是把当前时间的值送到缓冲器来时钟对闹铃设置和当前时

8、间显示的切换。且在不同的状态对扫描按键返回值执行的操作也不一样。6、对闹铃的调整对闹铃的调整基本上和软件设计的4部分一样,不同的是设置的tiaowei2的初始值为5,即一旦检测到进入闹铃状态直接开始对编码5的数码管对应的值进行调整且控制其半秒闪亮。7、PORTD.0标志闹铃开关设置PORTD.0的初始值为0,当在显示当前时间的状态下机enter_alarm=0时,按一次key1使PORTD.0=1。此时闹铃标志灯D1亮。每秒判断一次设置的闹铃时间是否和当前时间相匹配。设置alarm_start标志位,当匹配且PORTD.0=1时alarm_start标志位=1,否则为0。主函数通过对alarm

9、_start标志位的查询来判断是否让定时器1接上时钟源,即闹铃开始工作。部分代码如下:void compare_time(void) if(time0=alarm_time0)&(time1=alarm_time1)&(time1=alarm_time1)&(PORTD.0) alarm_start=1; else alarm_start=0;8、闹铃的设计本闹铃的音乐为林俊杰-可惜没如果。采用15个音符,即低音区和高音区的各7个音符和高音区的第一个音符。从网上查找资料,下图为其音符对应的不同频率:写出的CTC模式下产生一定频率所需的计数值和基本单位时间值代码如下:flash unsigned

10、 int t16 = 262143,1908,1701,1515,1433,1276,1136,1012,956,865,759,716,638,568,506,470;flash unsigned char d16 = 0,52,59,66,70,78,88,99,105,116,132,140,157,176,198,209;可惜没如果的部分简谱如下图:根据此简谱不断调整写出音符对应频率和持续时间基本单位的倍数如下:#define Max_note 94flash unsigned char musicMax_note =5,3,10,2,9,2,10,8,10,2,9,2,10,4,8,2,7,4,12,10,10,2,9,2,10,4,7,2,6,4,13,6,12,2,11,2,10,4

温馨提示

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

评论

0/150

提交评论