《单片机课程设计报告作息时间控制系统.doc》由会员分享,可在线阅读,更多相关《单片机课程设计报告作息时间控制系统.doc(26页珍藏版)》请在三一办公上搜索。
1、重庆科技学院单片机专题实验课程设计报告目录1、绪论12、方案设计22.1总体方案22.2 硬件方案32.3 软件方案33 硬件电路设计与分析43.1 CPU时钟与复位电路43.2 数码管显示模块43.3 8051电路53.4 LED显示模块63.5 蜂鸣器模块73.6 按键接口模块84 软件设计94.1主程序设计94.2 中断函数子程序104.3 蜂鸣器函数子程序104.4 北京时间修改函数子程序114.5 闹钟修改函数子程序125 调试与测试145.1 硬件调试145.2 软件调试145.3 软硬件调试145.4 测试结果146 总结16参考文献17致谢18附录1 硬件设计原理图19附录2
2、程序清单201、绪论 随着计算机技术的发展和在控制系统中的广泛应用,以及设备向小型化、智能化发展,作为高新技术之一的单片机以其体积小、功能强、价格低廉、使用灵活等优势,显示出了很强的生命力。进入21世纪以来,开发推出单片机的公司很多,各种高性能单片机芯片市场也异常活跃,新技术的不断采用,更加使单片机的种类、性能以及应用领域不断扩大和提高。因其功耗低,超高型,低成本,功能完整,在国内越来越受到用户的重视和广泛使用。 本设计是一个具有闹钟、显示北京时间和修改闹钟和北京时间功能的作息时间控制系统。由单片机核心按键控制扫描模块、时钟模块、数码显示模块、LED显示模块、蜂鸣器模块等组成,系统扩展4按键用
3、于闹钟时间调整及时间校正。现代机关企业,特别是学校要求对时间加以控制,要按时打铃及播放广播,以保证学习与工作的正常运行。本设计实现了这些功能,给学校及其他机关企业带来方便,整体性好,人性化强、可靠性高,实现了对时间控制的智能化。2、 方案设计2.1总体方案 作息时间控制系统的设计有很多方案可以实现,其主流技术主要有以下几种: (1)用可编程逻辑器件(如CPLD、FPGA)来实现,而在本设计中如要实现功能相对来说比较复杂,必须得用到FPGA来实现,而FPGA的价格相对较贵,且系统设计比较困难。 (2)用PLC来实现,PLC其实就是一被封装起来的单片机,里面设有监控程序,并对I/O端口进行了光电隔
4、离。这样一来使得PLC性能稳定且容易使用,且只需简单外围电路就可以实现该系统功能,但PLC比较昂贵,这样会使成本增高而失去市场竞争。 (3)就是用555定时器产生时钟脉冲和数字芯片(如74LS14)来实现,但要来实现本设计需要大量的数字芯片,使得系统稳定性下降,生产难度加大,而且成本会增加。 (4)就是应用单片机充当主控器来再加上适量的外围实现此功能,且单片机价格便宜,性能稳定。应用的外围器件相对较少,这就提高了系统的稳定性,且单片机控制简易,开发工具简单,很容易大批量生产。 我们才学习了单片机原理与应用,所以我们选择了方案四。硬件主要利用89c51单片机,8051芯片,4x数码管,LED显示
5、灯,独立式按键,复位按键,蜂鸣器。软件主要利用KEIL C51软件编写程序,利用STC_ISP_V480串口加载程序。最后通过硬件调试程序。如图2.1所示是总体方案框图。按键控制扫描数码管显示主控电路指示灯显示实现时钟LED显示蜂鸣器显示实现闹钟 图2.1总体方案框图 原理说明: 本电路以单片机AT89C51为主控电路,分别连接按键控制扫描模块、时钟模块、闹钟模块、数码显示模块、LED显示模块、蜂鸣器模块、指示灯模块。首先,按键扫描模块的四个按键分别用来控制数码显示、LED显示和指示灯显示工作,P0口用来控制其段选以显示相应的数值。P1口控制数码管的位选,以显示相应的数值。在其位选控制部分,采
6、用了9012型的三极管,要求当P1口输出低电平时,位选成功,使得该位选的数码管亮,数码管显示时分通过按键P32控制。P2口作为输出口,用来控制LED的亮灭,要使其亮只需要让P2.3-P2.6口保持低电平就可以使4个灯亮起来。通过按键P20选择所要修改的是小时还是分钟,最后通过按按键P21和P22实现作息时间修改的功能。2.2 硬件方案 主要利用89c51芯片读写程序;利用4x数码管显示时钟时间和北京时间,前面两位显示小时,后面两位显示分钟,再在利用第二位的数码管上点,通过对断码的控制使它闪烁,即一秒闪烁一次,闪烁60次分钟就加1;利用LED显示灯作为提示,如:按键一被按下,然后就利用一个LED
7、显示灯亮来提示按键被按下;在时间修改的时候,通过观察是哪个灯亮来确定要修改的是北京时间或者闹钟的小时还是分钟。利用复位按键将时间全部清零;利用独立式按键控制功能的切换来对时间操作;利用蜂鸣器响表示闹钟时间到了响铃,响铃时间为一分钟。2.3 软件方案设计2个简单模式,即北京时间模式(当前时间)和闹钟模式。通过对单片机的学习,利用定时器和中断来实现其功能,再通过独立式按键来选择在那种模式下工作以及对时间的修改。3 硬件电路设计与分析3.1 CPU时钟与复位电路 系统程序主要通过CPU请求定时器中断来控制程序,当定时器定时一个5ms的时候,CPU就中断一次。如图3.1(a)所示是定时器的电路连接图。
8、复位电路是利用的外部按键复位,这样在单片机死机或遇到程序故障时系统能够通过按键可以复位。如图3.1(b)所示是外部复位电路图。 (a) (b)图3.13.2 数码管显示模块数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,因此根据数码管的驱动方式的不同,可以分为静态式和动态式两类。 静态显示驱动:静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5840根I/O端口来驱动,要知道一个8
9、9S51单片机可用的I/O端口才32个呢:),实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。 动态显示驱动:数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划a,b,c,d,e,f,g,dp的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的C
10、OM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为12ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。本电路是以动态显示的方法,并且低电平有效。每个数码管的公共端(位线)分别由P10、P11、P12、P13接口线控制,外接+5v电压和10K的固定电阻,图3.2所示是一个4位数码管动态显示电路示意图。图3.2 4位数码管显示电路图3.3 8051电路利用8051的IO口、CP
11、U中断源处理该系统程序,如P0口就用作数据总线接送段码,P1口用作四个数码管的位码口定义,P2口用作LED显示或是按键定义,而且低电平有效。具体8051电路设计电路图如图3.3所示:图3.3 8051电路图3.4 LED显示模块 LED(Light Emitting Diode),发光二极管,是一种固态的半导体器件,它可以直接把电转化为光。LED的心脏是一个半导体的晶片,晶片的一端附在一个支架上,一端是负极,另一端连接电源的正极,使整个晶片被环氧树脂封装起来。半导体晶片由两部分组成,一部分是P型半导体,在它里面空穴占主导地位,另一端是N型半导体,在这边主要是电子。但这两种半导体连接起来的时候,
12、它们之间就形成一个“P-N结”。当电流通过导线作用于这个晶片的时候,电子就会被推向P区,在P区里电子跟空穴复合,然后就会以光子的形式发出能量,这就是LED发光的原理。而光的波长也就是光的颜色,是由形成P-N结的材料决定的。 本电路设计了四个LED显示管并联,分别与P23、P24、P25、P26接口线连接,再外接1K的固定电阻和+5V的电压。低电平有效。图3.4所示是一个4XLED显示管的简单电路设计图。图3.4 4xLED显示管显示电路图3.5 蜂鸣器模块 蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电
13、子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。下面我们以电磁式蜂鸣器为例来说明它的工作原理:电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场。振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声,当输出高电平时,三极管截止,蜂鸣器的两引脚间的直流电压接近于0V,没有电流流过线圈,蜂鸣器不发声;当输出低电平时,三极管导通,使蜂鸣器的两个引脚间获得将接近+5V的直流电压,这样蜂鸣器的电流形成回路,发出声音。因此,我们可以通过程序控制IO口输出的电平来控制蜂鸣器是否发出声音,实现各种可能音响的产
14、生。在这个设计中是通P1.4口控制其发声的,当P1.4口输出低电平时蜂鸣器发出声响。具体电路设计图如图3.5所示。图3.5 蜂鸣器接口电路图3.6 按键接口模块 在实验中,通过对按键mode的切换来实现我们所选择的模式,通过dw和up来实现对时钟和闹钟的修改。图3.6所示是一个独立式按键接口的简单电路设计图。图3.6按键接口电路图4 软件设计4.1主程序设计主程序设计主要包括五个函数,即主函数和中断函数和北京时间的修改和闹钟的修改和蜂鸣器。主函数主要是利用while(1)循环来等待下一个中断,开启中断和定时器的初始化。如图4.1就是主要程序设计的流程图。开始判断flag等待定时器0初始化 Fl
15、ag=0Flag=1闹钟的修改闹钟的显示北京时间修改北京时间的显示图4.1主要程序设计的流程图 4.2 中断函数子程序 在中断函数里主要设计本系统的功能程序和三个函数的调用,首先判断count是否大于200(1分钟计时数),然后再分别判断秒分时是否大于60,然后更新数码管,如果count小于200,则返回。入口NCount=200?Y判断时分秒更新数码管返回图4.2 中断函数的流程图4.3 蜂鸣器函数子程序 根据功能设计,蜂鸣器在闹钟功能模式下到了响铃时间则响铃。主要是通过按键来选择蜂鸣器工作在那个模式下,即用变量flag(按键P20按下,flag等于1;按键P32按下,flag等于0)区分。
16、当flag等于1 的时候显示北京时间,当flag等于0的时候工作在闹钟功能模式下。图4.3所示是具体蜂鸣器子程序设计流程图。入口 Y北京时间=闹钟时间?N闹钟响闹钟不响返回 图4.3 蜂鸣器的流程图4.4 北京时间修改函数子程序 将按键P20用做选择要调整北京时间的小时还是分钟,而按键P21和P22键分别用做UP键和DOWN键。当按键P21键按下时让变量model加1(用model变量来进行选择),当model等于1的时候就修改小时,同时让LED1作为指示灯(P23)亮;当model等于2的时候就修改分钟,同时让LED2(P24)作为指示灯亮。 图4.4所示是北京时间修改子程序设计流程图入口N
17、 Mode = 1 修改小时ode = 1 修改小时NP20=0?p21=0?p22=0?Y返回P22=0P21=0P20=0Mode1= 2分钟减减Mode1= 1小时减减Mode1=2分钟加加Mode1= 1小时加加Mode1= 2修改分钟Mode1= 1 修改小时图4.4北京时间修改子程序设计流程图4.5 闹钟修改函数子程序 将按键P32用做选择要调整北京时间的小时还是分钟,而按键P21和P22键分别用做UP键和DOWN键。当按键P21键按下时让变量model加1(用model变量来进行选择),当model等于1的时候就修改小时,让LED3作为指示灯(P25)亮;当model等于2的时候
18、就修改分钟,同时让LED4(P26)作为指示灯亮。图4.5所示是具体修改闹钟的简单流程图。入口P32=0?p21=0?p22=0?返回P22=0P21=0P32=0 Mode1= 2分钟减减Mode1= 1小时减减Mode1=2分钟加加Mode1= 1小时加加Mode1= 2修改分钟Mode1= 1 修改小时图4.5修改闹钟的流程图5 调试与测试5.1 硬件调试硬件调试分为静态调试和动态调试。静态调试一般采用的工具是万用表,其是在用户系统未工作时的一种硬件检测。动态调试是在用户系统工作的情况下发现和排查错误的一种硬件检测。调试步骤是:首先把电路分成若干模块,调式过程中与该模块无关的元件可以不加
19、考虑,这样可把故障限定在一定的范围内;故障清除后,把各个模块合在一起进行联调,即可完成整个硬件调试工作。在本次课程设计中,调试的方法主要是利用分块调试方法,而且调试成功一个再添加其他的功能进去,最后对整个系统进行调试,直到全部调试成功为止。5.2 软件调试 软件调试是通过对程序的汇编、连接、执行来发现程序中存在的语法错误与逻辑错误并加以排除纠正的过程。5.3 软硬件调试 对整个系统进行调试主要把调试无误的软件程序烧制进单片机芯片内部,通过硬件的操作来发现问题,然后逐个修改程序和调试程序。比如对按键控制程序的调试,当按键按下的时候,若数码管显示有闪动或数字跳动很快或有的数码管不亮了或按键被按下而
20、看不出效果或者数码管显示的时候乱码等,则需修改程序后再调试。5.4 测试结果当没有任何按键被按下的时候,数码管就显示北京时间。当有键按下时:1、 当按键P20被按下1次时,数码管显示北京时间,而且Led1(p23)和Led2(p24)同时点亮;2、 当按键P20被按下2次时,显示灯只有P23亮,此时可以修改当前北京时间的小时,按键p21是对北京时间小时加加,p22是对北京时间小时的减减;3、 当按键P20被按下3次时只修改北京时间的分钟,且显示灯P24亮,按键p21按一下是对北京时间分钟加1,按键p22按一下是对北京时间的分钟减1;4、当按键P32被按下1次的时候,数码管显示闹钟的第一个时间,
21、显示灯P25和p26同时亮;5、 当按键P32被按下2次的时候,显示灯只有P25亮,此时可以修改当前的闹钟时间的小时,按键p21按一下对闹钟时间小时加1,按键p22按一下是对闹钟时间的小时减1;6、 当按键P32按下3次时,显示灯只有P26亮,此时可以修改当前的闹钟时间的分钟,按键p21按一下对闹钟时间小时加1,按键p22按一下是对闹钟时间的小时减1;7、当按键P32被按下4次的时候,数码管显示第二个闹钟时间。6 总结 本实验硬件用到了单片机AT89C51读入程序,软件用到了KEIL软件编写程序,电路原理图用到了protel99软件。利用1个数组变量sf存储闹钟时间,前23位储存闹钟时间的小时
22、,后23为储存闹钟时间的分钟。实验实现了北京时间和闹钟时间的显示与修改,为很多人带来了方便。在调试的时候往往遇到数码管显示不稳定(闪烁或者不显示),和按键不稳定。数码管显示不稳定主要是动态显示的时候时间设置不对等。按键不稳定主要是消抖的时间太长或是太短,通过对软件的调试就可以解决这个问题。对于北京时间和闹钟的修改,我用了两个函数,在每个函数里面分别定义了所需的按键,这样造成了存储空间的浪费,所以以后应该分模块对所需的硬件进行整体定义,这样会比较清晰也不会造成资源的浪费。由于时间的关系,它还是不是很完整,比如一些程序没有优化,功能还不是很强大。如果能有更多的时间,我相信它的功能会越来越多,它的不
23、足会越来越少,会越来越完美。参考文献1唐颖.单片机原理与应用及C51程序设计M.北京:北京大学出版社,2008.2徐爱钧,彭秀华.Keil Cx51 V7.0单片机高级编程与uVision2应用实践M.北京:电子工业出版社,2004.3赵德安,等.单片机原理及应用M.北京:机械工业出版社,2004.4吴飞青,等.单片机原理及应用实践指导M.北京:机械工业出版社,2009.5段晨东.单片机原理及接口技术M.北京:清华大学出版社,2008.致谢感谢指导老师钟老师,在专题实验设计期间,许多思想都是在她的指导下得以实现。她对我们严格要求,尽职尽责的检查我们的设计报告,连一点小小的错误都能检查出来。正是
24、在这样严格的要求和关怀下,专题实验设计期间我们没有丝毫的松懈,才能够顺利的完成本次专题实验。同时,还要感谢帮助我的同学,他们提供了很多的帮助,有了这些帮助才能顺利的完成专题实验设计。 通过这次专题实验,我明白了一次不能将整个程序设计好,反复修改、不断改进是程序设计的必经之路;要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在设计课程过程中遇到问题是很正常的,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题。 再次真心感谢所有帮助过我的老师和同学们!非常感谢!附录1 硬件设计原理图附录2 程序
25、清单#include reg52.h#define THCO 0xee#define TLCO 0x0unsigned char code Duan=0x3F, 0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F;/共阴极数码管,0-9段码表unsigned char Data_Buffer4=0,0,0,0;/四个数码管显示数值,数组变量定义unsigned int m=0,h=0,l=0,K_count2=0;unsigned char shi=0,fen=0,Sec=0;bit flag=0;/1分时间到标志 static unsigned char
26、 K_count=0;unsigned char sf46=6,7,7,8,8,9,9,10,10,11,11,12,13,13,14,14,15,16,17,17,18,21,23,50,0,25,20,30,15,25,10,30,15,25,10,20,30,15,25,10,30, 0,50, 0,30, 0;sbit P10=P10;/四个数码管的位码口定义sbit P11=P11;sbit P12=P12;sbit P13=P13;sbit P20=P20; /按键定义sbit P21=P21;sbit P22=P22;sbit P32=P32;sbit LED1=P23; /四个
27、指示灯sbit LED2=P24;sbit LED3=P25;sbit LED4=P26;sbit P14=P14;void key1();void voice();void dispsf();void main() TMOD=0x11;/定时器0初始化 TH0=THCO; TL0=TLCO; TR0=1; ET0=1; EA=1; while(1) if(flag=0) Data_Buffer0=shi/10;Data_Buffer1=shi%10;Data_Buffer2=fen/10;Data_Buffer3=fen%10; if(flag=1) Data_Buffer0=sfm/10;
28、 Data_Buffer1=sfm%10; Data_Buffer2=sfm+23/10; Data_Buffer3=sfm+23%10; void timer0() interrupt 1 static unsigned char Bit=0;/静态变量,退出程序后,值保留 static unsigned char count=0; TH0=THCO; TL0=TLCO; count+; if(count=200)/秒计时,定时器定时5ms,计200次为一秒 count=0; Sec+; if(Sec=60) Sec=0; fen+; flag=1;/更新数码管显示 if(fen=60)/时
29、间计时 fen=0; shi+; if(shi=24)shi=0; Bit+; if(Bit=4)Bit=0; P1|=0x0f;/先关位码 P0=DuanData_BufferBit;/开段码 if(count=30)/消抖处理 K_count1=0; if(P20=0|P21=0|P22=0)/有键按下 if(P20=0)/修改Mode, flag = 0; Mode1+; if(Mode1=3)Mode1=0; if(Mode1=0)LED1=1;LED2=1;/实时时间 else if(Mode1=1) LED1=0; /修改小时 else if(Mode1=2)LED1=1;LED2
30、=0;/修改分钟 if(P21=0) if(Mode1=1) /小时加 shi+; if(shi=24)shi=0; if(Mode1=2)/分钟加 fen+; if(fen=60)fen=0; if(P22=0) if(Mode1=1) /小时减 if(shi=0)shi=23; else shi-; if(Mode1=2) /分钟减 if(fen=0)fen=59; else fen-; void voice() static unsigned int i=0,l=0; for(i=0;i=200) l=0; P14=1; void dispsf() static unsigned cha
31、r Mode2=0; /MODE, 0:实时时钟;1:修改小时;2:修改分钟 if(P32=0|P21=0|P22=0)/有键按下 K_count2+; if(K_count2=30)/消抖处理 K_count2=0; if(P32=0|P21=0|P22=0)/有键按下 if(P32=0) flag = 1; Mode2+; if(Mode23)Mode2=0; if(Mode2=0) LED3=1; LED4=1; m+; if(m=23)m=0; if(Mode2=1)LED3=0; if(Mode2=2)LED3=1;LED4=0; if(P21=0) if(Mode2=1) /小时加
32、 sfm=h; h+;if(h=24)h=0;sfm=h;Data_Buffer0=h/10; Data_Buffer1=h%10; if(Mode2=2)/分钟加 sfm+23=l;l+;if(l=60)l=0;sfm+23=l; Data_Buffer2=l/10; Data_Buffer3=l%10; if(P22=0) if(Mode2=1) /小时减 sfm=h; if(h=0) h=23; else h-; sfm=h; Data_Buffer0=h/10; Data_Buffer1=h%10; if(Mode2=2) /分钟减 sfm+23=l; if(l=0) l=59; else l-; sfm+23=l; Data_Buffer2=l/10; Data_Buffer3=l%10; 25