当前位置:文档之家› 电子定时器设计

电子定时器设计

《专业实训设计报告》设计题目:电子定时器设计班级:电子11-2班学号: 1106040207学生姓名:李高指导教师:刘英哲一、设计要求要求实现一个电子定时器,即根据外部输入的计定时间进行计时(时间可采用外部按键的方式输入),并实时的显示当前计时结果,当计时到计定时间后进行警报(可通过LED 闪烁或蜂鸣器)。

计时时间以秒/分为显示单位,可分别实现对5 分钟,10 分钟,15 分钟和20 分钟的计时。

二、设计的目的1.掌握电路设计的一般方法在前面我们已经学习了模电、数电、单片机的理论知识,并对模拟电路,数字芯片和单片机各个接口的功能、各个功能模块有了了解。

通过此次课程设计,我们可以更加了解单片机及其使用,并围绕单片机设计拓展电路。

2.掌握电路仿真和调试过程此次课程设计是一个综合设计,要求我们做出实物。

在设计中我们要学习软硬件,绘制和焊接电路,通过调试使定时器能够正常工作。

3.提高总结能力完成智能定时器实物设计后,我们要在报告中总结设计过程,经验和分析结果,对设计不足的地方提出改进建议。

三、设计的具体实现方案一:采用555定时器来输入脉冲,先通过74LS90进行十进制计数(时钟的秒数个位),达到进位时将进位送入74LS92进行六进制计数(时钟的秒数十位),进位送入74LS90进行十进制计数(时钟的分位);由74LS47译码后送给数码管进行显示。

方案二:该方案仅由主电路、按键电路、显示电路、报警电路,四个模块组成。

整个系统的计时功能皆由STC89C52内部自带的定时器T0来实现;时钟由共阴极数码管显示;五个开关按钮可以实现时钟的加,分钟的加,预置定时时间,定时启停;并利用蜂鸣器进行定时报警。

方案框图如图3-1:图3-1方案一中虽然不需要程序,但是电路复杂,且不符合课程设计“以单片机为核心”的要求,所以最后采用了方案二。

方案二,电路简单,时钟部分完全用软件实现,操作方便,完全可以满足课程设计要求。

根据选题要求,设计任务主要完成LED数码管能实现秒/分的显示;通过按钮调整时间;预置定时时间定时;并提醒用户定时时间到。

为完成相应功能,系统设计包含以下几个基本模块:控制模块、信息显示模块、报警模块。

总的框图如上面方案二中图3-1所示。

1.控制模块的选取方案控制器是控制模块的核心,控制模块主要完成时钟和定时功能,从按键读取操作要求、从数码管和蜂鸣器信息显示。

方案一:采用中小规模集成电路。

采用中小规模集成电路构成的控制电路,由于外围器件多,容易出故障,而且调试起来非常麻烦。

方案二:采用ATMEL 公司的AT89S51作为系统控制器。

单片机算术运算功能强,软件编程灵活、自由度大,可用软件编程实现各种算法和逻辑控制,并且由于其功耗低、体积小、技术成熟和成本低等优点,使其在各个领域应用广泛。

本系统控制算法不太复杂,系统规模较小,适宜采用单片机控制方案。

综合考虑,本设计采用方案二。

2.硬件设计及电路图1)设计原理:硬件电路主要有单片机最小系统,按键输入电路,LED显示电路,蜂鸣器电路组成。

按键输入电路:对定时器输入定时时间、时钟时间,并对其调整。

最小系统:包括晶振电路,复位电路。

LED显示电路:显示数字钟时间,定时时间和按键操作。

2)单元电路设计:控制器:本设计采用A T89S51单片机芯片,AT89S51是一个低功耗,高性能CMOS 8位单片机,片内含4k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的AT89S51可为许多嵌入式控制应用系统提供高性价比的解决方案。

在设计中,P1.0~P1.6口用来控制数码管的段选,P1.7口控制小数点显示;P0.4~P0.7则用来控制LED数码管的位选;P0.0、P0.1、P0.2、P0.3是按键输入接口;P2.7控制蜂鸣器报警。

