课程设计(单片机系统设计)单片机电子时钟.doc
Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-date课程设计(单片机系统设计)单片机电子时钟课程论文首页课程论文首页院、系(部)闽江学院物理学与电子信息工程系专业电子信息工程班级12电信(2)班学号3121003210姓名李书杰任课教师薛小铃,贾俊荣课程名称 课程设计(单片机系统设计)论文题目单片机电子时钟成绩评语签字:年 月 日复核人意见签字:年 月 日(单片机系统设计)课程设计-单片机电子时钟中文摘要:本课程设计是利用89C52单片机最小系统,综合应用单片机定时器、中断、液晶显示、蜂鸣报警、独立式键盘输入等知识,设计电子时钟。采用延时程序产生一定的时间中断,用于一秒的定义,通过计数方式进行满六十秒分钟进一,满六十分小时进一,满二十四小时小时清零。在完成计时的基本要求之后对电子时钟的功能进行拓展,设计闹铃电路。闹铃电路是根据计时系统的输出状态产生一脉冲信号,然后去触发蜂鸣器实现闹钟功能。显示部分利用LCD1602显示,加上按键的人机交换可以随时对时间进行调整。电源电路部分,使用开发板或者试验箱上的5V电源进行供电。关键词:单片机 电子时钟 延时一、整体设计1、图1是电子时钟整体设计框图。由电源、按键、蜂鸣器、液晶显示组成。电源按键蜂鸣器LED液晶最小单片机系统 图1电子时钟总体方框图2、整机工作原理 电子钟的工作主要框图如图1所示:电子钟电路的核心AT89S52单片机,其内部有8KB 的ROM,无须外扩程序储存器。当从键盘电路获得按键信息,经过软件协调驱动硬件电路工作,由单片机生成相应操作代码并再通过限流传送给显示电路,从而显示出从键盘处获得的信息。在整个过程中,由时钟电路提供单片机保持稳定工作的工作时钟;复位电路利用按键复位功能,其中按键是从键盘电路得到的。 整点报时电路是根据计时系统的输出状态产生一脉冲信号,然后去触发蜂鸣器实现报时。另系统配备LCD显示,STC89C52的P0口和P1.0P1.2口作为LCD的输入口。二、 硬件电路设计2. 1 89S52单片机最小系统 AT89C52单片机作为电子时钟的最小系统与电源按键DS1302时钟芯片等完成设计功能是设计的核心部分其组成如图2.1所示: VCC:电源。 GND:接地。 P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程 序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作 输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。 P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻 拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存 储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器 的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。P3口也可作为AT89C51的一些特殊功能口,如下表所示:口管脚 备选功能P3.0 RXD(串行输入口)P3.1 TXD(串行输出口)P3.2 /INT0(外部中断0)P3.3 /INT1(外部中断1)P3.4 T0(记时器0外部输入)P3.5 T1(记时器1外部输入)P3.6 /WR(外部数据存储器写选通)P3.7 /RD(外部数据存储器读选通) P3口同时为闪烁编程和编程校验接收一些控制信号。RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE 端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器 时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。 PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。EA/VPP:当/EA保持低电平时,则在此期间外部程序存储(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时, /EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。 图2.1 89S52单片机最小系统 2.1.1.电子时钟设计的整体思想原理说明:利用定时器T0定时,每隔10ms产生一次中断,中断100次(1s)后秒单元加1;秒单元second满60后向分单元进位,分单元minute加1;当分单元满60后时单元hour加1。 2.1.2电子时钟显示思想利用1602液晶进行显示第一行显示年月日,第二行显示时分秒。实物电路如图2.1.2 图2.1.22.2电源电路没有制作电源电路部分。使用开发板或者试验箱上的5V电源进行供电。2.3按键电路独立式按键 如图2.3l 按键1为功能键 按一次可分别进入调节时钟的秒和分、时、日、月、年,按两次可调节闹钟定时时间,按三次返回正常显示时间。加键,每按一下相应位置数值加一。l 按键2设定调节时分秒的位置l 按键3,按键4分别为数字加一和减一键。l 复位键,按一下时间复位。 图2.3 独立式按键2.4蜂鸣器单片机端口输出的方波经放大滤波后,驱动蜂鸣器发声。如图2.4 图2.42.5复位电路:STC89C52单片机通常采用上电自动复位和按钮复位(如图2.5)两种方式:(一)上电自动复位是通过外部复位电路的电容充电来实现,这样,只要电VCC的上升时间不超过1ms,就可以实现上电自动复位。(二)按键手动复位有电平方式和脉冲方式两种,其电平复位是通过使复位端通过VCC电源与电阻接通来实现的,而脉冲复位则是利用了RC微分电路产生的正脉冲来实现的。本设计选用上电与按键均有效的复位电路,它不仅在上电时可以自动复位,而且在单片机运行期间,利用按键也可以完成复位操作. 图2.52.6时钟振荡电路:在MCS52芯片内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,输出端为引脚XTAL2,在芯片的外部通过两个引脚跨接晶体振荡器和微调电容,形成反馈电路,就0够成了一个稳定的自激振荡器。如图2.6 图2.62.7 PCB封装图 如图2.7所示 图2.7三、 程序设计3.1主程序流程图: 主程序先开始,然后启动定时器,并LCD初始化和显示时间,后扫描键盘,判断功能键是否按下。图3.1 主程序流程图 图3.2 延时程序约1ms图3.3子程序按键流程 四、 实验操作相关图: 见附录1五、 程序如下 见附录2六、总结通过通过此次试验更加深刻的将课本理论与实际结合进一步熟悉单片机芯片的结构及掌握了其工作原理和具体使用方法与相关元件的参数计算方法,深刻了解电路板的开发和制作。调试要点:首先确保各器件的完好性,其次检测各芯片的电源线和地线是否接触良好,然后焊接器件,接好电源用万用表检测各电源端、地端的状态是否正常。拿到电路板后,首先要检查加工质量,并确保没有任何方面的错误,如短路和断路,尤其要避免电源短路;元器件在安装前要逐一检查,用万用表测其数值,看是否与所用相同;完成焊接后,应先空载上电(芯片座上不插芯片),并检查各引脚的电位是否正确。若一切正常,方可在断电的情况下将芯片插入,再次检查各引脚的电位及其逻辑关系。将万用表的探针放到单片机接电源的引脚上检测一下,看是否符合要求。检查无误后插上AT89S51并烧写一简易的程序,观察电路是否能协同工作。最后烧写工作程序,根据显示现象调试程序直至成功。这次的设计使我认识到本人对单片机方面的知识知还不够全面,对于书本上的很多知识还不能灵活运用,在对电路的焊接处理还是不够熟练,从中学到了一些很重要的东西,可以很好的将理论转化成实践之后的产物。我在这一次数字电子钟的设计过程中,很是受益匪浅。通过对自己在大学三年时间里所学的知识的回顾,并充分发挥对所学知识的理解和对毕业设计的思考及书面表达能力,最终完成了。这为自己今后进一步深化学习,积累了一定宝贵的经验。撰写论文的过程也是专业知识的学习过程,它使我运用已有的专业基础知识,对其进行设计,分析和解决一个理论问题或实际问题,把知识转化为能力的实际训练。培养了我运用所学知识解决实际问题的能力。通过这次课程设计我发现,只有理论水平提高了;才能够将课本知识与实践相整合,理论知识服务于教学实践,以增强自己的动手能力。这个实验十分有意义 我获得很深刻的经验。七.元器件清单:器件名称数目DIP40脚插座1STC89C52RC-40C-PDIP401蜂鸣器 5V1单排针(长11MM)1*40PIN2.54mm412MHZ 石英晶振1石英晶振 32.768K130PF 瓷片电容24脚开关5电解电容 25V/10uF 体积5*1111K电阻110K 电阻 24.7K 电阻4S9012三极管1LCD液晶屏1200欧电阻49P排阻1参考文献:1薛小铃. 单片机系统设计课程设计指导书R.福州:闽江学院电子工程教研室,2011.92李朝青. 单片机原理及接口技术M北京:北京航空航天大学出版社,2006.123张迎新,单片机原理、应用及接口技术(第二版) M.北京:国防工业出版社,2010.94潘永雄。新编单片机原理与应用 M.西安:西安电子科技大学出版社,2009.25付家才。单片机控制实践技术 M.北京:化学工业出版社,2011.36刘军等,单片机原理与接口技术 M.上海:华东理工大学出版社,2008.67何书森等,电子线路设计速成 M.胡州:互见科学技术出版社,2009.10附录:1、 与本次试验相关图如下: 2.程序-#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit key1=P10;sbit key2=P11;sbit keyup=P12;sbit keydw=P13;sbit beep=P23;sbit lcdrs=P14;sbit lcdrw=P15;sbit lcden=P16;uchar table2="0123456789-"int m1,m2,m3,m4,m5,m6,k,n,p,q,m8,w,a,ri,yue,nian;void delayms(int j)int i;for(j;j>0;j-)for(i=125;i>0;i-);/ LCD写地址void writecom(uchar com)lcden=0;lcdrs=0;lcdrw=0;delayms(1);lcden=1;delayms(1);P0=com;delayms(1);lcden=0;/LCD写数据void writedata(uchar dat)lcden=0;lcdrs=1;lcdrw=0;delayms(1);lcden=1;delayms(1);P0=dat;delayms(1);lcden=0;/ LCD初始化void LCD_Init()delayms(15);writecom(0x38);delayms(5);writecom(0x38);delayms(5);writecom(0x38);writecom(0x38);writecom(0x08);writecom(0x01);writecom(0x06);writecom(0x0c);void beepinit(void)beep=0;delayms(100);beep=1;void beep2()beep=0;delayms(500);beep=1;void display()writecom(0x80+0x02);writedata(table2nian/1000);writedata(table2nian%1000/100);writedata(table2nian%100/10);writedata(table2nian%10); writedata(table210);writedata(table2yue/10);writedata(table2yue%10); writedata(table210);writedata(table2ri/10);writedata(table2ri%10);writecom(0x80+0x40);writedata(table2m1/10);writedata(table2m1%10);writedata(table210);writedata(table2m2/10);writedata(table2m2%10);writedata(table210);writedata(table2m3/10);writedata(table2m3%10);writecom(0x80+0x48);writedata(table2m4/10);writedata(table2m4%10);writedata(table210);writedata(table2m5/10);writedata(table2m5%10);writedata(table210);writedata(table2m6/10);writedata(table2m6%10); if(k>=20)k=0;m3+;m8+;if(m3>=60)m3=m3-60;m2+;if(m2>=60)m2=m2-60;m1+;if(m1>=24)m1=m1-24;ri+; switch(yue)case 1:case 3:case 5:case 7:case 8:case 10:case 12:if(ri>=32) yue+;ri=ri-31; break;case 4:case 6:case 9:case 11: if(ri>=31) yue+;ri=ri-30; break;case 2:if(nian%100=0&nian%400=0)|(nian%100!=0&nian%4=0) if(ri>=29) yue+;ri=ri-28; else if(ri>=30) yue+;ri=ri-29; break;default: yue=1; break;if(m6>=60)m6=m6-60;m5+;if(m5>=60)m5=m5-60;m4+;if(m4>=24)m4=m4-24;/上调时钟void keyupinit()if(p=1) /时间上调if(!keyup)delayms(1);if(!keyup)switch(n)case 1: m3=m3+1; break;case 2: m3=m3+10; break;case 3: m2=m2+1; break;case 4: m2=m2+10; break;case 5: m1=m1+1; break;case 6: m1=m1+10; break;case 7: ri=ri+1; break;case 8: ri=ri+10; break;case 9: yue=yue+1; break;case 10: yue=yue+10; break;case 11: nian=nian+1; break;case 12: nian=nian+10; break;case 13: nian=nian+100; break;case 14: nian=nian+1000; break;beepinit();while(!keyup); if(p=2) / 闹钟上调if(!keyup)delayms(1);if(!keyup)switch(n)case 1: m6=m6+1; break;case 2: m6=m6+10; break;case 3: m5=m5+1; break;case 4: m5=m5+10; break;case 5: m4=m4+1; break;case 6: m4=m4+10; break;beepinit();while(!keyup); /下调时钟void keydwinit()if(p=1) /时间下调if(!keydw)delayms(1);if(!keydw)switch(n)case 1: m3=m3-1; break;case 2: m3=m3-10; break;case 3: m2=m2-1; break;case 4: m2=m2-10; break;case 5: m1=m1-1; break;case 6: m1=m1-10; break;case 7: ri=ri-1; break;case 8: ri=ri-10; break;case 9: yue=yue-1; break;case 10: yue=yue-10; break;case 11: nian=nian-1; break;case 12: nian=nian-10; break;case 13: nian=nian-100; break;case 14: nian=nian-1000; break; beepinit();while(!keydw); if(p=2) / 闹钟下调if(!keydw)delayms(1);if(!keydw)switch(n)case 1: m6=m6-1; break;case 2: m6=m6-10; break;case 3: m5=m5-1; break;case 4: m5=m5-10; break;case 5: m4=m4-1; break;case 6: m4=m4-10; break;beepinit();while(!keydw); /选择位数/p:模式选择void xuanze() n=1;p=1;while(p=1)/时间模式if(!key2)delayms(5);beepinit();while(!key2);n=n+1;if(n=15)n=1;keyupinit();keydwinit();if(m1<0) m1=m1+24;if(m2<0) m2=m2+60;if(m3<0) m3=m3+60;display();if(!key1)delayms(2);beepinit();while(!key1);p=2; delayms(1); n=1;while(p=2)/闹钟模式if(!key2)delayms(5);beepinit();while(!key2);n=n+1;if(n=7)n=1;keyupinit();keydwinit();if(m4<0) m4=m4+24;if(m5<0) m5=m5+60;if(m6<0) m6=m6+60;display();if(!key1)delayms(2);beepinit();while(!key1);p=3;/选择模式void key1init()TR0=0;xuanze();delayms(5);if(p=3)TR0=1;void main()TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;/总开关ET0=1;/定时器t0中断允许TR0=1; /开启定时器m1=m2=m3=q=m4=m5=m6=0;nian=2014;yue=01;ri=01;LCD_Init();while(1)if(!key1)delayms(2);beepinit();while(!key1);key1init();delayms(3);if(m4=0)&&(m5=0)&&(m6=0) / 初始值不计闹钟w=0;else w=1;if(m1=m4)&&(m2=m5)&&(m3=m6)&&w) /判断闹钟q=1;m8=0;if(q=1)if(m8<=30)beep2();elseq=0;display(); void timer0() interrupt 1TH0=(65536-50000)/256;TL0=(65536-50000)%256;k+;