基于mega16单片机的数字时钟实验报告

上传人:xmg****18 文档编号:120487063 上传时间:2020-02-06 格式:DOC 页数:11 大小:110.17KB
返回 下载 相关 举报
基于mega16单片机的数字时钟实验报告_第1页
第1页 / 共11页
基于mega16单片机的数字时钟实验报告_第2页
第2页 / 共11页
基于mega16单片机的数字时钟实验报告_第3页
第3页 / 共11页
基于mega16单片机的数字时钟实验报告_第4页
第4页 / 共11页
基于mega16单片机的数字时钟实验报告_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《基于mega16单片机的数字时钟实验报告》由会员分享,可在线阅读,更多相关《基于mega16单片机的数字时钟实验报告(11页珍藏版)》请在金锄头文库上搜索。

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

3、=0; DDRD = 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 = PORT

5、D.0; break; 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) /调节小时位的十位 timete

6、mp2=timetemp2+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(timet

7、emp2=60) 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。主函

9、数通过对alarm_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 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

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 教学/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号