时钟定时由定时/计数器T0实现。

晶振电路设计:时钟电路对单片机是不可缺的,单片机的每个功能都要以时钟电路为基础工作。

单片机内部自带一个时钟电路,外部接入定时控制元件即可构成一个稳定的自激振荡器。

其中机器周期共有12个振荡脉冲周期,因此,机器周期是时钟周期的12倍。

本实验中时钟电路中使用的晶体是12MHz,则时钟周期为(1/12)us,机器周期为1us。

在电路中两个电容C1,C2的作用有两个:一是帮助振荡器起振;二是对振荡器的频率进行微调。

电路图如下:复位电路设计:复位操作有上电自动复位、按键电平复位和外部脉冲复位三钟方式,本次实验用的是按键电平复位,利用电容的充放电公式来选择所需的电容、电阻,能保证复位信号高电平持续时间大于2个机器周期。

电路图如下:按键输入电路:按键输入电路有4个按钮组成。

SEC/MIN分别控制秒钟、分钟加1,SET 设置时间,START/REST控制定时的启停, ALARM ON/OFF控制报警灯的闪灭。

电路图如下:LED显示电路:LED数码管就是由发光二极管组合而成的1种新型显示器件。

LED显示采用了7SEG-MPX4-CC-BLUE四位共阴极数码管。

最后确定LED显示电路如图:报警灯电路:单片机P2.7口高电平使报警灯工作。

电路如图:3.软件设计软件设计主要是实现对定时/计数器T0的控制。

总体思路是用中断方式计数定时器T0定时到50毫秒的次数。

如果计满20次,则表示1秒到达,接着就可以软件方式实现分,时的加1或清零。

此次设计采用了T0的定时工作方式1。

下面介绍与设计相关的定时/计数器T0的控制寄存器和工作方式1。

定时/计数器方式寄存器TMOD:TMOD低四位用于选择T0的工作方式。

GATE门控(开/关),GATE=0则T0工作在自启动方式;GATE=0工作在外启动方式。

C/—T 计数/定时,C/—T=0则T0定时;C/—T=1计数。

M1M0=00,T0选择工作方式0;M1M0=01,T0选择工作方式1;M1M0=10,T0选择工作方式2;M1M0=11,T0选择工作方式3。

定时/计数器控制寄存器TCON:TR0位是T0运行控制位。

TR0=1,启动T0工作;TR0=0,停止T0工作。

工作方式1:16位定时计数方式,THx和TLx各提供8位计数初值,当TLx低8位计数满回零向THx进位,当THx也计数满回零时置位TFx。

方式1最大计数值为65536,是计数值最大的方式。

程序使用Keil软件编写,完整程序见附2。

下图是程序的总流程图:4.元器件清单四、结论与展望倒计时定时器已经成为人们日常生活中必不可少的物品,随着技术的发展,广泛的应用于各个公共场所,给人们日常的生活、学习、工作、娱乐带来便利,但是由于原先简单的报时功能已经不能够被人们所满足,希望出一些新的功能新的产品来满足人们的需要,例如重要日子的倒计时、秒表等等,这些都能带来更大的方便。

而所有的这些都是以倒计时定时器为基础的。

因此,研究倒计时定时器有着非常重要的意义和实用价值。

电子定时器在家用电器中经常用于延时自动关机、定时。

延时自动关机可用于:收音机、电视机、录音机、催眠器、门灯、路灯、汽车头灯、转弯灯以及其他电器的延时断电及延时自停电源等。

定时可用于:照相定时曝光、定时闪光、定时放大、定时调速、定时烘箱、冰箱门开定时报警、水位定时报警、延时催眠器、延时电铃、延时电子锁、触摸定时开关等。

例如:空调中的定时器,在工作一段时间之后便能自动切断电源停止工作。

夏季夜间使用,入睡前先顶好时间,等睡熟后到了预定时间,空调自动关机,方便节能。

定时器除了应用于家用电器外,还广泛地用于工业农业生产和服务设施等等。

