定时器课程设计报告Word文档下载推荐.docx
- 文档编号:21738562
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:22
- 大小:1.33MB
定时器课程设计报告Word文档下载推荐.docx
《定时器课程设计报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《定时器课程设计报告Word文档下载推荐.docx(22页珍藏版)》请在冰豆网上搜索。
4.keil编译与proteus仿真…………………………………………….8
4.1.keil编译…………………………………………………………………..8
4.2.proteus的仿真……………………………………………………………9
5.程序设计思路和程序框图………………………………………....10
5.1程序设计思路……………………………………………………………10
5.2定时器工作方式设置……………………………………………………11
5.3特殊功能寄存器TCON的设置………………………………………...11
5.4中断标号的查询…………………………………………………………11
5.5定时器程序详细程序框图……………………………………………....12
6.相关的计算……………………………………………………….…13
7.总结……………………………………………………………….…13
8.定时器程序清单……………………………………..…………….…14
9.参考文献…………………………………………………………....21
10.附录………………………………………………..…………….…21
1课程设计目的:
2课程设计题目描述和要求
2.1设计描述:
利用STC89C51等接口芯片设计定时器,要求通过键盘输入计时时间,按开始键开始计时,采用两位数码管显示计时时间,计时结束提供一种以上的报警方式。
2.2设计要求:
1.选用STC89C51和相关接口芯片完成相应的功能
2.画出详细的硬件连接图
3.给出程序设计思路,画出软件流程图
4.给出所有程序清单并加上必要注释
5.完成proteus仿真
6.撰写设计报告,调试报告及设计心得
3.课程设计硬件电路设计:
3.1设计项目简介:
定时器设计,此定时器是一款基于单片机STC89C51的计时工具,手动利用时间加减按键设定定时时间,当检测到开始计时按键按下后,定时器开始倒数计时,当计时结束的时候打开蜂鸣器和报警小灯,再检测到暂停按键按下的时候,关闭蜂鸣器和报警小灯。
3.2设计方案的选定与说明
因为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.08—0.16mA,低电平时输入灌电流,最大20mA左右。
因为没有外接驱动芯片驱动数码管,为了保护单片机不在高负荷下工作和简化电路,选择了共阳数码管,数码管的公共端连接三极管,根据一个二极管点亮大约需要电流5—10mA,当一个数码管的段和小数点全部点亮的时候,大约需要电流50—80mA,为使三极管工作在饱和状态并达到数码管全部显示时的驱动电流,基极电流的100倍需要大于发射极和集电极这间的电流,所以三极管接了一个1K的限流电阻。
三级管的开关作用由P1^0口和P1^1口控制。
设定时间需要按键,为了操作方便和编程方便设计了三个独立按键,每个独立按键设计了两种功能。
按键按下后单片机I/O口被置低,三个按键分别用作时间的加,减和定时器的开关,按键信号分别由p1^4口p1^5口和p1^6口输入单片机!
电源电路设计了两路,一路是用USB接口供电,比较方便,另一路就是外接电源,可以将3—5V电源正负极接在相应插针上对定时器供电!
3.4硬件电路图的绘制:
因为比较熟悉altiumdesigner这个EDA常用软件的使用,所以我选择用这个软件完成定时器硬件电路原理图的绘制和PCB的绘制。
1.电路原理图:
元件符号基本都是软件库文件里面符号,数码管用的是远光的共阳数码管,库文件里面没有找到这个数码管的原理图,就自己画了原理图和封装。
2.PCB图:
PCB排版的时候遵守的几个原则:
定时器数码管要显而易见便于观察时间,按键操作要方便,布线劲量短和简单,双面板布线顶层与底层布线相互垂直
3.PCB板3D视图:
4.实物图:
4Keil编译与proteus仿真:
4.1.Keil编译
4.2.proteus仿真:
将编写好的c程序加载到keil软件中,生成的hex文件再加载到proteus的单片机中,仿真完全通过。
5程序设计思路与程序框图:
5.1程序设计思路:
在程序中用到了两个定时器和两个中断,定时器0主要用作数码管计时,每过一秒,数码管显示时间减一秒,减到零时停止计数并点亮报警小灯和打开蜂鸣器报警。
它的工作原理是利用程序使定时器0每1毫秒产生一次时间中断,以1000次时间中断定义一秒,再利用程序对得到的秒数进行计数,再对得到的秒数分别对10整除和取余数得到数码管显示的十位和个位,通过定时器0每1毫秒刷新数码管一次将秒数显示出来,定时结束后,进入中断1,点亮小灯和打开蜂鸣器报警。
中断0主要用作数码管的扫描和定时并在定时结束后打开报警小灯,报警蜂鸣器以及进入中断1服务子程序。
定时器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*(65535-X)/11059200=0.001
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;
//数码管1
sbitSEG2=P1^1;
//数码管2
sbitKEY1=P1^4;
//独立按键1
sbitKEY2=P1^5;
//独立按键2
sbitKEY3=P1^6;
//独立按键3
sbitLED=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++;
}
}
KEY2)//按键2扫描程序,定时器时间减按键,同按键1
KEY2)
delay(15);
if(key_num==200)
//key_num=0;
while(!
if(num>
0)
num--;
}
if(num>
num--;
Tempdata[0]=num/10;
KEY3)//按键3扫描程序,开始暂停按键
KEY3)
KEY3)
BUZZ=0;
//打开蜂鸣器
//关闭蜂鸣器
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误操作时程序跑飞
{
number=0;
Tempdata[0]=num/10;
Tempdata[1]=num%10;
display();
if(num==0)//定时结束
//不在继续定时扫描
Tempdata[0]=0;
Tempdata[1]=0;
//蜂鸣器报警
LED=0;
//报警小灯点亮
ET1=1;
//打开定时器1中断
TR1=1;
//打开定时器1开关
}
}
display();
//刷新数码管
}
//..............................................................................//
//....................................延时函数..................................//
voiddelay2x(uint8t)
while(--t);
voiddelay(uint8t)
while(--t)
delay2x(300);
//..............................数码管动态扫描函数..............................//
voiddisplay(void)
{
SEG2=0;
SEG1=1;
//数码管给位选
P0=0xff;
SEG1=1;
P0=Duanma[Tempdata[0]];
//数码管给段选
delay
(2);
SEG1=0;
SEG2=1;
P0=Duanma[Tempdata[1]];
//...............................................................................//
//....................................中断0初始化................................//
voidtimer0_init(void)
TMOD|=0X01;
//定时器
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 定时器 课程设计 报告