单片机课设 |
您所在的位置:网站首页 › 电子日历钟表不准怎么调 › 单片机课设 |
电子时钟设计
1项目概述
1.1项目简介 项目内容:以C51单片机为核心,设计一个定电子时钟,8位LED数码管,分别显示“时-分-秒”。显示范围范围从0小时0分0秒到23小时59分59秒,通过定时器来定时一秒钟,每过一秒刷新一次显示时间。通过矩阵键盘设置小时、分钟和秒数的初值。按调时按键按下后开始进入调整时间模式,通过矩阵按键进行新一次时间调整,并且可以通过按键设置闹钟,当到达闹钟时间时间时,数码管会闪烁一段时间并停止刷新时间,当按下24-12进制切换按键后,时钟显示会在24时制和12时制之间切换。 项目用途:电子时钟广泛用于生活中的各种场景,在人们的生活中不可或缺,在国防科技、工业制造领域也有着极其重要的地位。 学习价值:利用C51单片机进行电子时钟设计,掌握了关于中断、定时器、数码管等知识,对今后关于部件图的绘制有了更深的理解。 社会意义:此次进行单片机电子时钟的课程设计,我们懂得了时间的重要性,在以后的学习生活中要珍惜时间,在今后的学习中深入单片机领域的学习与探索。 1.2功能需求分析 (1)系统可以时间进行设计,显示格式为:“时”(第1,2位),“分”(第4,5位),“秒”(第7,8位)。 (2)当调整时间键被按下时自动进入调整时间模式,时钟不再刷新时间,通过矩阵键盘的按下从左至右依次可以进行时间更改。 (3)当24/12时制切换键被按下时,时钟显示自动切换另一种显示模式。 (4)当时间到达设置的闹钟时间时,数码管显示自动停止刷新时间并开始闪烁一段时间。 1.3系统开发环境、工具需求分析与选择 PROTUES软件进行仿真、keil软件、PC机。 2项目硬件系统设计2.1 系统方案原理图 (1)项目主要硬件。 硬件系统是指构成微机系统的实际装置,通常是由单片机、数码管显示、定时器计数、矩阵按键和外部中断等组成。单片机芯片选择AT89C51,显示区域使用8位LED数码管,键盘是34普通矩阵键盘以及外部中断INT0 INT1。 3.1 项目软件系统总架构图 下图为24时进制显示的16时9分57秒 相关代码(全,更加详细解释图与介绍见我上传资源): #include #include unsigned char code table[] = { 0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90,0xff }; unsigned char count = 0;//定时器 计数变量 unsigned char time[] = { 16,9,50 };//初始显示的时间 16-09-50 unsigned char p = 0;//调整时间时候,将要调整的位数 unsigned char num = 0;//按键接收值 unsigned char state = 0;//state=0 显示时间模式,state=1 调整时间模式 unsigned char change = 0;//change=0 24时显示时间,change=1 12时显示 void delay(unsigned int z) { unsigned int x, y; for (x = z; x > 0; x--) for (y = 110; y > 0; y--); } void disp()//数码管显示函数 { P2 = 0x01; P0 = table[time[0] / 10]; delay(3); P2 = _crol_(P2, 1); P0 = table[time[0] % 10]; delay(3); P2 = _crol_(P2, 1); P0 = 0xbf; delay(3); P2 = _crol_(P2, 1); P0 = table[time[1] / 10]; delay(3); P2 = _crol_(P2, 1); P0 = table[time[1] % 10]; delay(3); P2 = _crol_(P2, 1); P0 = 0xbf; delay(3); P2 = _crol_(P2, 1); P0 = table[time[2] / 10]; delay(3); P2 = _crol_(P2, 1); P0 = table[time[2] % 10]; delay(3); P0 = 0xff; } void keyscan()//按键扫描函数 { P1 = 0xfe; while ((P1 & 0xf0) != 0xf0) { delay(3); while ((P1 & 0xf0) != 0xf0) { switch (P1) { case 0xee:num = 1; break; case 0xde: num = 2; break; case 0xbe: num = 3; break; } if (state) p++;//在调整时间模式 每次按下按键自动调整为修改下一位 delay(300); while ((P1 & 0xf0) != 0xf0) disp(); } } P1 = 0xfd; while ((P1 & 0xf0) != 0xf0) { delay(3); while ((P1 & 0xf0) != 0xf0) { switch (P1) { case 0xed: num = 4; break; case 0xdd: num = 5; break; case 0xbd: num = 6; break; } if (state)p++; delay(300); while ((P1 & 0xf0) != 0xf0) disp(); } } P1 = 0xfb; while ((P1 & 0xf0) != 0xf0) { delay(3); while ((P1 & 0xf0) != 0xf0) { switch (P1) { case 0xeb: num = 7; break; case 0xdb:num = 8; break; case 0xbb: num = 9; break; } if (state)p++; delay(300); while ((P1 & 0xf0) != 0xf0) disp(); } } P1 = 0xf7; while ((P1 & 0xf0) != 0xf0) { delay(3); while ((P1 & 0xf0) != 0xf0) { switch (P1) { case 0xe7: num++; p--; break; case 0xd7: num = 0; break; case 0xb7: break; } if (state)p++; delay(300); while ((P1 & 0xf0) != 0xf0) disp(); } } } void change_time()//调整时间模式 计算函数 { if (state) { switch (p) { case 1:time[0] = (num * 10 + time[0] % 10); break;//num接受按键的值,小时的十位上改为num的值,个位不变 case 2:time[0] = (num + (time[0] / 10 * 10)); break;//小时的个位上改为num的值,十位不变 case 3:time[1] = (num * 10 + time[1] % 10); break;//num接受按键的值,分钟的十位上改为num的值,个位不变 case 4:time[1] = (num + (time[1] / 10 * 10)); break;//分钟的个位上改为num的值,十位不变 case 5:time[2] = (num * 10 + time[2] % 10); break;//num接受按键的值,秒的十位上改为num的值,个位不变 case 6:time[2] = (num + (time[2] / 10 * 10)); break;//秒的个位上改为num的值,十位不变 } if (p >= 6)//全部调整完时间,进入正常时间显示模式,并打开定时器 { state = 0; TR1 = 1; p = 0; } } } void init_timer1() { TMOD = 0x15; IE = 0x85; IP = 0x04; TL1 = (65536 - 50000) % 256; TH1 = (65536 - 50000) / 256; TR1 = 1; ET1 = 1; EA = 1; } void main() { init_timer1();//定时器中断初始化 while (1) { disp(); keyscan(); change_time(); } } void TIME_1() interrupt 3//定时器计数 { TL1 = (65536 - 50000) % 256; //50ms TH1 = (65536 - 50000) / 256; count++; if (change) time[0] %= 12;//保证小时小于12 else time[0] %= 24;//保证小时小于12 time[1] %= 60;//保证分钟用于小于60 if (count == 20)//到达1s { count = 0; time[2]++;//秒加一 if (time[2] >= 60)//秒进位 { time[2] = 0;//秒清零 time[1]++;//分加一 if (time[1] >= 60)//分进位 { time[1] = 0;//分清零 time[0]++;//小时加一 } } } } void int0() interrupt 0//进入调整时间模式 { state = 1; TR1 = 0;//关闭定时器 } void int1() interrupt 2//切换24-12时间显示 { change = ~change; } 5总结与心得体会通过单片机课程设计,我们对单片机原理的学习更加掌握和了解,为以后的学习奠定了基础。这次课程设计基于每周做的单片机项目,使得我们对单片机整体构架有个初步的认识和见解,在课程设计的过程中,明白了合理的小组分工尤为重要,本课程设计我们制作电子时钟,完成了正常电子时钟的显示功能、定时闹钟和调整时间功能,并在此基础完善了增加了利用矩阵键盘进行调整时间的功能,实现显示“小时.分钟.秒”的定时功能和12时/24小时切换显示,可灵活实现小时加、分钟加等功能。本设计具有较强的灵活性,可实现性高,具有较高的应用价值。虽然进行了代码多次优化与调试,但是对于部分功能仍存在显示出错的问题,我们在以后的学习中会继续完善代码,将软件与硬件完美结合,在单片机领域更加努力的学习。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |