定时器课程设计报告_第1页
定时器课程设计报告_第2页
定时器课程设计报告_第3页
定时器课程设计报告_第4页
定时器课程设计报告_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

皖西学院课程设计任务书系别机电学院专业电气学生姓名:凌刚学号:2023011047课程设计题目:基于STC89C51的定时器设计起迄日期:12月16日~12月28日课程设计地点:教学实验楼B502楼指导教师:张磊下达任务书日期:2023年12月16日基于STC89C51的定时器设计目录:课程设计目的…….............................2课程设计目的描述要求…………….22.1.设计描述………………...32.2.设计要求………………...3课程设计硬件电路的设计………….3……………..33.2设计方案确实定与说明……..…………...3设计方案的详细硬件设计…………….....3硬件电路图的绘制……….5keil编译与proteus仿真…………….84.1.keil编译…………………..84.2.proteus的仿真……………9程序设计思路和程序框图………....105.1程序设计思路……………105.2定时器工作方式设置……………………115.3特殊功能存放器TCON的设置………...115.4中断标号的查询…………11定时器程序详细程序框图……………....12相关的计算……….…13总结……………….…138.定时器程序清单……..…………….…149.参考文献…………....2110.附录………………..…………….…211课程设计目的:基于STC89C51的定时器设计2课程设计题目描述和要求设计描述:利用STC89C51等接口芯片设计定时器,要求通过键盘输入计时时间,按开始键开始计时,采用两位数码管显示计时时间,计时结束提供一种以上的报警方式。2.2设计要求:1.选用STC89C51和相关接口芯片完成相应的功能画出详细的硬件连接图给出程序设计思路,画出软件流程图给出所有程序清单并加上必要注释完成proteus仿真撰写设计报告,调试报告及设计心得3.课程设计硬件电路设计:设计工程简介:定时器设计,此定时器是一款基于单片机STC89C51的计时工具,手动利用时间加减按键设定定时时间,当检测到开始计时按键按下后,定时器开始倒数计时,当计时结束的时候翻开蜂鸣器和报警小灯,再检测到暂停按键按下的时候,关闭蜂鸣器和报警小灯。设计方案的选定与说明因为STC89C51芯片I/O口完全能满足定时器设计的需求,所以就没有外接芯片来扩展单片机I/O的使用。硬件电路最根底的是单片机所需要的最小系统:电源电路,晶振电路,复位电路。除此之外,单片机通过P0口接上拉电阻后连接了数码管的段选,P1^0口和P1^1口分别用作数码管十位和个位的位选,P1^2口用作蜂鸣器的控制,P1^3口用作报警小灯的控制,P1^4口P1^5口和P1^6口用作定时器按键的控制,风别控制时间的加/连加,减/连减和开始/暂停。3.3设计方案的详细硬件设计:因为对STC89C51有过编程经验,对于用它设计一个定时器还是有把握的,所有我们在8086和STC89C51这两款单片机的选择中选择了STC89C51。STC89C51它有四个八位I/O口,我们用P0口接了上拉电阻,原因有三点:1:P0口片内无上拉电阻2:P0为I/O工作状态时,上方FET被关段,从而输出脚浮空,因此,P0用于输出线时为开漏输出。3:由于片内无上拉电阻,上方FET又被关断,P0输出时无法拉升端口电平。考虑到单片机I/O口的驱动电流问题,—0.16mA,低电平时输入灌电流,最大20mA左右。因为没有外接驱动芯片驱动数码管,为了保护单片机不在高负荷下工作和简化电路,选择了共阳数码管,数码管的公共端连接三极管,根据一个二极管点亮大约需要电流5—10mA,当一个数码管的段和小数点全部点亮的时候,大约需要电流50—80mA,为使三极管工作在饱和状态并到达数码管全部显示时的驱动电流,基极电流的100倍需要大于发射极和集电极这间的电流,所以三极管接了一个1K的限流电阻。三级管的开关作用由P1^0口和P1^1口控制。设定时间需要按键,为了操作方便和编程方便设计了三个独立按键,每个独立按键设计了两种功能。按键按下后单片机I/O口被置低,三个按键分别用作时间的加,减和定时器的开关,按键信号分别由p1^4口p1^5口和p1^6口输入单片机!电源电路设计了两路,一路是用USB接口供电,比拟方便,另一路就是外接电源,可以将3—5V电源正负极接在相应插针上对定时器供电!硬件电路图的绘制: 因为比拟熟悉altiumdesigner这个EDA常用软件的使用,所以我选择用这个软件完成定时器硬件电路原理图的绘制和PCB的绘制。1.电路原理图:元件符号根本都是软件库文件里面符号,数码管用的是远光的共阳数码管,库文件里面没有找到这个数码管的原理图,就自己画了原理图和封装。2.PCB图:PCB排版的时候遵守的几个原那么:定时器数码管要显而易见便于观察时间,按键操作要方便,布线劲量短和简单,双面板布线顶层与底层布线相互垂直3.PCB板3D视图:4.实物图:Keil编译与proteus仿真:4.1.Keil编译4.2.proteus仿真:将编写好的c程序加载到keil软件中,生成的hex文件再加载到proteus的单片机中,仿真完全通过。程序设计思路与程序框图:5.1程序设计思路:在程序中用到了两个定时器和两个中断,定时器0主要用作数码管计时,每过一秒,数码管显示时间减一秒,减到零时停止计数并点亮报警小灯和翻开蜂鸣器报警。它的工作原理是利用程序使定时器0每1毫秒产生一次时间中断,以1000次时间中断定义一秒,再利用程序对得到的秒数进行计数,再对得到的秒数分别对10整除和取余数得到数码管显示的十位和个位,通过定时器0每1毫秒刷新数码管一次将秒数显示出来,定时结束后,进入中断1,点亮小灯和翻开蜂鸣器报警。中断0主要用作数码管的扫描和定时并在定时结束后翻开报警小灯,报警蜂鸣器以及进入中断1效劳子程序。定时器1和中断1用作产生不同频率的波形送给蜂鸣器让蜂鸣器报警。主函数中初始化各个变量和函数后,首先进入中断0效劳子程序,然后循环进行按键的扫描。5.2定时器工作方式设置:5.3特殊功能存放器TCON的设置:5.4中断标号的查询:.定时器程序详细程序框图:初始化初始化中断0效劳子程序定时器0每次定时1毫秒Flag=1定时器开始每秒减1计时,num-1计数定时器定时次数numbernumber=1000刷新数码管num=0停止计时,点亮报警小灯,翻开蜂鸣器翻开中断1,进入中断效劳子程序刷新数码管按键1按下延时去抖按键1放开按键1是否长按按键长按计时,key_num+1长按模式,计时连加num<99翻开蜂鸣器num<99num+1按键2按下延时去抖按键2放开按键2是否长按按键长按计时,key_num+1长按模式,计时连减num>0翻开蜂鸣器num>0num-1YNNNNN按键3按下延时去抖按键3放开翻开蜂鸣器关闭蜂鸣器关闭蜂鸣器num=99Nnum=99num=0num=0YYYYY是YY关闭蜂鸣器翻开定时标志,计数加1,关闭中断0,关闭报警小灯count=2暂停计数,熄灭小灯和关闭蜂鸣器YYNYNNNYNNNYNYNNY定时器1效劳子程序:目的是产生不规那么的脉冲送给蜂鸣器,让蜂鸣器以不同响声报警。定时器1效劳子程序定时器1效劳子程序定时器定时,上下为分别是FE,FRQ定时器定时,上下为分别是FE,FRQFRQ-1FRQ-1蜂鸣器翻开和关闭相转换蜂鸣器翻开和关闭相转换相关计算:定时器每经过一个机器周期定时器加1,51单片机的一个机器周期默认包括12个时钟周期,这次用的定时器0和定时器1都是16位定时器,最高计数能到达65535,因为用的是11.0592M晶振,所以设定1毫秒的定时计算如下:12*〔65535-X〕X=64615将十进制的X=64615转换成十六进制得到FC67,定时器的上下位分别是:THXx=FC,TLx=67.7总结:本次试验是一个基于STC89C51的定时器设计,根据老师提供的设计要求,设计中需要用到数码管,按键和报警小灯等,在硬件电路的设计中考虑了一下上电复位的时候单片机的引脚都置高电平了,接小灯和蜂鸣器和数码管的时候都特别注意了一下,防止上电复位对设计造成影响。在这次设计中我对三极管和数码管的用法和接线有了更加深刻的理解。在写程序的时候,第一次是一次性把所有的程序给写完的,包括数码管的显示,按键的扫描,中断的调用等,但是仿真的时候出不来结果。然后就一个一个模块调试,先调试的是数码管,发现数码管的动态刷新时间还是有较高要求的,时间太长会闪烁,时间太短会造成重影,用了两个数码管,最后调整在大约3毫秒。调试按键的时候出现按一次跳变几个数的情况,原因是按键没有硬件去抖也没有软件去抖,因为软件去抖也挺好实现的,就决定了在程序里面软件去抖,最后去抖延时调整在大约15毫秒,按键可以很好的被识别。每个按键设计了两种功能,对按键没有放开的时候进行了计时,超过2秒就认为到达长按模式,这个调试的时候也出现过问题,就是按键去抖延时太长或者太短的时候,按下去很久数码管依旧刷新不了,放开的时候会加1,最后按键去抖大约10到15毫秒的时候这个问题就不出现了。本来想让报警小灯闪烁的,但是在中断里面加程序的时候出现了死循环,最后就让小灯常亮了,这是一个缺陷,蜂鸣器程序是在中断1里面的,本来想加警车报警声音的,但是延时控制的不是很好,这也是一个缺陷。最后定时器还是能完全实现老师要求的功能的。再同学们去实验室调试的时候,感谢老师对芯片用法的细心指导。8定时器程序清单:#include<reg51.h>//................................................................................////............................全局定义数据类型.....................................////..................................................................................//typedefunsignedcharuint8;typedefunsignedintuint16;typedefunsignedlonguint32;//...................................................................................////.........................定义数码管显示数字和一些全局变量.........................////...................................................................................//uint8codeDuanma[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};uint8Tempdata[2];uint8num,count;uint32number,frq;//....................................................................................////................................端口的定义..........................................////....................................................................................//sbitSEG1=P1^0; //数码管1sbitSEG2=P1^1; //数码管2sbitKEY1=P1^4;//独立按键1sbitKEY2=P1^5;//独立按键2sbitKEY3=P1^6; //独立按键3sbitLED=P1^3; //报警小灯sbitBUZZ=P1^2; //蜂鸣器bitflag;//......................................................................................////.....................................函数声明.........................................////......................................................................................//voiddelay2x(uint8t);voiddelay(uint8t);voiddisplay(void);voidtimer0_init(void);voidtimer1_init(void);//.....................................................................................////........................................主函数.......................................////.....................................................................................//main(){ uint8key_num=0; //按键长按计时,时间到了,表示按键长按 flag=0; //计时标志 num=0; //数码管计数初值KEY1=1; //按键初始化 KEY2=1; KEY3=1; timer0_init(); //中断初始化 timer1_init(); while(1) //按键的循环扫描程序 { if(!KEY1) //按键1扫描程序,定时器时间加按键 { delay(15); //按键去抖 BUZZ=0; //按键按下后蜂鸣器响一下 if(!KEY1) //判断按键是否按下 { while(!KEY1) //等待按键放开和进入长按模式 { BUZZ=0; key_num++; delay(10); if(key_num==200) //判断是否进入长按模式 { key_num=0; while(!KEY1) { if(num<99) //判断数码管显示是否到达了最大值99 num++; Tempdata[0]=num/10; //取数码管显示的十位数 Tempdata[1]=num%10; //取数码管显示的个位数 delay(510); //长按延时,调节数码管显示不闪烁不重影 } } } BUZZ=1; //蜂鸣器关闭 key_num=0; if(num<99) num++; } } if(!KEY2) //按键2扫描程序,定时器时间减按键,同按键1 { delay(15); BUZZ=0; if(!KEY2) { while(!KEY2) { BUZZ=0; key_num++; delay(15); if(key_num==200) { //key_num=0; while(!KEY2) { if(num>0) num--; Tempdata[0]=num/10; Tempdata[1]=num%10; delay(510); } } } BUZZ=1; key_num=0; if(num>0) num--; } } Tempdata[0]=num/10; Tempdata[1]=num%10; if(!KEY3) //按键3扫描程序,开始暂停按键 { delay(15); //按键去抖 BUZZ=0; if(!KEY3) { while(!KEY3) BUZZ=0; //翻开蜂鸣器 BUZZ=1; //关闭蜂鸣器 ET1=0; //关闭定时器1中断 TR1=0; //关闭定时器1的开关 count++; //计数,用于判断标志位 flag=1; //置标志位,暂停,开始计时和关闭计时结束报警功能 if(count==2) { count=0; //暂停计数 flag=0; LED=1; //熄灭小灯 BUZZ=1; //关闭蜂鸣器 } } } } } //..................................................................................////..............................定时器0中断效劳子程序...............................////..................................................................................// voidinterrupt_timer0()interrupt1{ TH0=0xfc; //定时器0定时1ms TL0=0x67; if(flag) //判断是否开始计时 { number++; if(number==1100) //定时1s { if(num) //防止按键3误操作时程序跑飞 { num--; number=0; Tempdata[0]=num/10; Tempdata[1]=num%10; display(); if(num==0) //定时结束 { flag=0; //不在继续定时扫描 Tempdata[0]=0; Tempdata[1]=0; BUZZ=0; //蜂鸣器报警 LED=0; //报警小灯点亮 ET1=1; //翻开定时器1中断 TR1=1; //翻开定时器1开关 } } } } display(); //刷新数码管}//..............................................................................////....................................延时函数..................................////..............................................................................//voiddelay2x(uint8t){ while(--t);}voiddelay(uint8t){ while(--t) { delay2x(300); delay2x(300); } }//..............................................................................////..............................数码管动态扫描函数..............................////..............................................................................//voiddisplay(void){ SEG2=0; SEG1=1;//数码管给位选 P0=0xff; SEG1=1; P0=Duanma[Tempdata[0]];//数码管给段选 delay(2); SEG1=0; SEG2=1; P0=0xff; SEG2=1; P0=Duanma[Tempdata[1]];}//...................................

温馨提示

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

评论

0/150

提交评论