倒计时秒表 单片机
- 格式:doc
- 大小:7.19 MB
- 文档页数:20
目录一、设计目的 (1)二、设计任务及要求 (2)三、总体方案设计 (2)四、硬件电路设计 (3)1、各部分电路设计 (3)2、整体电路图 (8)五、软件设计 (9)1、程序流程图 (9)2、源程序 (9)六、仿真效果 (9)1、显示部分仿真效果 (9)2、报警装置仿真效果 (10)七、实物调试 (11)八、设计总结 (11)1、设计过程中遇到的问题及解决方法 (11)2、设计体会 (12)3、对设计的建议 (12)参考文献 (13)附录 (14)一、设计目的单片机课程设计中通过查阅资料、接口设计、程序设计、安装调试等环节,完成AT89S-51单片机多种资源应用并具有综合功能的小系统目标板的设计与编程应用,是同学们将课堂上学到的理论知识与实际应用结合起来,并能够对电子电路、电子元器件、印制电路板等方面的知识进一步加深认识,同时在软件编程、排错调试、焊接技术、相关仪器设备的使用技能等方面得到较全面的锻炼和提高,增进对单片机的感性认识,加深对单片机理论方面的理解,掌握单片机的内部功能模块的应用,如定时器/计数器、中断、片内外存贮器、I/O口、串行口通信等,强化单片机应用电路的设计与分析能力,提高学生在单片机应用方面的实践技能和科学作风,培育学生综合运用理论知识解决问题的能力,实现理论结合实际,学以至用的原则。
运用所学的知识和自身课外的拓展学习加深对专业课的理解和学习,锻炼综合运用电路设计及相关电子仪器、单片机软硬件结合的理论,结合生产实际分析和解决工作工程实际问题的能力,加固、加深和扩展有关电子类,汇编语言,相关电子电路和仿真软件方面的知识和能力。
通过本次课程设计,应加强培养如下能力:(1)加强自身独立的动手能力和思考解决问题的能力,提高创造能力。
(2)学会使用软件Proteus画原理图和仿真调试。
(3)通过本次课程设计加深对单片机课程的全面认识复习和掌握,对单片机课的应用进一步的了解。
(4)掌握定时器、外部中断的设置和编程原理。
(5)通过此次课程设计能够将单片机软硬件结合起来,对程序进行编辑,校验。
(6)该设计通过单片机的定时器/计数器定时和计数原理,设计简单的计时器系统,拥有正确的计时、暂停、清零功能,并同时可以用数码管显示,在现实生活中应用广泛,具有现实意义。
二、设计任务及要求1、可以以实现正常秒表的所有功能,包括启动、暂停、复位等;2、可以自由设定倒计时时间(10s 、20s 、30s ···),并进行倒计时;3、显示方式自选;4、任选一款51单片机;5、扩展功能:在秒表的基础上增加时钟功能,倒计时完成时加入报警单元,如声音、灯光等三、总体方案设计本硬件设计总共包括六部分电路:数码管显示电路、时钟电路、复位电路、电源电路、控制电路、报警装置。
总体设计框图如图1所示。
图1 总体设计方框图S T C 89C 52 P0P2 P2 P1数码管显示 时钟电路复位电路报警装置 电源电路 控制电路四、硬件电路设计1、各部分电路设计(1)单片机STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash存储器。
STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。
在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
因此,本次课程设计选用了容易烧写程序并且有较大内存的STC89C52芯片。
仿真图中的单片机如图2所示。
图2 仿真图中的STC89C52芯片(2)时钟电路时钟是单片机的心脏,单片机的各个功能部件的运行都是以时钟的频率为基准的,有条不紊按部就班的运行工作。
因此时钟频率直接影响单片机的运行速度,时钟电路的质量也直接影响单片机的系统的稳定性。
STC89C52单片机内部有一个用于构成振荡器的高增益反相放大器,该高增益反相放大器的输入端为芯片引脚XTAL1,输出端为引脚XTAL2,这两个引脚跨接石英晶体振荡器和微调电容,就构成了一个稳定的自激振荡器。
时钟电路有两种方式:①内部时钟方式:当使用片内振荡器时,XTAL1(19脚)连接外部石英晶体和微调电容,XTAL2(18脚)连接外部石英晶体和微调电容。
②外部时钟方式:当采用外接时钟源时,XTAL1(19脚)接外部时钟振荡器的信号,XTAL2(18脚)悬空。
本次课程设计时钟电路采用的是内部时钟方式,该时钟电路如图3所示。
图3 时钟电路(3)复位电路单片机在启动时都需要复位,以使CPU及系统各部件处于确定的初始状态,并从初态开始工作。
89系列单片机的复位信号是从RST引脚输入到芯片内的施密特触发器中的。
当系统处于正常工作状态时,且振荡器稳定后,如果RST引脚上有一个高电平并维持2个机器周期(24个振荡周期)以上,则CPU就可以响应并将系统复位。
单片机系统的复位方式有:手动按钮复位和上电复位。
①手动按钮复位:需要人为在复位输入端RST上加入高电平。
一般采用的办法是在RST端和正电源Vcc之间接一个按钮。
当人为按下按钮时,则Vcc的+5V 电平就会直接加到RST端。
②上电复位:只要在RST复位输入引脚上接一电容至Vcc端,下接一个电阻到地即可。
上电复位的工作过程是在加电时,复位电路通过电容加给RST端一个短暂的高电平信号,此高电平信号随着Vcc对电容的充电过程而逐渐回落,即RST端的高电平持续时间取决于电容的充电时间。
为了保证系统能够可靠地复位,RST端的高电平信号必须维持足够长的时间。
上电时,Vcc的上升时间约为10ms,而振荡器的起振时间取决于振荡频率,另外,在复位期间,端口引脚处于随机状态,复位后,系统将端口置为全“l”态。
本次课程设计复位电路采用的是手动按钮复位,该复位电路如图4所示。
图4 复位电路(4)数码管显示部分LED数码管在单片机系统中应用非常普遍,LED数码管是由光二极管构成。
常见的LED数码管为“8”字型的,共计八段。
每一段对应一个发光二极管,这种数码管显示器通常有共阳极和共阴极接法。
共阴极LED数码管的发光二极管的阴极连接在一起,通常此公共阴极接地。
当某个发光二极管的阳极为高电平时,发光二极管点亮,相应的段被显示。
同样,共阳极LED数码管的发光二极管的阳极连接在一起,通常此公共阳极接正电压。
当某个发光二极管的阴极接低电平时,发光二极管被点亮,相应的段被显示。
此次选用的是共阴极的两位一体的LED数码管,数码管显示部分如图5所示。
图5 数码管显示部分(5)控制电路该控制电路有三个控制端分别为:①秒表十位加一;②秒表十位减一;③秒表个位加一;④秒表个位减一;⑤秒表显示清零;⑥开始/暂停该部分控制电路如图6所示图6 秒表控制电路(6)报警装置报警电路是对倒计时秒表完成时的提醒,该报警装置采用蜂鸣器进行。
报警电路用了一个电阻、一个s9013三极管和一个蜂鸣器,该报警电路如图7所示。
图7 报警装置2、整体电路图图8 整体电路图五、软件设计1、程序流程图N图9 程序流程图2、源程序见附录。
六、仿真效果1、显示部分仿真效果图10 显示效果图2、报警装置仿真效果由于报警装置有蜂鸣器组成,当倒计时结束时蜂鸣器会响一秒,在蜂鸣器的两端各加一电压探针测两端电压,由图11可以看出,当倒计时结束时蜂鸣器两端电压相差约5V,故蜂鸣器会响一秒以提示倒计时结束。
报警装置仿真效果图如图11所示。
图11 报警装置仿真效果图七、实物调试图12 实物正面效果图图13 实物反面连线图八、设计总结1、设计过程中遇到的问题及解决方法本次课程设计是第一次接受单片机的课程设计,这也是检验我们这学期以来所学到的关于单片机课程的理解与应用,在设计时,难免会遇到一系列的问题,下面是一些实验中遇到的问题及解决方法:①刚开始应用Proteus仿真的时候由于不会使用,导致无法继续程序以及电路板的焊接等一系列的后续工作,后来通过问同学们和百度一些前辈们的经验,可以正确并熟练的掌握Proteus仿真。
②在焊接电路板上的数码管时,不清楚数码管各个引脚所对应的段选和位选,在网上百度后也找到很多版本,问同学也不清楚,最后解决方法是用万用表的二极管档测量数码管的位选以及段选。
③仿真做好,实物也焊接好之后,实物不能正常工作,先用万用表测试了电源的正极和负极,没有问题又给单片机上电检查各个引脚与负极之间的电压也没什么问题,最后问老师和同学确定是程序的问题。
2、设计体会经过一周的课程设计,完成了倒计时秒表的设计,从开始学习Proteus到实物正常工作付出了许多努力,虽然遇到了很多困难,但在同学们和老师的帮助以及查阅资料的情况下,问题一一得到解决,通过这次课程设计,我认识和了解了基本的单片机设计的开发过程。
期间,我学会了分析课题的要求,查阅资料用怎样的元器件来实现,学会用Protues 软件来绘制原理图,用c语言来编写源程序,最后成功做出实物并能正常工作。
此外,我也学习到了很多以前没有经历过的知识,比如,如何用万用表来测量数码管的各个引脚,同时让我更加清楚了理论知识和实践能力的差别,了解到自己的短处,培养了我的独立思考和解决问题的能力,在此次设计中,也发现了自己的不足之处。
进一步提高了自己在实际设计过程中研究问题、发现问题、解决问题的能力,将我们所学的知识应用于生活实践中,真正的做到了学以致用的效果。
3、对设计的建议本次课程设计由于我和很多同学一起在实验室焊接电路板,期间发现了不少其他问题,我有以下建议:①单片机课程设计中要用的东西很零散,而且大部分器材较便宜,可以多买一些备用,防止有些零件损坏或者丢失之后导致实物不完整。
②建议老师对于AT公司和STC公司生产的单片机做一些说明,告诉同学们两种烧写单片机程序的不同,鉴于同学们买的开发板大多只能烧写STC系列的单片机,建议同学们购买STC的单片机。
参考文献[1]郭天祥.51单片机C语言教程[M]. 北京:电子工业出版社,2009.[2]李广弟.单片机基础[M]. 北京:航空航天大学出版社,2001.[3]迟荣强.单片机原理及接口技术[M] . 北京:高等教育出版社,2004.[4]张毅刚.单片机原理及应用[M]. 北京:高等教育出版社,2008.[5]楼然苗、李光飞. 单片机课程设计指导[M]. 北京:电子工业出版社,2007.[6]吴经国. 单片机应用技术[M]. 北京:中国电力出版社,2000.[7]吴金戌. 8051单片机实践与应用[M] . 北京:清华大学出版社,2004.[8]张毅刚.MCS-51单片机应用设计[M]. 哈尔滨:哈尔滨工业大学出版社,1997.附录:源程序:#include<reg52.h> //52系列单片机头文件#define uint unsigned int //宏定义#define uchar unsigned charsbit BEEP=P1^7; //声明单片机P1口的第八位sbit DULA=P2^0; //两位一体数码管位选sbit WELA=P2^1;sbit key1=P2^2; //定义位变量,声明P2口sbit key2=P2^3;sbit key3=P2^4;sbit key4=P2^5;sbit key5=P2^6;sbit key6=P2^7;uchar code table[]={ //8段LED段码0x3f,0x06,0x5b,0x4f, //0,1,2,30x66,0x6d,0x7d,0x07, //4,5,6,70x7f,0x6f,0x77,0x7c, //8,9,A,b0x39,0x5e,0x79,0x71}; //C,d,E,Fvoid delay(uint); //声明延时函数uchar numt0,num; //定义变量void delay(uint z) //延时函数,z为x,则延时xms {uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void display(uchar numdis) //数码管显示函数{uchar shi,ge; //定义十位和个位的变量shi=numdis/10; //将两位数的十位赋值给shi ge=numdis%10; //将两位数的个位赋值给geDULA=1;WELA=0;P0=table[ge];DULA=0;delay(5); //延时5msDULA=0;WELA=1;P0=table[shi]; //送十位段选数据WELA=0;delay(5);}void init() //初始化函数{TMOD=0x01; //设置工作方式1(0000 0001)TH0=(65536-50000)/256; //设置初值TL0=(65536-50000)%256;EA=1; //开总中断ET0=1; //开定时器0中断}void keyscan() //按键设置函数{if(key1==0){delay(10); //按键消抖if(key1==0) //如果仍未低电平,则表明有按键按下{num=num+10; //十位显示加一if(num==100) //当数加到100时重新归0num=0;while(!key1); //等待按键释放}}if(key2==0){delay(10);if(key2==0){if(num==0) //当数减到0的时候重新从100开始减num=100;num=num-10; //十位显示减一while(!key2);}}if(key3==0){delay(10);if(key3==0){num++; //个位显示加一if(num==100) //当数加到100时重新归0num=0;while(!key3);}}if(key4==0){delay(10);if(key4==0){if(num==0) //当数减到0的时候重新从100开始减num=100;num--; //个位显示减一while(!key4);}}if(key5==0){delay(10);if(key5==0){num=0; //清0while(!key5);}}if(key6==0){delay(10);if(key6==0){while(!key6);TR0=~TR0; //启动或停止定时器0 }}}void main(){BEEP=0; //关闭蜂鸣器init(); //初始化函数while(1){keyscan(); //调用按键函数display(num); //调用显示函数}}void T0_time()interrupt 1{TH0=(65536-50000)/256;//重装初值TL0=(65536-50000)%256;numt0++;if(numt0==20) //如果到了20次,说明1s时间到{numt0=0; //将numt0清0,以待下次计数使用num--;if(num==0) //当数减少至0的时候,蜂鸣器响1s然后倒计时停止,{BEEP=1;delay(1000);BEEP=0;TR0=0; //关定时器0,秒表停止工作}}}。