一 引言
以本学期对单片机的学习和认识,并通过本次课程设计加以应用,从而达到一个对所学知识的巩固、更深一步的理解,面对一个电子设计,应对出系统的方案,分析出各个板块来,再对各个板块进一步的具体分析,先进行硬件电路分析,此时一定要考虑好为什么要用这些元件、各个元件的具体参数、是否能实现应有功能,从而分析一个完整的硬件电路。在根据该电路设计出软件的功能模块、从而完成程序流程图,在根据流程图完成程序的设计,并通过反复的调试、运行、更正,直至完成既定功能为止,最后将软件、硬件结合进行调试、运行,对其功能进行最终测试,并反复思考其测试中遇到相应问题的原因,并将其一一处理,从而完成本次设计的实验要求,以及本次课程设计的最终目的。
二 数字钟设计
2.1 设计内容
所谓数字钟就是利用单片机制作一个电子时钟。其算法就是以单片机的时钟为基准,记录单片机时钟脉冲的数量,当数量足够多(如脉冲为每秒6Mhz, “分”,“秒”位清零以后继续记录。当“分”累加为60以后进位为“时”,“分”位清零以后继续记录,当“时”位为24以后,“时”位清零并继续记录。那么记录6M个脉冲所需时间即为1秒)就可以将显示部分的“秒”位加一。加到60以后进位为一。
数字钟具有时、分、秒的显示、调整、清零功能,采用的时间制式为24小时制,时间显示格式为时、分、秒,它具有三种工作状态,即系统清零状态、时钟运行状态和时钟调整状态。
数字钟上电或复位后,数字钟自动进入时钟运行状态。此时,按数字钟的启动调整键,数字钟进入时钟调整状态;在时钟运行状态下,可以利用清零键将计时清零;在时钟调整状态下,可利用键盘上的按键分别修改时、分、秒的值,修改完毕后按数字钟的恢复键,则数字钟又回到时钟运行状态,继续运行并显示当前时间。
1
河北大学2007级通信工程单片机综合设计
2.2 电路图
图1为总体电路图,在本次设计中我们针对P0口和P2口进行编程设计,达到让六个数码管按照电子钟的方式进行计时和调整。其中硬件电路包括显示电路,电源及功能指示电路,单片机外围电路,数码管驱动电路,按键控制电路,信号整理及串行通信电路。
图1 总体电路图
2.2.1单片机外围电路
图2为单片机外围电路,其中包括复位电路和时钟电路,对于本次实验我们要进行编程的是这部分电路的P0,因为P0在这个时候可以作为通用I/O口使用,依次与数码管的a,b,c,d,e,f,g,h相连接,相应的在编程时向P0口写数,那么相应的数码管按照要求点亮。另外,8051相关的电源和接地引脚要按照要求连接。
2
河北大学2007级通信工程单片机综合设计
图2 单片机外围电路
2.2.2按键控制电路
图3为按键控制电路,在本次数字钟实验中用到五个按键,这五个按键可
以调节时钟小数点的位置并选中当前将要调整的数码管,通过加或者减计数值改变时间,恢复到运行状态,将计时清零。
图3 按键控制电路
2.2.3数码管驱动电路
图4为数码管驱动电路,其中74LS138作为译码电路,用单片机的P2.0,P2.1和P2.2作为译码器的三个译码位,相应的就可以选择六个数码管之中的一个,修改计数值,然后即可达到我们的要求。
3
河北大学2007级通信工程单片机综合设计
图4 数码管驱动电路
2.2.4 显示电路
图5为显示电路,由六个共阴极的数码管和电阻排列组成。
图5 显示电路
2.2.5电源及功能指示电路
图6为电源及功能指示电路,在这部分电路中,主要用到了LM7805三端稳压集成电路,能输出稳定的电压值电路内部还有过流、过热及调整管的保护电路,使用起来可靠、方便,而且价格便宜,因此在本次实验中用这个芯片。
4
河北大学2007级通信工程单片机综合设计
图6 电源及功能指示电路
2.2.6信号整理及串行通讯电路
图7及图8为信号整理及串行通讯电路,用到的芯片是MAX232 ,MAX232
芯片是美信公司专门为电脑的RS-232标准串口设计的单电源电平转换芯片,使用+5v单电源供电。
图 7
图7 信号整理电路 图8 串行通信电路
2.3 程序设计流程
5
河北大学2007级通信工程单片机综合设计
开始 设置计数初值 计数 是否为“1” Y
秒加“1”
Y 秒为“60”? Y 秒清零,分加“ 1” Y 分为“60”
Y 分清零,时加“1”
Y 时为“24”吗?
Y
时清零
结束
6
N N N N 河北大学2007级通信工程单片机综合设计
2.4 调试结果及结论
经过编写程序、编译和调试,将程序下载到电路板中,数字钟工作正常。 本程序实现了6位数码管数字钟设计,我们还可以设计出功能更加全面的的数字钟样式,而硬件电路不变。
三 心得体会
通过这次课程设计,使我受益匪浅,收获颇多。
在这次的数字钟设计过程中,我进一步练习了自己的焊接技术,焊接技术得到了很大的提高,而且学习了基本的数字钟功能设计,接触了更多的有关设计的东西,了解了数字钟的功能要求及设计方法。同时我也进一步地熟悉了芯片的结构及各芯片的工作原理和具体的使用方法,更重要的是增强了实验的动手能力。
在这个过程中,我提高了自己的实际动手操作能力,培养了治学严谨的态度,激发了我对此专业课程的兴趣,而且让我们深刻的体验到理论知识与实践经验的密切联系。在设计时,对不同方案的构思、分析、比较到最后的方案确定,这些工作,可以增强了我们分析、解决问题的能力,培养我们的创新意识。
这次课程设计使我们从枯燥的理论学习中出来,让我们放手去做,考验了我们的动手能力。设计的一系列步骤过程,让我们从中学到了很多以前未接触的新知识,而且通过一些问题的出现并解决,使我们增加了解决问题的能力,对一些比较棘手的问题有了新的认识与解决方案。
总的来说,这次的数字钟设计对我来说是一次深刻的实习经历,对我以后的学习及工作都是很有益处的。感谢老师在课程设计的过程中的耐心指导,只有通过不断的学习和练习才能不断发现问题,解决问题,在实践中提高自已。希望以后还有这样的机会更好的锻炼自己,提高自己。
7
河北大学2007级通信工程单片机综合设计
四 参考文献
[1] 李全利,仲伟峰,徐军. 单片机原理及应用.清华大学出版社.2006年2月
[2] 谭浩强.C程序设计.清华大学出版社.2005年7月
8
河北大学2007级通信工程单片机综合设计
附 录
#pragma db oe
#include #include #define uint unsigned int #define uchar unsigned char #define ulong unsigned long void display(void);//显示 void initial(void);//初始化 void delay(void);//延时 void seccount(void);//软件钟运行计数 void getdisdate(void);//得到显示缓存数值 void settime(void);//设置时间 void timectr(uchar zj);//时间调整(时分秒) uchar inkey(void);//读键盘 uchar disdate[6];//显示缓存 uchar code tab[]={0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7d,0x7,0x7f,0x6f};//数码管显示段码(0~9) uint count;//计数 uchar hour,min,sec;//时分秒 uchar set_state,dot;//状态,数码管(小数点)显示位置 sbit zsd=P1^0;//指示灯,每秒闪烁一次 main() { uchar i; for (i=0;i<6;i++) { disdate[i]= 0; //将显示缓存清零 } initial(); //初始化单片机 set_state=0; do { 9 河北大学2007级通信工程单片机综合设计 i=inkey(); //设置时钟 if(i==0xe0) settime(); getdisdate(); display(); //显示 if((sec & 0x01)) //指示灯闪烁,低电平亮(绿色LED) zsd=1;//指示灯灭 else zsd=0;//指示灯亮 } while(1); } void display(void) //六位数码管显示程序,disdate[]是要显示的内容(是0~9的数字),dot是在那一位显示小数点 { uchar i,disa,disb,disc; disb = 0x00; //显示第0位 for (i=0;i<6;i++) //共显示6个数据 { disa = disdate[i]; //显示数据 if (disa < 10) { P2 = disb; disc = tab[disa]; //显示段码 if (set_state==0) //显示时钟 { if ((i == 1) || (i == 3)) disc = disc | 0x80; //增加小数点显示 } else //设置时显示 { if (dot == i) disc = disc | 0x80; //增加小数点显示 } P0 = disc; //送显示 delay (); //延时 P0 = 0x00; disb++; //下一个要显示的位置 } } P2 = 0xff; } 10 河北大学2007级通信工程单片机综合设计 void settime(void) //设置时间 { uchar i,k; set_state=1; //改变显示状态 dot=0; //设置位置 TR0=0; //停止时钟运行 getdisdate(); //将现在的结果放到数组disdate[] do { display(); //显示 i=inkey(); //读键 switch (i) { case 0xe0: //退出设置,4号键,最左 k=0xff; break; case 0xd0: k=0; //改变设置位置,每按下一次右移一个,3号键,次左 dot++; if(dot==6) dot=0; break; case 0xb0: //加1,2号键,次右 k=0; timectr(0); break; case 0x70: //减1,2号键,最右 k=0; timectr(1); break; default: k=0; break; } } while(k!=0xff); set_state=0; //恢复显示时钟 TR0=1; //时钟运行 _nop_(); } void timectr(uchar zj)//时间调整 { 11 河北大学2007级通信工程单片机综合设计 switch (dot) { case 0: if (zj==0) //小时高位调整 { disdate[0]++; if (disdate[0]>2) disdate[0]=0; } else { if (disdate[0]==0) disdate[0]=2; else disdate[0]--; } hour=disdate[0]*10+disdate[1]; break; case 1: //小时低位调整 if (zj==0) { disdate[1]++; if (disdate[0]!=2) { if (disdate[1]>9) disdate[1]=0; } else { if (disdate[1]>3) disdate[1]=0; } } else { if (disdate[0]!=2) { if (disdate[1]==0) disdate[1]=9; else disdate[1]--; } else { 12 河北大学2007级通信工程单片机综合设计 if (disdate[1]==0) disdate[1]=4; else disdate[1]--; } } hour=disdate[0]*10+disdate[1]; break; case 2: //分钟高位调整 if (zj==0) { disdate[2]++; if (disdate[2]>5) disdate[2]=0; } else { if (disdate[2]==0) disdate[2]=5; else disdate[2]--; } min=disdate[2]*10+disdate[3]; break; case 3: //分钟低位调整 if (zj==0) { disdate[3]++; if (disdate[3]>9) disdate[3]=0; } else { if (disdate[3]==0) disdate[3]=9; else disdate[3]--; } min=disdate[2]*10+disdate[3]; break; case 4: //秒高位调整 if (zj==0) { disdate[4]++; 13 河北大学2007级通信工程单片机综合设计 if (disdate[4]>5) disdate[4]=0; } else { if (disdate[4]==0) disdate[4]=5; else disdate[4]--; } sec=disdate[4]*10+disdate[5]; break; case 5: //秒低位调整 if (zj==0) { disdate[5]++; if (disdate[5]>9) disdate[5]=0; } else { if (disdate[5]==0) disdate[5]=9; else disdate[5]--; } sec=disdate[4]*10+disdate[5]; break; default: break; } } void delay(void) //延时程序 { uchar i; for (i=0;i<201;i++) _nop_(); } void getdisdate(void) //将时钟分离送到显示缓存 { disdate[0]=hour/10; disdate[1]=hour%10; disdate[2]=min/10; disdate[3]=min%10; 14 河北大学2007级通信工程单片机综合设计 disdate[4]=sec/10; disdate[5]=sec%10; } void seccount(void) //时钟运行计数,每秒运行一次 { sec++; if(sec==60) { sec=0; min++; if (min==60) { min=0; hour++; if (hour>23) hour=0; } } } void initial(void) //初始化单片机 { TMOD=0x11; //定时器1:gate=0->TR1=1开始计数,C/T=0->对内部计数,模式1->16位计数 TH0=0X4C; TL0=0X00; ET0=1; //打开定时器0中断 ET1=0; //关闭定时器1中断 TR0=1; //打开计数器0 TR1=0; //关闭计数器1 EA=1; //总中断允许 } void inttime0(void) interrupt 1 using 1 { TH0=0X4C; //50ms中断一次,20次为一秒,调整时间一次 TL0=0X00; count++; if (count==20) { count=0; seccount(); } } /********************************************************** 15 河北大学2007级通信工程单片机综合设计 读键盘程序 K1:0x70 K2:0xb0 K3:0xd0 K4: 0xe0 **********************************************************/ uchar inkey(void) { uchar j,keydate; P2 = 0xff; //P2准备读入 keydate = P2; //读入键值 keydate = keydate & 0xf0; //找出四个键的值 if (keydate != 0xf0) //有键输入 { _nop_(); _nop_(); j = P2; //再读,去抖动 j = j & 0xf0; if (j!= keydate) keydate = 0xf0; do { j = P2; j = j & 0xf0; } //等待键松手 while (j!= 0xf0); } return (keydate); } { disdate[0]=hour/10; disdate[1]=hour%10; disdate[2]=min/10; disdate[3]=min%10; disdate[4]=sec/10; disdate[5]=sec%10; }void seccount(void) { sec++; if(sec==60) { sec=0; min++; if (min==60) 16 //时钟运行计数 河北大学2007级通信工程单片机综合设计 uchar j,keydate; P2 = 0xff; //P2准备读入 keydate = P2; //读入键值 keydate = keydate & 0xf0; //找出四个键的值 17 if (keydate != 0xf0) //有键输入 { _nop_(); _nop_(); j = P2; //再读,去抖动 j = j & 0xf0; if (j!= keydate) keydate = 0xf0; do { j = P2; j = j & 0xf0; } //等待键松手
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuo9.cn 版权所有 赣ICP备2023008801号-1
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务