多功能电子钟设计 (2).doc_第1页
多功能电子钟设计 (2).doc_第2页
多功能电子钟设计 (2).doc_第3页
多功能电子钟设计 (2).doc_第4页
多功能电子钟设计 (2).doc_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘 要本论文设计一个基于单片机的集电子钟、流水灯多种功能于一体的多功能电子钟。单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。本文的主要内容是用AT89C52单片机为核心控制元件,设计一个电子钟。以单片机作为主控核心,与键盘、开关、扬声器等模块组成核心主控制模块,在主控模块上设有3个按键,四个开关,数码管和扬声器。本系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比较高等,具有一定的实用和参考价值。关键词:AT89C52单片机 电子钟 流水灯 目录1.引 言22. 总体设计32.1基本原理32.2系统总体框图及设计思路43.详细设计53.1 硬件设计53.2软件设计.103.2.1程序设计思路113.2.2 程序流程图123.2.3 程序代码134. 系统调试及分析265.心得体会29参考文献301 引 言单片微型计算机是大规模集成电路技术发展的产物,属第四代电子计算机,它具有高性能、高速度、体积小、价格低廉、稳定可靠、应用广泛的特点。它的应用必定导致传统的控制技术从根本上发生变革。因此,单片机的开发应用已成为高科技和工程领域的一项重大课题。 1957年,Ventura发明了世界上第一个电子表,从而奠定了电子时钟的基础,电子时钟开始迅速发展起来。现代的电子时钟是基于单片机的一种计时工具,采用延时程序产生一定的时间中断,用于一秒的定义,通过计数方式进行满六十秒分钟进一,满六十分小时进一,满二十四小时小时清零。从而达到计时的功能,是人民日常生活补课缺少的工具。现在高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟、石英钟、石英表都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调试,数字式电子钟用集成电路计时时,译码代替机械式传动,用LED显示器代替指针显示进而显示时间,减小了计时误差,这种表具有时、分、秒显示时间的功能,还可以进行时和分的校对,片选的灵活性好。 2 总体设计2.1基本原理数字时钟是本设计的最主要的部分。根据需要,可利用两种方案实现。方案一:本方案采用Dallas公司的专用时钟芯片DS12887A。该芯片内部采用石英晶体振荡器,其芯片精度不大于10ms/年,且具有完备的时钟闹钟功能,因此,可直接对其以用于显示或设置,使得软件编程相对简单。为保证时钟在电网电压不足或突然掉电等突发情况下仍能正常工作,芯片内部包含锂电池。当电网电压不足或突然掉电时,系统自动转换到内部锂电池供电系统。而且即使系统不上电,程序不执行时,锂电池也能保证芯片的正常运行,以备随时提供正确的时间。方案二:本方案完全用软件实现数字时钟。原理为:在单片机内部存储器设三个字节分别存放时钟的时、分、秒信息。利用定时器与软件结合实现1秒定时中断,每产生一次中断,存储器内相应的秒值加1;若秒值达到60,则将其清零,并将相应的分字节值加1;若分值达到60,则清零分字节,并将时字节值加1;若时值达到24,则将十字节清零。该方案具有硬件电路简单的特点。但由于每次执行程序时,定时器都要重新赋初值,所以该时钟精度不高。而且,由于是软件实现,当单片机不上电,程序不执行时,时钟将不工作。基于硬件电路的考虑,本设计采用方案二完成数字时钟的功能。2.1.1数码管显示方案方案一:静态显示。所谓静态显示,就是当显示器显示某一字符时,相应的发光二极管恒定的导通或截止。该方式每一位都需要一个8 位输出口控制。静态显示时较小的电流能获得较高的亮度,且字符不闪烁。但当所显示的位数较多时,静态显示所需的I/O口太多,造成了资源的浪费。方案二:动态显示。所谓动态显示就是一位一位的轮流点亮各个位,对于显示器的每一位来说,每隔一段时间点亮一次。利用人的视觉暂留功能可以看到整个显示,但必须保证扫描速度足够快,字符才不闪烁。显示器的亮度既与导通电流有关,也于点亮时间与间隔时间的比例有关。调整参数可以实现较高稳定度的显示。动态显示节省了I/O口,降低了能耗。从节省I/O口和降低能耗出发,本设计采用方案二。2.2系统总体框图及设计思路 3 详细设计3.1 硬件设计3.1.1电源部分 图3-2如图3-2所示,从外部引入5.0V的直流电,为单片机、复位电路提供电源。3.1.2复位电路图3-3如图3-3所示,复位电路主要由型号为1N4148的二极管,型号为10UF/16V的电解电容,型号为104的瓷片电容,10K的电阻以及按键S1构成,S1接芯片的相应引脚RST,当开关按下时引脚RST为高电平1,断开时引脚为低电平0。3.1.3位选部分图3-5图3-5为位选电路,三极管的集电极接数码管的公共端,当P2口对应的引脚输出高电平时三极管导通,对应的数码管显示数据。这样,在同一时刻,6位LED中只有选通的那1位显示出字符,而其他5位则是熄灭的。同样,在下一时刻,只让下一位的位选线处于选通状态,而其他个位的位选线处于关闭状态,在段码线上输出将要显示字符的段码,则同一时刻,只有选通位显示出相应的字符,而其他各位则是熄灭的。如此循环下去,就可以使各位显示出将要显示的字符。虽然这些字符是在不同时刻出现的,而在同一时刻,只有一位显示,其他各位熄灭,但由于LED的余辉和人眼的视觉暂留作用,只要每位显示间隔足够短,则可以造成多位同时亮的假象,达到同时显示的效果。3.1.4数码管的连接电路沈阳理工大学课程设计专用纸 .30图3-6图3-6为数码管的引脚图,每位的段码线(a,b,c,d,e,f,g,dp)分别与1个8位的锁存器输出相连,由AT89S51控制组合09十个数据,如令其显示1则b,c引脚(即2,3引脚)送高电平,此时数码管显示1。由于各位的段码线并联,8位I/O口输出段码对各个显示位来说都是相同的。AT89S51是美国ATMEL公司生产的低功耗,高性能CMOS 8位单片机,片内含4K bytes的可系统编程的Flash只读程序存储器,器件采用ATMEL公司的高密度,非易失性存储技术生产,兼容标准8051指令系统及引脚。AT89S51提供以下标准功能:4K字节Flash闪速存储器,128字节内部RAM,32I/O口线,看门狗(WDT),两个数据指针,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。如图3-7所示,AT89S51有40引脚,双列直插(DIP)封装,所用引脚功能如下:1. VCC 运行时加4.5V2. GND 接地3. XTAL1 振荡器反相放大器及内部时钟发生器的输入端4. XTAL2 振荡器反相放大器的输出端5. RST 复位输入,高电平有效,在晶振工作时,在RST引脚上作用2个机器周期以上的高电平,将使单片机复位。WDT溢出将使该引脚输出高电平,设置SFT AUXR的DISRTO位(地址8EH)可打开或关闭该功能。DISRTO位缺省为RESET输出高电平打开状态。6. EA/VPP 片外程序存储器访问允许信号。欲使CPU仅访问外部程序存储器(地址为0000H-FFFFH),EA端必须保持低电平(接地),如果EA端为高电平(接Vcc端),CPU则执行内部程序存储器中的指令。7. P1口,P2口P1,P2是一组带内部上拉电阻的8位双向I/O口。运行时通过P1口控制驱动电路的工作,将数据送到数码管,显示相应的段码,为了达到减少功耗或满足端口对最大电流的限制,应加上一限流电阻。P2.0P2.5口控制数码管的位选,使六个数码管轮流显示数据,等于1时位选三极管导通,等于0 时位选三极管截止。8. 无自锁开关(S2P3.7)开关接相应引脚P3.7,当开关按下时,相应引脚为低电平0,断开时引脚为高电平1。9. PCB图:流水灯硬件原理图32软件设计. 3.2.1程序设计思路流水灯部分为由八个灯分时点亮,并由一个开关控制其变换方式。从硬件原理图中可以看出,如果要让接在P1.0口的LED1亮起来,那么只要把P1.0口的电平变为低电平就可以了;相反,如果要接在P1.0口的LED1熄灭,就要把P1.0口的电平变为高电平;同理,接在P1.1P1.7口的其他7个LED的点亮和熄灭的方法同LED1。因此,要实现流水灯功能,我们只要将发光二极管LED1LED8依次点亮、熄灭,8只LED灯便会一亮一暗的做流水灯了。在此我们还应注意一点,由于人眼的视觉暂留效应以及单片机执行每条指令的时间很短,我们在控制二极管亮灭的时候应该延时一段时间,否则我们就看不到“流水”效果了。单片机的应用系统由硬件和软件组成,上述硬件原理图搭建完成上电之后,我们还不能看到流水灯循环点亮的现象,我们还需要告诉单片机怎么来进行工作,即编写程序控制单片机管脚电平的高低变化,来实现发光二极管的一亮一灭。软件编程是单片机应用系统中的一个重要的组成部分,是单片机学习的重点和难点。下面我们以最简单的流水灯控制功能即实现8个LED灯的循环点亮,来介绍实现流水灯控制的几种软件编程方法。在主程序的开始定义了一组固定单元用来存储计数的分、秒、时的存储单元。在主程序中,对不同的按键进行扫描,实现秒表,时间调整。系统总体流程图如图3所示。3.2.2 程序流程图3.2.3 程序代码1、预定义部分 #include#define char unsigned char code char tmpled90=0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80,0X81,0X82,0X84,0X88,0X90,0XA0,0XC0,0XC1,0XC2,0XC4,0XC8,0XD0,0XE0,0XE1,0XE2,0XE4,0XE8,0XF0,0XF1,0XF2,0XF4,0XF8,0XF9,0XFA,0XFC,0XFD,0XFE,0XFF,0XFF,0X00,0XFF,0X00,0X00,0XFF,0XFF,0X00,0X00,0X80,0X40,0X20,0X10,0X08,0X04,0X02,0X01,0X81,0X41,0X21,0X11,0X09,0X05,0X03,0X83,0X43,0X23,0X13,0X0B,0X07,0X87,0X47,0X27,0X17,0X0F,0X8F,0X4F,0X2F,0X1F,0X9F,0X5F,0X3F,0XBF,0X7F,0XFF,0XFF,0X00,0XFF,0X00;/定义数组常量,表示流水灯的变换方式,前面加code表示常量在程序代码中存放,不占用RAM。该数组为发光二极管的输出数据Code char li33=0X81,0X42,0X24,0X18,0X99,0X5A,0X3C,0XBD,0X7E,0XFF,0XFF,0XE7,0XC3,0X81,0X00, 0X18,0X00,0X18,0X24,0X42,0X81, 0X99,0XA5,0XC3,0XDB,0XE7,0XFF,0XFF,0X00,0XFF,0X00;/此数组表示流水灯的另一种变换方式 char code dis_711=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff; char code scan_con8=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f; char data timedata6=0x00,0x00,0x00,0x00,0x00,0x00; char data dis8=0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; char data conls=0x00,con04s=0x00,con=0X00; sbit key0=P10; sbit key1=P11; sbit key2=P12; sbit been=P13; sbit key3=P14; sbit key4=P15; sbit key5=P16;2、功能控制通过开关控制闹铃部分void wen(void) if (timedata0=5&timedata1=4&timedata2=0&timedata3=0&timedata4=0&timedata5=0&key3=0) been=been; else been=1; 3、数码管显示部分本段采用的是共阴极LED数码管:scan() char k; for(k=0;k=6) con=0;TR1=0;ET1=0;TR0=1;ET0=1; if(con!=0) if(key1=0) delay1ms(10); while(key1=0); timedatacon+; if(timedatacon=10) timedatacon=0; discon=timedatacon;dis6=0x0a; if(con!=0) if(key2=0) delay1ms(10); while(key2=0); if(timedatacon=0) timedatacon=0x09; elsetimedatacon-; discon=timedatacon;dis6=0x0a; EA=1;5、产生时钟部分: 对晶振周期计数,记满一秒产生中断,计数显示秒位加一void time_intt0(void) interrupt 1 ET0=0;TR0=0;TH0=0x3C;TL0=0XB0;TR0=1; conls+; if(conls=20) conls=0x00; timedata0+ ; if(timedata0=10) timedata0=0;timedata1+; if(timedata1=6) timedata1=0;timedata2+; if(timedata2=10) timedata2=0;timedata3+; if(timedata3=6) timedata3=0;timedata4+; if(timedata4=10) timedata4=0;timedata5+; if(timedata5=2) if(timedata4=4) timedata4=0;timedata5=0; dis0=timedata0;dis1=timedata1;dis2=timedata2; dis3=timedata3;dis4=timedata4;dis5=timedata5; ET0=1; void time_intt1(void) interrupt 3 EA=0;TR1=0;TH1=0x3C;TL1=0xB0;TR1=1; con04s+; if(con04s=8) con04s=0x00; dis7=discon;discon=dis6;dis6=dis7; EA=1; 6、流水灯控制部分:共两个开关,一个切换数码管与流水灯的亮灭,一个用来切换流水灯自身的点亮方式void lsd(void) char n; char i; iii: for(n=0;n100;n+) if(key5=1)/循环输出40个数据 if(key4=1) P3=tmpledn;/这个符号是取反,因发光二极管采用共阳极,所以将数据取反再输出 delay1ms(110);/调用延时子函数,改变参数大小,调整变化速度 else P3=0XFF; delay1ms(30); goto www; else P3=0xff; break; www: for(i=0;i40;i+) if(key5=1) if(key4=0) P3=lii;/这个符号是取反,因发光二极管采用共阳极,所以将数据取反再输出 delay1ms(200);/调用延时子函数,改变参数大小,调整变化速度 else P3=0XFF; delay1ms(30); goto iii; else P3=0XFF; break; 整体程序部分: #include#define char unsigned char code char tmpled90=0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80,0X81,0X82,0X84,0X88,0X90,0XA0,0XC0,0XC1,0XC2,0XC4,0XC8,0XD0,0XE0,0XE1,0XE2,0XE4,0XE8,0XF0,0XF1,0XF2,0XF4,0XF8,0XF9,0XFA,0XFC,0XFD,0XFE,0XFF,0XFF,0X00,0XFF,0X00,0X00,0XFF,0XFF,0X00,0X00,0X80,0X40,0X20,0X10,0X08,0X04,0X02,0X01,0X81,0X41,0X21,0X11,0X09,0X05,0X03,0X83,0X43,0X23,0X13,0X0B,0X07,0X87,0X47,0X27,0X17,0X0F,0X8F,0X4F,0X2F,0X1F,0X9F,0X5F,0X3F,0XBF,0X7F,0XFF,0XFF,0X00,0XFF,0X00;/定义数组常量,前面加code表示常量在程序代码中存放, /不占用RAM。该数组为发光二极管的输出数据Code char li33=0X81,0X42,0X24,0X18,0X99,0X5A,0X3C,0XBD,0X7E,0XFF,0XFF,0XE7,0XC3,0X81,0X00, 0X18,0X00,0X18,0X24,0X42,0X81, 0X99,0XA5,0XC3,0XDB,0XE7,0XFF,0XFF,0X00,0XFF,0X00;char code dis_711=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff; char code scan_con8=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f; char data timedata6=0x00,0x00,0x00,0x00,0x00,0x00; char data dis8=0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; char data conls=0x00,con04s=0x00,con=0X00; sbit key0=P10; sbit key1=P11; sbit key2=P12; sbit been=P13; sbit key3=P14; sbit key4=P15; sbit key5=P16; void wen(void) if (timedata0=5&timedata1=4&timedata2=0&timedata3=0&timedata4=0&timedata5=0&key3=0) been=been; else been=1; delay1ms(int t) int i,j; for(i=0;it;i+) for(j=0;j=6) con=0;TR1=0;ET1=0;TR0=1;ET0=1; if(con!=0) if(key1=0) delay1ms(10); while(key1=0); timedatacon+; if(timedatacon=10) timedatacon=0; discon=timedatacon;dis6=0x0a; if(con!=0) if(key2=0) delay1ms(10); while(key2=0); if(timedatacon=0) timedatacon=0x09; elsetimedatacon-; discon=timedatacon;dis6=0x0a; EA=1; scan() char k; for(k=0;k6;k+) if(key5=0) P0=dis_7disk;P2=scan_conk;delay1ms(1);P2=0xff;elseP0=0xff;break; clearmen() int i; for(i=0;i6;i+) disi=timedatai; TH0=0x3C;TL0=0xB0; TH1=0x3C;TL1=0xB0; TMOD=0X11;ET0=1;ET1=1;TR1=0;TR0=1;EA=1; void lsd(void) char n; char i; iii: for(n=0;n100;n+) if(key5=1)/循环输出40个数据 if(key4=1) P3=tmpledn;/这个符号是取反,因发光二极管采用共阳极,所以将数据取反再输出 delay1ms(110);/调用延时子函数,改变参数大小,调整变化速度 else P3=0XFF; delay1ms(30); goto www; else P3=0xff; break; www: for(i=0;i=10) timedata0=0;timedata1+; if(timedata1=6) timedata1=0;timedata2+; if(timedata2=10) timedata2=0;timedata3+; if(timedata3=6) timedata3=0;timedata4+; if(timedata4=10) timedata4=0;timedata5+; if(timedata5=2) if(timedata4=4) timedata4=0;timedata5=0; dis0=timedata0;dis1=timedata1;dis2=timedata2; dis3=timedata3;dis4=timedata4;dis5=timedata5; ET0=1; void time_intt1(void) interrupt 3 EA=0;TR1=0;TH1=0x3C;TL1=0xB0;TR1=1; con04s+; if(con04s=8)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论