五、心得与体会通过这次课程设计,我学习到了我平时没有接触过的东西,特别是这个学习过程,就突然感觉自己终于把书本上的理论用到了生活中至少是与生活跟接近了。

把这些知识运用到实际中去,对于做家用定时器硬件的时候有着很大的帮助,同时还培养了我的自学能力和独立思考能力。

在调试过程中每当遇到问题的时候,都能通过自己的思考分析,一次又一次的实验最终能够完成。

这对我也是一次很大的考验,能有这次锻炼的机会是我不可缺少的经历。

感谢老师的指导、同学的讨论,让课程设计的整个过程变得更加具有人情味,同学们的思维也能更好地得到舒展。

总的来说,这次课程设计是一个不错的经历,告诉我要不断学习,不断提高。

六、参考文献[1]吴金戎,沈庆阳,郭庭吉. 8051单片机实践与应用[M]. 北京:清华大学出版社,2002[2]李鸿. 单片机原理及应用[M]. 湖南:湖南大学出版社,2004[3]肖洪兵. 跟我学用单片机[M]. 北京:北京航空航天大学出版社,2002.8[4]马忠梅藉顺心,单片机C语言应用程序设计,北京航空航天大学出版社,2007[5]刘刚,秦永左,单片机原理及应用,北京,北京大学出版社,2006[6]李群芳, 肖看, 张士军. 单片微型计算机与接口技术, 2012.1附1:附2:Timer:#include <reg52.h>#include "cext.h"#include "timer.h"#include "taskproc.h" // interrupt period (1 msec)#define tmr_time 1e-3static uchar counter ;static uchar cnt, dpcnt, kbcnt;static uint timer_counter;#include <reg52.h>#include "cext.h"#include "timer.h"void main( void ){ // initializes internal 8052 timer.// Clock Frequency = 12 MHzinit_timer(12e6);// enables interruptsEA = 1;// loop for everwhile (1);}void ISR_timer2 () interrupt 5 using 1 // Timer2 isr{ // Clear interruptTF2 = 0;// Do it at 1msled_mux();// Task procedure.// Each task runs every 10ms multiplied by its own task counter // S0:if (counter == 1){ if (cnt == 100){ cnt = 0;led_counter();}// Increment of the Timer task countercnt++; }// S1:if (counter == 2){ if (dpcnt == 20){ dpcnt = 0;blink_dp(); }// Increment of the decimal point task counterdpcnt++; }// S2:if (counter == 3){ if (kbcnt == 25){ kbcnt = 0;get_key(); }// Increment of the keyboard task counterkbcnt++; }if (++counter == 10) counter = 0;/*State tableS0: Timer countsS1: Blink dpS2: get keysOther task state are null*/ }void init_timer (float fclk)// Timer2 initialization{ int tmr_reload;counter = 0; // initialize state counter// initialization T2CON:// CP/RL2 = 0 (autoreload, no capture),// EXEN2 = 0 (disable external input T2EX),// C/T2 = 0 (timer, no counter),// RCLK = TCLK = 0 (timer, no baud rate generator), // TF2 = EXF2 = 0 (interrupt flags cleared)// TR2 = 0 (timer stop, please)T2CON = 4;// Load timer2 autoreload bytestmr_reload = (0xFFFF - (uint)((fclk * tmr_time) / 12)); RCAP2H = high_byte(tmr_reload);RCAP2L = low_byte(tmr_reload);// Highest priority for Timer2 interruptsPT2 = 1;// Enables Timer2 interruptsET2 = 1;// Start Timer2TR2 = 1; }Task Proc:#include <reg52.h>#include "cext.h"char num[ ] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 7-seg codeschar add[ ] = {0x0fe,0x0fd,0x0fb,0x0f7}; // Multiplexing addresschar dpn[ ] = {0,0,0,0}; // Dots matrixchar buf[ ] = {0,0,0,0}; // Counter bufferchar alm[ ] = {0,0,0,0}; // Alarm sets bufferchar value, key_mask, new_key;static uchar d0, d1, d2, d3, d5;static uchar flag;static uchar digit_counter;static char set_flag;static char set_count;static char set_alm;static char stop_counter = true;char un, th;uint timer;uint alarm;uchar del;// P2.7. Alarm outputsbit alm_out = P2^7;// processor switch contest.#pragma registerbank (1)// Multiplexing Task. Do it every 10msvoid led_mux (){ if (!set_flag){ // Normal counting. Display the counts.value = buf[digit_counter];P1 = num[value] | dpn[digit_counter] ; }else{ // Display alarm valuesvalue = alm[digit_counter];P1 = num[value] | dpn[digit_counter] ; }if (set_alm){ // Timer and alarm valuetimer = buf[0] * 1000 + buf[1] * 100 + buf[2] * 10 + buf[3]; alarm = alm[0] * 1000 + alm[1] * 100 + alm[2] * 10 + alm[3]; // Check whether the alarm condition is occured or notif ((alarm - timer) <= 0){ alm_out = false; // Make alarm out low.stop_counter = true ; // Stop the counter. } } // Drive the digit actually multiplexed.P0 = add[digit_counter];for (del=0; del<100; del++) ;// Increase multiplexer address to the next digitdigit_counter++ ;// Did you diplay all digit ?if (digit_counter >= 4)// Start again.digit_counter = 0;// Pulse high P0.0, P0.1, P0.2 and P0.3P0 = P0 | 0x0f; }// Blink on and off the dots when counting and alarm is on.void blink_dp (){ if (!set_flag && !stop_counter){ if (flag)dpn[1] = 0x80;elsedpn[1] = 0x0;flag = !flag; } }// Counter. Counts from 00.00 to 59.59 min.sec.// The Timer interrupt is driven every 1 sec.void led_counter (){ if (!stop_counter) buf[3]++;if (buf[3] > 9){ buf[3] = 0;d3 = true; }if (d3){ ++buf[2];d3 = false; }if (buf[2] > 5){ buf[2] = 0;d2 = true; }if (d2){ ++buf[1];d2 = false; }if (buf[1] > 9){ buf[1] = 0;d1 = true; }if (d1){ ++buf[0];d1 = false; }if (buf[0] > 5){ buf[0] = 0;d0 = true; } }// Four keys Task manager.// Timer interrupt driven every 250msvoid get_key (){ char valid_key;char delay = 127;key_mask = P0 & 0xf0;while (--delay >= 0) ;valid_key = P0 & 0xf0;if (key_mask != valid_key) valid_key = 0;while ((P0 & 0xf0) != (0 | (valid_key & 0x40))) ;switch (valid_key){ case 0x10: // Reset Timerbuf[0] = 0;buf[1] = 0;buf[2] = 0;buf[3] = 0;alm_out = true;stop_counter = !stop_counter;break;case 0x20: // Set alarm++set_count;if (set_count == 1){ // First time SET is pressed. Sets secondsset_flag = true;dpn[0] = 0; dpn[1] = 0; dpn[2] = 0x80; dpn[3] = 0x80; } else if (set_count == 2){ // Second time SET is pressed. Set minutesset_flag = true;dpn[0] = 0x80; dpn[1] = 0x80; dpn[2] = 0; dpn[3] = 0; } else if (set_count == 3){ // Latest time SET is pressed. Return to timer functions. set_flag = false;set_count = 0;dpn[0] = 0; dpn[1] = 0; dpn[2] = 0; dpn[3] = 0; }un = 0;th = 0;break;case 0x40: // Set seconds/minutesif (set_count == 1){ ++un;if (un > 9){ th++;un = 0;if(th > 5)th = 0; }alm[3] = un;alm[2] = th; }else if (set_count == 2){ ++un;if (un > 9){ th++;un = 0;if(th > 5)th = 0; }alm[1] = un;alm[0] = th; }break;case 0x80: // Set alarm on/offset_alm = !set_alm;if (set_alm){ dpn[0] = 0x80; dpn[1] = 0x80; dpn[2] = 0x80; dpn[3] = 0x80;} else{ dpn[0] = 0x0; dpn[1] = 0x80; dpn[2] = 0x0; dpn[3] = 0x0; } break; }}。

相关主题