《单片机电子钟课程设计论文.doc》由会员分享,可在线阅读,更多相关《单片机电子钟课程设计论文.doc(26页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、单片机电子钟课程设计单片机电子钟课程设计一、 设计内容要求1.电子钟 显示时、分、秒。2.具有定时报警功能;每天可设置4个报警时间(时、分)。3.能借助键盘,设置时钟及报警时间。4.报警时,蜂鸣器鸣响1秒,然后停止。5.停电后所有设定的数据不丢失。6.重新开机可以重新设定时钟。二、 硬件设计要求根据项目的要求,去选择相应的电路,比如MCU系统,输入输出驱动电路,电源供电电路。使用电子CAD,设计原理图,印刷电路板图。原理图中元件电气图形符号,必须符合国家标准。整体布局合理,标注规范、明确、美观,不产生歧义。列出完整的元件清单(标号、型号及大小、封装形式、数量)。估算电路板的功耗,并对供电形式提
2、出要求。根据设计好的原理图,焊接实物(可用万用板)三、软件设计要求n 简单的用户使用说明书。n 根据项目要求,设计软件整体规划,人机对话,各模块的关联,底层驱动模块。n 程序在必要的地方进行注释。n 每个函数的出入口要有输入输出参数的说明。n 程序必须具有良好的可读性,可重用,容易调试和维护。n 使用C语言进行编程,允许中间加插汇编。四、设计内容(一)、硬件设计4.1.1.晶振电路及XTAL1,XTAL2的连接 如右图1X1,X2分别是系统时钟信号Fosc的输入、输出端。 图1晶振电路模块一般的晶振的负载电容为15p或12.5p ,如果再考虑元件引脚的等效输入电容,则两个22p的电容构成晶振的
3、振荡电路就是比较好的选择。本课程设计使用的开发板是电子科技协会制作8051C单片机开发系统,该开发板的使用的是石英晶体振荡器,晶振频率为 fo=11.0592MHz,而振荡电容C1、C2的典型值取值范围为2033pF,所以这里取22pF的瓷介电容。注意:为减少寄生电容对振荡频率的影响,在印制板上的电容C1和C2应尽可能靠近CPU芯片的X1和X2引脚。4.1.2、复位电路及复位引脚RST的连接入作图2所示,开发板采用的是RC分立元件构成的外部复位电路。图2 复位电路掉电复位。当正常工作时,二极管D801反偏,断电后,VCC下降,当VCC=0时,VCC与地GND等电位,电容C801通过D801放电
4、,保证再上电时,RST引脚为高电平,CPU可靠复位。D801的作用是给电容C801提供放电通路。按键复位。但按下按钮PB801时,电容C801通过R802放电,当电容C801放电结束后,RET引脚电位由R802和R803分压比决定,由于R8020.7V,PN结导通,三极管饱和导通,从而驱动数码管DB0。图3 数码管显示电路设计数码管中各段发光二极管的伏安特性和普通二极管类似,只是正向压较大,正向电阻也大,在一定范围内,其正向电流也发光亮度成正比。由于常规的数码管起辉电流只有1-2mA,最大极限电流也只有10-30mA,最大不超过50mA,所以它的输入端在5V电源的电路信号相接时,一定要串加限流
5、电阻,以免损坏元件。 基极的限流电阻Rb:本设计使用的开发板,基极的限流电阻Rb=4.7K,则基极电流Ib=(VCC-Veb)/4.7K1mA,三极管8550的放大倍数100,则集电极的最大电流为100mA,每一位数码管有8段LED发光二极管,流过每一段发光二极管的电流为100/8=12.5mA,所以Rb=4.7k可以驱动数码管。集极的限流电阻Rc:以单个发光二级管分析,如图4所示,限流电阻Rc和LED内阻构成集电极的等效电阻R,其大小由LED二极管工作电流If决定,一般控制在320mA之间,根据电路图4分析可知,Ic=If=(VCC-Vf-Vces)/Rc,图4 单个发光二级管其中Ic为集电
6、极电流,If为LED工作电流,VCC为电源电压,Vces为三极管饱和压降,一般在0.10.2之间,Vf为LED导通电压,一般在1.22.5V之间。取Vf=2V,VCC=5V,Vces=0.2V,If=15mA时,求得限流电阻Rc大致为200。而在该开发板中,集级的限流电阻Rc=1K,取Vf=2v,则有上式可求得Ic=2.8mA,达到数码管的最小起辉电流12mA,因此可以使LED发亮,但发光效果不是很好,亮度比较小。 4.1.4、蜂鸣器模块图4 蜂鸣器模块电路如图所示,三极管的基极接单片机的P3.2口,当P3.2口输出低电平时,三极管导通,蜂鸣器可以发出声音。其基极的限流电阻R1401=10K,
7、当VCC=5V时,Ib=(VCC-0.7)/10K0.43mA,PNP三极管 8550的放大系数约为100,则最大集电极电流Ic大约43mA,足以驱动蜂鸣器工作。此时集极的限流电阻Rc的经典值为10。(注意,负载必须串联在集电极,而不是发射极,否则PNP驱动管不可能进入饱和状态,功耗大,而且负载的压降也小,蜂鸣器不能正常驱动) 4.1.5、键盘设计模块本设计使用的开发板,原来的设计4x4矩阵键盘,如图5所示。图5键盘模块电路设计P2.0P2.3为行线,P2.4P2.7为列线。由于设计的问题,导致该矩阵键盘的P2.7列键无法正常使用,又因为P2.5,P2.6资源分别被I2C占据了,从而导致P2.
8、5,P2.6列键无法使用。因此只能使用P2.4列键,即只有四个按键可以使用,其等效电路图如图5右图所示。 4.1.6、I2C总线图6 I2C硬件设计I2C总线是一种串行数据总线,只有二根信号线,一根是双向的数据线SDA如图所示,SDA连接单片机的P2.5,另一根是时钟线SCL,连接单片机的P2.6。I2C总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。 开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。延时时间必须大于4.7us. 结束信号:SCL为低电平时,SDA由低电平向高电平跳变,结束传送数据。 延时时间大于4us。 应答信号:接收数
9、据的IIC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单 元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。如果一段时间内没有收到从机的应答信号,则自动认为从机已正确接收到数据。 I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。如下图所示 控制字节AT24C02的芯片地址(0xa0为写,0xa1为读)在起始条件之后,必须是器件的控制字节,其中高四位为器件类型识别符一般固定为1010,接着
10、三位为片选,A0,A1,A2正好与芯片的1,2,3引角对应,为当前电路中的地址选择线,开发板上三根地址线都为0。因此高七位是从机的地址,而第八位则是传送方向位,0表示主机发送数据(写),1表示主机接收数据(读),如右图 任一地址写入数据格式 任一地址读取数据格式 4.1.7、USB转串口芯片(提供供电源,下载) 主要芯片PL2303 用于实现USB 和标准RS-232 串行端口之间的转换,完全遵从USB 1.1 协议,支持远程唤醒和电源管理,发送和接收拥有独立的256 Bytes 缓冲,支持内部ROM 和外部EEPROM 配置器件,内建晶体震荡器支持运行频率12 Mhz,内建USB 收发器。如
11、下图7所示。图7 USB转串口 4.1.8 、电路板功耗估算 供电功耗估算:LED发光二极管的发光电流4mA,则一个放光数码管通过的最大总电流为: I 8*4mA =32mA LED放光二极管的管压降为1.2V,则一个LED功率为:W = 1.2*32 31mW 整个电路板有8个数码管,但不是八个数码管都使用到,主要用到六个,而且每一个数码管也不是八段全亮,因此可大概取5个数码管计算 W = 5*31 = 155mW单片机平均功率约为100Mw,再加上AT24C02 EEROM芯片及74HC138芯片的功耗约为50mW。整块电路板运行情况下功耗为:W = 155+100+50 = 300mW测
12、得W=I总*VCC=56mA*5V=280mW300mW供电要求:由于单片机正常工作电压为5V,电路板功耗为300W左右.由此要求供电电路为恒压电路,输出电压为5V,输出功耗不小于300mW。4.1.9、相关电路元器件材料清单大小名称封装备注大小名称封装备注20R704AXIAL0.4RES8550Q604TO-92APNP BJT20R705AXIAL0.4RES8550Q606TO-92APNP BJT100R802AXIAL0.4RES8550Q603TO-92APNP BJT104C705RAD0.2Capacitor8550Q605TO-92APNP BJT104C704RAD0.2
13、Capacitor8550Q601TO-92APNP BJT104C703RAD0.2Capacitor8550Q607TO-92APNP BJT104C101RAD0.2Capacitor8550Q608TO-92APNP BJT104C104RAD0.2Capacitor8550Q602TO-92APNP BJT104C105RAD0.2Capacitor8550Q1401TO-92APNP BJT104C102RAD0.2Capacitor11.0592MY801AXIAL0.4Crystal Oscillator104C103RAD0.2Capacitor12MY701AXIAL0.4
14、Crystal Oscillator104C107RAD0.2Capacitor10ufC801RB.2/.4Capacitor104C106RAD0.2Capacitor22pC805RAD0.2Capacitor104C108RAD0.2Capacitor22pC701RAD0.2Capacitor104C1601RAD0.2Capacitor22pC702RAD0.2Capacitor10KR804AXIAL0.4RES22pC802RAD0.2Capacitor10KR1602AXIAL0.4RES4LEDDP6024位数码管10KR803AXIAL0.4RES4LEDDP6014位数
15、码管10KR1601AXIAL0.4RES74HC138U601DIP-1610KR1401AXIAL0.4RES80C52U801DIP-40CPU10R107AXIAL0.4RES8RESR801SIP9排阻1KR613AXIAL0.4RESAT24C02U1601DIP-8I2C1KR612AXIAL0.4RESCON2J1401SIP2Connector1KR611AXIAL0.4RESCON2J805SIP2Connector1KR614AXIAL0.4RESDPDTP701锁定开关1KR617AXIAL0.4RESIN4148D801DIODE0.4Diode1KR616AXIAL
16、0.4RESkey1PB4触点按钮1KR615AXIAL0.4RESkey2PB8触点按钮1KR701AXIAL0.4RESkey3PB12触点按钮1KR702AXIAL0.4RESkey4PB16触点按钮1KR703AXIAL0.4RESkeyRSTPB801触点按钮1KR1304AXIAL0.4RESLED0D701RB.2/.4发光二级管1KR1301AXIAL0.4RESLED0D702RB.2/.4发光二级管1KR1302AXIAL0.4RESP0J801SIP8Connector1KR1303AXIAL0.4RESP1J802SIP8Connector1kR610AXIAL0.4R
17、ESP2J804SIP8Connector4.7KR604AXIAL0.4RESP3J803SIP8Connector4.7KR605AXIAL0.4RESPL_2303HXU701DIP284.7KR602AXIAL0.4RESSPEAKERLS1401RB.4/.8蜂鸣器4.7KR603AXIAL0.4RESUSBJ701USB口4.7KR606AXIAL0.4RES4.7KR609AXIAL0.4RES4.7KR805AXIAL0.4RES4.7KR607AXIAL0.4RES4.7KR608AXIAL0.4表1 元件清单表RES4.1.10、电路总图见附录一(二)软件设计4.2.1、操
18、作使用说明 打开开关,启动时钟,单片机将从I2C中读取数据,时钟开始工作。8位数码管分别显示“时-分-秒”,在设计闹钟状态下时,显示“时-分-第N个闹钟”。当按一下KEY3键,时钟进入调时状态;连续按两下KEY3键,时钟进入第2个闹钟设置状态;同理按三下进入第2个闹钟设置状态,可以设置4个闹钟。在调时,设置状态下,按KEY1键,KEY2键可以分别让时位数,分位数+1,此时数码管显示用户设置的时间。设置结束,按下KEY4键作为确认,系统将把该数据储存到I2C,以掉电保护,并以设置好的时间进行计时,判断闹钟时间。当时间与某个闹钟相同时,蜂鸣器将会鸣叫一秒钟。4.2.2、时钟主要程序设计 本课程设计
19、利用单片机芯片的定时器来固定时间,但该方法做出来的时钟不是十分精确,不做长期保留,仅供学习研究。 选用T1计时器,产生一个50ms中断,循环20次,即为一秒。则1min为60个周期,1h为3600个周期。该开发板采用11.0592MHz晶体振荡器,初值:TH1=(65536-50000/(12/11.0592)/256=76=0x4C图8 计时流程图TL1=(65536-50000/(12/11.0592)%256=04.2.3、键盘程序设计按键功能:KEY1(0xe7):调时;KEY2(0xeb):调分;KEY3(0xed):进入设置时时间,设置闹钟状态;图9 按键定义KEY4(0xee):
20、设置结束,确认按键识别:本课程设计采用行列描法判断是否有键按下。将列键置低,即令P2.4置低,然后读取行线状态,当P2.0P2.3的其中一行的电平为高,则表示无键按下;当行线均为高电平时,则无键按下。图10 键盘程序流程图判断闭合键的位置。确认有键按下时,进入确认闭合键过程。由于只用到P2.4控制的列键。令P2.4置低电平,依次将行线置低电平,即在置某根行线为低电平时,其余行线为高电平。当确定某根行线为低电平后,即可得出对应的键值0xen。(n=7,b,e,d)4.2.4、I2C程序流程(具体介绍,请看硬件I2C部分)图11 I2C写 读流程图4.2.5、中断与主程序流程图图12 中断部分流程
21、图图 13 总程序流程图4.2.6、总程序清单见附录二五、调试过程与结果分析在本次课程设计中,我用Keil uVision3 软件和电子科技协会制作的STC89C52单片机开发系统调试程序,经过多次调试,了解了如何进行编译、连接,还读懂了单片机的相关电路原理图,但是在下载程序运行后并没有显示理想的效果。在检查了多次之后,还是没有找出错误。接近四星期的日子里,不断查阅资料,虚心请教同学和老师,不断对程序进行分析,拆合,修改,调试。经过努力,虽然编写的程序比较简单,单片机试验的功能不是出众,但基本把老师布置的内容,按时完成。以后会再加强程序调试和硬件方面的能力,希望能在这个基础上加以改进。六、总结
22、与体会接近两个多月的单片机课程设计,使我学到了很多很多,不仅巩固了以前所学过的模电,数电,单片机及C语言知识,而且学到了很多在书本上所没有学到过的知识,如protel99se,KeiC的软件使用,感光板的制作,元器件的结构,功能,焊接的工艺技巧等。通过这次课程设计,我懂得了理论与实际相结合的重要性,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题会很多,同时在设计的过程中发现了自己还有许多不足之处,所学到的知识还远远不够, 对以前所学过的知识理解得也不够深刻,掌握得不够牢固,以至于还有一些功能要求难以
23、完成,对单片机的结构还有些模糊不清。如果有时间,我还会加强对时钟芯片DS1302,温度采集,红外遥控等的开发研究。总之,这次课程设计不但增加和巩固了我的单片机方面的知识,包括软、硬件方面,而且增强了我们的动手能力及我们的团队合作精神,在此对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!七、附录附录一 电路原理总图图14 电路总图附录二 程序清单 #include #define uchar unsigned char #define uint unsigned int uchar code table=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x
24、80,0x90,0xbf;/*09,-,的数码管段码*/ uchar hour=0,min=0,sec=0; /*时、分、秒单元清零*/ uchar disbuf8=0,0,10,0,0,10,0,0; /缓存数组/ uchar du=0xfc,0xfd,0xfe,0xff,0xf8,0xf9,0xfa,0xfb; /字位选通 uchar a,b,i,j,temp,beeptime,num,ta,k; uchar timechange,endchange; uchar settime1,settime2,settime3,settime4,endset1,endset2,endset3,end
25、set4; uchar count1,count2,set; uchar sethour1,setmin1,setsec1;sethour2,setmin2,setsec2; uchar sethour3,setmin3,setsec3;sethour4,setmin4,setsec4; sbit beep=P32; sbit sda=P25; sbit scl=P26; uchar flag,x,n; /延时程序/ void delay(uchar x) uchar a,b; for(a=0;ax;a+) for(b=0;b25;b+) ;/I2C相关程序/ void delay1() ;
26、void start() /发送开始条件 sda=1;delay1();scl=1;delay1(); /大于4.7ussda=0;delay1(); void stop() /发送停止条件sda=0;delay1();scl=1;delay1();sda=1;delay1();void respons() /应答uchar i;scl=1;delay1();while(sda=1)&(i250)i+;scl=0;delay1();void write_byte(uchar date) /向总线写入的字节uchar i,temp;temp=date; for(i=0;i8;i+)temp=te
27、mp1;scl=0; delay1();sda=CY;delay1();scl=1;delay1();scl=0;delay1();sda=1;delay1();uchar read_byte()/从总线读出的字节uchar i,k;scl=0;delay1();sda=1;delay1();for(i=0;i8;i+)/数据长度为8位scl=1;delay1();k=(k=60) sec=0; min+; if(min=60) min=0; hour=0; if(hour=24) hour=0; /显示时间程序/ void showtime() disbuf7=hour/10;/将时间从十六
28、进制数转换为十进制,写入显示数组 disbuf6=hour%10; disbuf4=min/10; disbuf3=min%10; disbuf1=sec/10; disbuf0=sec%10; /数组显示子程序/ void scandisp() for(i=0;i8;i+) P0=tabledisbufi; /P0口送字型 P1=dui; /P1口送字位 delay(20); /键盘预扫描/uchar keysearch() P2=0xf0; /全行线置低电平P2.0-P2.3temp=P2;temp=temp; /检查行线状态,当全部行线均为高电平时,则无键按下temp=temp&0x10
29、; return temp; /无按键按下时,返回值应为0 /键盘扫描,读取键值程序/ uchar keyscan() uchar ta; ta=keysearch(); /调用键盘预扫描if(ta=0) return 0x8f;/如果无键按下就返回虚拟键值0x8f ta=keysearch(); /再次调用键盘预扫描if(ta=0) return 0x8f; /在次扫描目的是防止键盘抖动,可以无须再加延时/ else /如果有键按下就执行以下操作ta=0xef; /置P2.4(列)为低电平,while(ta&0x01)!=0) /逐行扫描。/ P2=ta; num=P2; return (n
30、um);/获取扫描码/ ta=(ta1); ta+; /键值定义子程序/void keybranch(uchar k) switch(k) case 0xe7: if(count1=23) /key1键,小时加1 disbuf7=count1/10; disbuf6=count1%10; count1+; else count1=0; break; case 0xeb: if(count2=59) /key2键,分钟加1 disbuf4=count2/10; disbuf3=count2%10; count2+; else count2=0; break; case 0xee: if(sett
31、ime1=1) /key4键,设置调时,闹钟,完成确认 settime1=0; endset1=1; if(settime2=1) settime2=0; endset2=1; if(settime3=1) settime3=0; endset3=1; if(settime4=1) settime4=0; endset4=1; if(timechange=1) timechange=0; endchange=1; break; default:break; /主程序/void main() ET1=1; /定时器1中断/ EA=1; /打开中断开关 TMOD=0x10;/选择定时模式1 TH1
32、=0x4c; /*设置时间TH1=(65536-50000/(12/11.0592)/256=4c*/ TL1=0; TR1=1; begin(); /调用初始化函数 while(1) /无限循环/ k=keyscan();if(k!=0x8f)/有键按下 if(k=0xed)/判断key3键,启动设置 set+; if(set=1) /设置时钟时间 timechange=1; showtime();settime4=4; if(set=2) /设置闹钟1 settime1=1; disbuf7=sethour1/10; disbuf6=sethour1%10; disbuf4=setmin1/10; disbuf3=setmin1%10; disbuf1=10; disbuf0=1; if(set=3) /设置闹钟2 settime2=1;settime1=0; disbuf7=sethour2/10; dis