1、定时器实验 摘要:近年来随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用正在不断地走向深入,由于它具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,因此特别适合于与控制有关的系统,越来越广泛地应用于自动控制,智能化仪器,仪表,数据采集,军工产品以及家用电器等各个领域,单片机往往是作为一个核心部件来使用,在根据具体硬件结构,以及针对具体应用对象特点的软件结合,以作完善。 本次做的定时器是以单片机(89S51)为核心,结合相关的元器件(LED数码显示器、蜂鸣器和电平转化器等),再配以相应的软件,达到制作简易定时器的目的,文章的核心主要从硬件设计和软件编程两
2、个大的方面。硬件电路设计主要包括中央处理单元电路、数码显示电路、串口电路等几部分组成,软件用C语言来实现。 关键词:89S51 LED数码显示器 蜂鸣器 串口电路 定时 一设计内容及要求 将按键定义为设置键、上翻键、下翻键、开始/取消键。数码管显当前设置时间与正在计时时间。可通过按键在1-99秒之间设置,按开始键启动计时,计时完成后驱动蜂鸣器发声提示。 二 硬件设计 2.1硬件电路图 硬件电路如上图1-1所示 2.2 89S51芯片介绍 89S51方框图如图1-2所示 芯片引脚如上图1-3所示
3、 P3口第二功能如下表1-1所示 2.3蜂鸣器驱动电路介绍 蜂鸣器驱动电路如上图1-4所示 2.4串口电路介绍 串口电路如上图1-5所示 2.5晶振电路介绍 选用石英晶体振荡器,此电路在加电大约延迟10ms后振荡器起振,在XATL2引脚产生幅度为3V左右的正弦波时钟信号,其振荡频率主要有石英晶振的频率决定的。在电路中两个电容C1,C2的作用有两个:一是帮助振荡器起振;二是对振荡器的频率进行微调。 晶振电路如上图1-6所示 2.6数码管电路介绍 发光二极管LED是一种通电后能发光的半导体器件,其导电性质与普通二极管类似。LED数码显示器就是由发
4、光二极管组合而成的1种新型显示器件。在单片机系统中应用非常普遍。
数码管电路如上图1-7所示
三软件设计
3.1程序流程图
程序流程图如上图3-1所示
3.2程序清单
#include
5、ge,t; //tt为设定值,t为当前计数值 uchar code table[]={ 0x88,0x9F,0xA4,0x85, 0x93,0xC1,0xC0,0x8F, 0x80,0x81,0x82,0xC8, 0xE8,0xA1,0x86,0x8E}; //数码管显示段码 void delay(uint z); //延时子函数声明 void play(uchar aa); //数码管显示子函数声明 void SPK_Test( void ); //蜂鸣器控制子函数 void Init(); //初始化子函数声明 void
6、 KeyScanf(void); // 键盘扫描 void main() { Init(); //初始化 for(num1=60;num1>0;num1--) play(tt); t=tt; while(1) { KeyScanf(); while(t==0) { TR0=0; //定时时间到停止定时器工作 SPK_Test(); t=60; break; } play(t); //显示当前剩余定时时间 } } /*****
7、 *名称:void Init() *功能:初始化定时器0等 ***********************************************************/ void Init() { EA=1; //开总中断 ET0=1; //开定时器0中断 tt=60; //设定默认定时时间 (一分钟 ) num=20; TMOD=0x01; //设置定时器0为工作方式1 TH0=(65536-50000
8、)/256; //定时器0设定50ms定时初值 TL0=(65536-50000)%256; SPEAK=0; } /******************************************* 函数名:按键扫描 描 述: *******************************************/ void KeyScanf(void) { if((P1&0x0f)!=0x0f) //检查按键 { delay(20); if((P1&0x0f)!=0x0f) //检查按键 { dela
9、y(20); if(!(P1&0x01)) while(1) { TR0=0; play(tt); if(!(P1&0x02)) { tt++; play(tt); } else if(!(P1&0x04)) { tt--; play(tt); } if(!(P1&0x08)) { TR0=1; t=tt; break;
10、 } } if((TR0==1)&&(!(P1&0x08))) { if(!(P1&0x08)) { TR0=0; //停止 delay(20); } } if((TR0==0)&&(!(P1&0x08))) { { TR0=1; //启动 delay(20); } } } } } /*******************************
11、 *名称: Delay_NS() *功能: 长软件1ms延时 ***************************************************************/ void delay(uint ms) { uchar i; while(ms--) //ms毫秒软件延时 { for(i = 63;i > 1;i--); } } /******************************************************
12、 函数名称:定时器0中断服务子程序 功能: 重装初并重启定时器值, 定时中断满20次(1s) , 计数减1 ************************************************************/ void time0() interrupt 1 //定时器0中断子函数 { if(num>0) { num--; } else if(num==0) { t--; num=20; } TH0=(65536-50000)/256;
13、//重装定时器初值 TL0=(65536-50000)%256; ET0=1; TR0=1; //重新启动T0 } /************************************************************** *名称: void play(uchar) *功能: LED数码管显示0-F字符, 同时控制2个数码管显示对应的十六进制数 ***************************************************************/ void play(uchar aa)
14、 //数码管显示子函数 { shi=aa/10; ge=aa%10; P0=table[ge]; gw=0; delay(20); // 延时 显示 gw=1; P0=table[shi]; sw=0; delay(20); // 延时 显示 sw=1; } /******************************************* 函数名:SPK_test() 描 述: 蜂鸣器控制 ***************************************
15、/ void SPK_Test( void ) { unsigned int i = 0; unsigned char j,k,m = 34; for(j = 0;j < 8;j ++) { m -=1; for(i = 0;i < 2000;i ++ ) { SPEAK = ~SPEAK; for(k = m;k > 1;k--); } delay(15); }SPEAK =0; } 四设计心得 通过两周的学习和调试过程,终于完成了基于单片机的定时器的设计,并且完成了预期的目标。此次课程设计是
16、我踏入了单片机应用领域的第一步。我学到了很东西,丰富了自己的经验,巩固、加深和扩大单片机应用的知识面,提高了综合及灵活运用所学知识解决实际问题的能力,能够用AT89S51开发设计具有一定功能的单片机控制系统,进行软、硬件设计及调试。 在软件调试过程中有也有许多的不足之处:例如编写调试程序有点不足。希望能够在以后的不断深入学习中能够弥补自己的不足之处。 在此感谢各位老师及同学们的帮助! 五参考资料 1. 李鸿.单片机原理及应用[M] .长沙:湖南大学出版社,2005. 2. 南京伟福实业有限公司.LAB6000U(USB接口)单片机/微控制器仿真实验系统[EB/OL] .http://www.wave- 3. 胡汉才.单片机原理及其应用[M] .北京:清华大学出版社,2004. 4. 何立民.单片机应用技术选编[M] .北京:北京航空航天大学出版社,2006. 5. 何立民.单片机应用文集1-8[M] .北京:北京航空航天大学出版社,2000.






