ImageVerifierCode 换一换
格式:DOCX , 页数:22 ,大小:1.33MB ,
资源ID:8602347      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8602347.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(定时器课程设计报告.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

定时器课程设计报告.docx

1、定时器课程设计报告皖 西 学 院课程设计任务书系 别:机 电 学 院专 业:电 气学 生 姓 名:凌刚学 号:2011011047课程设计题目:基于STC89C51的定时器设计起 迄 日 期:12月 16日 12月 28日课程设计地点:教学实验楼B502楼指 导 教 师:张 磊 下达任务书日期: 2013年12月16 日基于STC89C51的定时器设计目录:1. 课程设计目的.22. 课程设计目的描述要求.22.1. 设计描述.32.2. 设计要求.33. 课程设计硬件电路的设计.3 3.1设计项目简介.33.2 设计方案的确定与说明.33.3 设计方案的详细硬件设计.3 3.4 硬件电路图的

2、绘制.54. keil编译与proteus仿真.84.1. keil编译.8 4.2. proteus的仿真95. 程序设计思路和程序框图.10 5.1 程序设计思路10 5.2 定时器工作方式设置11 5.3 特殊功能寄存器TCON的设置.115.4 中断标号的查询115.5 定时器程序详细程序框图.126. 相关的计算.137. 总结.138. 定时器程序清单.149参考文献.2110. 附录.211 课程设计目的:基于STC89C51的定时器设计2 课程设计题目描述和要求2.1 设计描述:利用STC89C51等接口芯片设计定时器,要求通过键盘输入计时时间,按开始键开始计时,采用两位数码管

3、显示计时时间,计时结束提供一种以上的报警方式。2.2 设计要求:1. 选用STC89C51和相关接口芯片完成相应的功能2. 画出详细的硬件连接图3. 给出程序设计思路,画出软件流程图4. 给出所有程序清单并加上必要注释5. 完成proteus仿真6. 撰写设计报告,调试报告及设计心得3.课程设计硬件电路设计:3.1设计项目简介:定时器设计,此定时器是一款基于单片机STC89C51的计时工具,手动利用时间加减按键设定定时时间,当检测到开始计时按键按下后,定时器开始倒数计时,当计时结束的时候打开蜂鸣器和报警小灯,再检测到暂停按键按下的时候,关闭蜂鸣器和报警小灯。 3.2 设计方案的选定与说明因为S

4、TC89C51芯片I/O口完全能满足定时器设计的需求,所以就没有外接芯片来扩展单片机I/O的使用。硬件电路最基础的是单片机所需要的最小系统:电源电路,晶振电路,复位电路。除此之外,单片机通过P0口接上拉电阻后连接了数码管的段选,P10口和P11口分别用作数码管十位和个位的位选,P12口用作蜂鸣器的控制,P13口用作报警小灯的控制,P14口P15口和P16口用作定时器按键的控制,风别控制时间的加/连加,减/连减和开始/暂停。3.3 设计方案的详细硬件设计:因为对STC89C51有过编程经验,对于用它设计一个定时器还是有把握的,所有我们在8086和STC89C51这两款单片机的选择中选择了STC8

5、9C51。STC89C51它有四个八位I/O口,我们用P0口接了上拉电阻,原因有三点:1:P0口片内无上拉电阻2:P0为I/O工作状态时,上方FET被关段,从而输出脚浮空,因此,P0用于输出线时为开漏输出。3:由于片内无上拉电阻,上方FET又被关断,P0输出时无法拉升端口电平。考虑到单片机I/O口的驱动电流问题,高电平时输出拉电流,大概0.080.16mA,低电平时输入灌电流,最大20mA左右。因为没有外接驱动芯片驱动数码管,为了保护单片机不在高负荷下工作和简化电路,选择了共阳数码管,数码管的公共端连接三极管,根据一个二极管点亮大约需要电流510mA,当一个数码管的段和小数点全部点亮的时候,大

6、约需要电流5080mA,为使三极管工作在饱和状态并达到数码管全部显示时的驱动电流,基极电流的100倍需要大于发射极和集电极这间的电流,所以三极管接了一个1K的限流电阻。三级管的开关作用由P10口和P11口控制。设定时间需要按键,为了操作方便和编程方便设计了三个独立按键,每个独立按键设计了两种功能。按键按下后单片机I/O口被置低,三个按键分别用作时间的加,减和定时器的开关,按键信号分别由p14口p15口和p16口输入单片机!电源电路设计了两路,一路是用USB接口供电,比较方便,另一路就是外接电源,可以将35V电源正负极接在相应插针上对定时器供电!3.4 硬件电路图的绘制: 因为比较熟悉altiu

7、m designer这个EDA常用软件的使用,所以我选择用这个软件完成定时器硬件电路原理图的绘制和PCB的绘制。1.电路原理图:元件符号基本都是软件库文件里面符号,数码管用的是远光的共阳数码管,库文件里面没有找到这个数码管的原理图,就自己画了原理图和封装。2.PCB图: PCB排版的时候遵守的几个原则:定时器数码管要显而易见便于观察时间,按键操作要方便,布线劲量短和简单,双面板布线顶层与底层布线相互垂直3.PCB板3D视图:4.实物图:4 Keil编译与proteus仿真:4.1 . Keil编译4.2. proteus仿真:将编写好的c程序加载到keil软件中,生成的hex文件再加载到pro

8、teus的单片机中,仿真完全通过。5 程序设计思路与程序框图:5.1 程序设计思路:在程序中用到了两个定时器和两个中断,定时器0主要用作数码管计时,每过一秒,数码管显示时间减一秒,减到零时停止计数并点亮报警小灯和打开蜂鸣器报警。它的工作原理是利用程序使定时器0每1毫秒产生一次时间中断,以1000次时间中断定义一秒,再利用程序对得到的秒数进行计数,再对得到的秒数分别对10整除和取余数得到数码管显示的十位和个位,通过定时器0每1毫秒刷新数码管一次将秒数显示出来,定时结束后,进入中断1,点亮小灯和打开蜂鸣器报警。中断0主要用作数码管的扫描和定时并在定时结束后打开报警小灯,报警蜂鸣器以及进入中断1服务

9、子程序。定时器1和中断1用作产生不同频率的波形送给蜂鸣器让蜂鸣器报警。主函数中初始化各个变量和函数后,首先进入中断0服务子程序,然后循环进行按键的扫描。5.2 定时器工作方式设置: 5.3 特殊功能寄存器TCON的设置:5.4 中断标号的查询:5.5.定时器程序详细程序框图:定时器1服务子程序: 目的是产生不规则的脉冲送给蜂鸣器,让蜂鸣器以不同响声报警。 6 相关计算:定时器每经过一个机器周期定时器加1,51单片机的一个机器周期默认包括12个时钟周期,这次用的定时器0和定时器1都是16位定时器,最高计数能达到65535,因为用的是11.0592M晶振,所以设定1毫秒的定时计算如下:12*(65

10、535-X)/11059200 = 0.001 X = 64615将十进制的X = 64615转换成十六进制得到FC67, 定时器的高低位分别是: THXx= FC,TLx = 67.7总结:本次试验是一个基于STC89C51的定时器设计,根据老师提供的设计要求,设计中需要用到数码管,按键和报警小灯等,在硬件电路的设计中考虑了一下上电复位的时候单片机的引脚都置高电平了,接小灯和蜂鸣器和数码管的时候都特别注意了一下,防止上电复位对设计造成影响。在这次设计中我对三极管和数码管的用法和接线有了更加深刻的理解。在写程序的时候,第一次是一次性把所有的程序给写完的,包括数码管的显示,按键的扫描,中断的调用

11、等,但是仿真的时候出不来结果。然后就一个一个模块调试,先调试的是数码管,发现数码管的动态刷新时间还是有较高要求的,时间太长会闪烁,时间太短会造成重影,用了两个数码管,最后调整在大约3毫秒。调试按键的时候出现按一次跳变几个数的情况,原因是按键没有硬件去抖也没有软件去抖,因为软件去抖也挺好实现的,就决定了在程序里面软件去抖,最后去抖延时调整在大约15毫秒,按键可以很好的被识别。每个按键设计了两种功能,对按键没有放开的时候进行了计时,超过2秒就认为达到长按模式,这个调试的时候也出现过问题,就是按键去抖延时太长或者太短的时候,按下去很久数码管依旧刷新不了,放开的时候会加1,最后按键去抖大约10到15毫

12、秒的时候这个问题就不出现了。本来想让报警小灯闪烁的,但是在中断里面加程序的时候出现了死循环,最后就让小灯常亮了,这是一个缺陷,蜂鸣器程序是在中断1里面的,本来想加警车报警声音的,但是延时控制的不是很好,这也是一个缺陷。最后定时器还是能完全实现老师要求的功能的。再同学们去实验室调试的时候,感谢老师对芯片用法的细心指导。8定时器程序清单:#include /./.全局定义数据类型././typedef unsigned char uint8;typedef unsigned int uint16;typedef unsigned long uint32;/./.定义数码管显示数字和一些全局变量./

13、./uint8 code Duanma10=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;uint8 Tempdata2;uint8 num,count;uint32 number ,frq;/./.端口的定义././sbit SEG1 = P10; /数码管1sbit SEG2 = P11; /数码管2sbit KEY1 = P14; /独立按键1sbit KEY2 = P15; /独立按键2sbit KEY3 = P16; /独立按键3sbit LED = P13; /报警小灯sbit BUZZ = P12; /蜂鸣器bit flag

14、;/./.函数声明././void delay2x(uint8 t);void delay(uint8 t);void display(void);void timer0_init(void);void timer1_init(void);/./.主函数././main() uint8 key_num = 0; /按键长按计时,时间到了,表示按键长按 flag = 0; /计时标志 num = 0; /数码管计数初值 KEY1 = 1; /按键初始化 KEY2 = 1; KEY3 = 1; timer0_init(); /中断初始化 timer1_init(); while(1) /按键的循环

15、扫描程序 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+; Tempdata0 = num/10; /取数码管显示的十位数 Tempdata1 = num%10; /取

16、数码管显示的个位数 delay(510); /长按延时,调节数码管显示不闪烁不重影 BUZZ = 1; /蜂鸣器关闭 key_num = 0; if(num 0) num-; Tempdata0 = num/10; Tempdata1 = num%10; delay(510); BUZZ = 1; key_num = 0; if(num 0) num-; Tempdata0 = num/10; Tempdata1 = num%10; if(!KEY3) /按键3扫描程序,开始暂停按键 delay(15); /按键去抖 BUZZ = 0; if(!KEY3) while(!KEY3) BUZZ

17、= 0; /打开蜂鸣器 BUZZ = 1; /关闭蜂鸣器 ET1 = 0; /关闭定时器1中断 TR1 = 0; /关闭定时器1的开关 count+; /计数,用于判断标志位 flag = 1; /置标志位,暂停,开始计时和关闭计时结束报警功能 if(count = 2) count = 0; /暂停计数 flag = 0; LED = 1; /熄灭小灯 BUZZ = 1; /关闭蜂鸣器 /./.定时器0中断服务子程序././ void interrupt_timer0() interrupt 1 TH0 = 0xfc; /定时器0定时1ms TL0 = 0x67; if(flag) /判断是

18、否开始计时 number+; if(number = 1100) /定时1s if(num) / 避免按键3误操作时程序跑飞 num-; number = 0; Tempdata0 = num/10; Tempdata1 = num%10; display(); if(num = 0) /定时结束 flag = 0; /不在继续定时扫描 Tempdata0 = 0; Tempdata1 = 0; BUZZ = 0; /蜂鸣器报警 LED = 0; /报警小灯点亮 ET1 = 1; /打开定时器1中断 TR1 = 1; /打开定时器1开关 display(); /刷新数码管/./.延时函数./.

19、/void delay2x(uint8 t) while(-t);void delay(uint8 t) while(-t) delay2x(300); delay2x(300); /./.数码管动态扫描函数././void display(void) SEG2 =0; SEG1 = 1; /数码管给位选 P0 = 0xff; SEG1 =1; P0 = DuanmaTempdata0; /数码管给段选 delay(2); SEG1 = 0; SEG2 = 1; P0 = 0xff; SEG2 = 1; P0 = DuanmaTempdata1;/./.中断0初始化././ void timer0_init(void) TMOD |= 0X01; /定时器

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1