电子定时器设计报告.docx
- 文档编号:7314512
- 上传时间:2023-01-22
- 格式:DOCX
- 页数:23
- 大小:236.43KB
电子定时器设计报告.docx
《电子定时器设计报告.docx》由会员分享,可在线阅读,更多相关《电子定时器设计报告.docx(23页珍藏版)》请在冰豆网上搜索。
电子定时器设计报告
湖南人文科技学院
课程设计报告
课程名称:
单片机原理及应用课程设计
设计题目:
电子定时器
系别:
通信与控制工程系
专业:
电子信息工程
班级:
2006级2班
学生姓名:
姜虎
学号:
06409220
起止日期:
2009年6月8日~2009年6月19日
指导教师:
岳舟李新君
教研室主任:
谢四莲
指导教师评语:
指导教师签名:
年月日
成绩评定
项目
权重
成绩
1、设计过程中出勤、学习态度等方面
0.2
2、课程设计质量与答辩
0.5
3、设计报告书写及图纸规范程度
0.3
总成绩
教研室审核意见:
教研室主任签字:
年月日
教学系审核意见:
主任签字:
年月日
摘要
本次设计在以STC89C52单片机为核心的系统板上利用C语言设计电子定时器。
该电子定时器能定时给电器供电或断电,最大定时时间可以长达三十小时,操作使用方便。
采用STC89C52单片机控制,4位共阳数码管显示时间,继电器作电器电源输出控制。
该定时器可预置定时时间,并设有四种工作方式,可通过矩阵键盘上的四个按键来选定定时器的不同工作方式,然后结合继电器对电器进行供电和断电;利用单片机内部的定时器T0,成功实现了计时器的计时功能;本电子定时器每种工作方式供电的最后五秒钟都通过蜂鸣器进行报警,以此提醒用户电器即将断电或供电,方便用户对电器进行其它的操作。
关键词:
电子定时器;供电或断电;继电器;30小时;数码显示
目录
设计要求1
1方案论证与对比1
1.1方案一1
1.2方案二2
1.3方案对比与选择2
2单元电路设计与计算3
2.1STC89C52单片机接口分配电路设计3
2.2矩阵键盘电路的设计3
2.3继电器电路的设计4
2.4蜂鸣器电路的设计5
2.5数码管显示电路设计5
3系统软件工作流程图6
3.1系统工作流程6
3.2定时器T0中断服务流程及分析7
4系统调试及性能分析8
5详细仪器清单9
6总结与思考及致谢10
参考文献10
附录一:
单片机系统板原理图11
附录二:
详细系统源程序12
电子定时器
设计要求
利用单片机为核心,设计并制作电子定时器,具有以下功能:
(1)电子定时器能定时给电器供电或断电;
(2)给电最大时间可以长达30h;
(3)四位数码管显示时间;
(4)继电器作电器电源输出控制。
1方案论证与对比
1.1方案一
该方案由待命状态、预定定时时间、工作方式选择、系统处理、DS1302处理时间、蜂鸣器报警、数码显示等模块组成。
系统的计时部分采用了一块时钟芯片DS1302,用其实现系统通过继电器对电器供电的计时工作。
原理框图如图1所示[3]:
图1方案一系统方框图
1.2方案二
该方案仅由待命状态、预定定时时间、工作方式选择、系统处理、继电器报警、数码显示四个模块组成。
整个系统的计时功能皆由STC89C52内部自带的定时器T0来实现。
同样,结合继电器给电器供电,并利用蜂鸣器进行断电报警。
原理框图如图2所示:
图2方案二系统方框图
1.3方案对比与选择
以上两个方案在原理上显然都可以完成该电子定时器的设计。
但方案一中利用DS1302时钟芯片进行计时,虽然可达到题目的计时要求,但题目要求最大计时需达到30个小时,而该芯片的计时周期规定了为24小时制,所以如果采用该方案的话,程序的设计处理复杂度将会大大增加。
在方案二中,利用STC89C52单片机内部的定时器T0循环溢出中断,从而完成定时器的计时功能,4位共阴数码管显示时间,继电器作电器电源输出控制,其电路简单,操作使用方便,大大减轻了设计的工作量。
所以选定该方案来进行本次课程设计。
2单元电路设计与计算
2.1STC89C52单片机接口分配电路设计
在本次设计中,需用到多个输出端口,所以熟悉单片机的接口也是至关重要的。
P0作为矩阵键盘的专用控制口;P2口作为专门的数据输出口;P1口作为数码管的位选端口;P3口分别用以控制各个中断、继电器、蜂鸣器等各个模块的控制。
在XTAL2引脚和XTAL1引脚之间接有一块12M的晶振,从而使芯片内部的定时器能实现计时功能。
单片机接口分配电路如图3所示:
图3STC89C52单片机接口原理图
2.2矩阵键盘电路的设计
根据设计要求,需要通过按键来选择系统的工作方式,所以我从4×4矩阵键盘上定义了七个按键,可以通过按键0~2来设定定时时间;通过按键4~7来控制系统分别工作于1、2、3、4工作方式中。
矩阵键盘电路如图4所示:
图4矩阵键盘电路原理图
在程序中,先将其中一排的公共线拉低,即给P0口赋一个值(如0x7F)。
然后如果这一排有键被按下的话,P0口的值就会发生改变,例如按下0号键,P0口的值就会由0x7F变成0x7E,依次类推,我们就可以根据P0口值的变化来获得各个键值。
2.3继电器电路的设计
由P35引脚输出高低电平经R201控制三极管的通断,从而控制继电器的吸合与释放,继电器的输出端采用分离方式,即输出端不与内电路连接,直接连接端子,这样会增加更多利用功能,可控制更高电压设备的开和关,图上的J14插针开关控制继电器电路的电源。
继电器电路原理图如图5所示:
图5继电器电路原理图
2.4蜂鸣器电路的设计
为了提醒用户对电器供电或断电后的其它工作,设计中用到了蜂鸣器的报警功能。
在电路中蜂鸣器由P3.4脚控制,它与电脑键盘接口DATA引脚经J15进行切换。
单片机P34脚输出高低电平经R902加在三极管B极,控制三极管的导通与截止,从而控制蜂鸣器的工作。
J15也可认为是一个开关,插针拔出即切断蜂鸣器了。
电路如图6示:
图6蜂鸣器电路原理图
2.5数码管显示电路设计
由于该设计需用到四位数码管来显示时间,所以必须要有一个数码管显示电路。
电路数码管为共阴型,与发光二极管相反,要使数码管点亮,P2口就得输出高电平,数码管位的选择由138来处理(74HC138为3-8译码器,输入3位数据译出8种状态线),138的输入由P10-P12(000-111)译码出八线接入数码管位选择脚,138输出的八线同一时刻只有一线为低电平,即每次只选择其中一位数码管显示。
用动态扫描技术对各个数码管进行扫描,由P1控制位选。
利用快速的循环显示,人眼看到的就是多位了。
电路中还有一个JSM开关,是控制138的SA脚到GND,使138不做译码,输出八线全为高电平而关闭数码管显示。
数码管电路原理图如图7示:
图7数码管显示电路原理图
3系统软件工作流程图
3.1系统工作流程
程序采用模块化、结构化设计,并采用了软件抗干扰技术,其软件的可靠性较好,可维护性强。
在本主程序中有3个状态:
待命状态、计时工作状态和到点工作状态。
当系统进入待命状态时,数码管上会显示“----”样符号;通过按键0~2来预置定时时间,只要按下4~7中的任何一个按键即可分别进入1、2、3、4工作方式中;工作方式1为定时关电源,定时范围为0秒~59分59秒;工作方式2为定时关电源,定时范围为0秒~99时59分;工作方式3为定时开电源,定时范围为0秒~59分59秒;工作方式4为定时开电源,定时范围为0秒~59分59秒。
在每种工作方式中,都结合数码管显示时间,继电器给电器供电或断电的最后五秒钟都会利用蜂鸣器进行报警。
系统程序流程图如下图所示:
图8系统程序流程图
3.2定时器T0中断服务流程及分析
定时器T0用于时间计时。
定时溢出中断周期设为50ms,中断进入后先进行定时中断值校正,当中断累计20次(即50ms×20=1s)时,对秒计数单元进行加1操作;当到了60s时,分计数单元加1操作;同理可得到了60分时,时计数单元加1操作,直到计时完毕。
T0中断计时流程图如图9所示:
图9T0中断计时流程图
4系统调试及性能分析
先检查印制板及焊接的质量情况,在检查无误后通电检查数码管的点亮状况。
至于矩阵键盘的调试,关键是把握好按键的去抖效果。
当出现按键“不灵”情况,一般是由于程序中用于按键去抖的延时时间不够。
将程序编辑编译完成后,将生成的hex文件通过串口下载软件下载到STC89C52单片机芯片中去。
在进行调试之前,还应注意操作的顺序:
先进行定时时间的预置,然后选定工作方式。
下表所列的是系统定时
功能测试结果。
表1系统计时测试结果
测量序号
理论值
测量值
1分钟
1分钟
1分钟
1小时
1小时
1小时
10小时
10小时
9小时59分58秒
15小时
15小时
14小时59分55秒
30小时
30小时
29小时59分51秒
误差分析:
由于程序中使用了一些延时语句,所以如果计时时间过长的话,就会在时间上产生一定的误差。
因为我们的计时完全是通过单片要内部的计时器来完成的,所以该误差是不可避免的。
5详细仪器清单
表2仪器清单
仪器名称
数量
STC89C52开发板
1块
串口下载线
1根
电源线
1根
跳线
两根
万用表
1块
6总结与思考及致谢
课程设计是针对某一理论课程的要求,对学生进行综合性实践训练的实践教学环节,可以提高学生运用课程中所学的理论知识与实践紧密结合,独立地解决实际问题的能力。
在这次课程设计过程中使我从中学到许多以前在课本和课堂上所无法学到的,特别是在课程设计过程中查找资料的过程中从中学到了许多东西并从中体会到许多的乐趣,从而丰富了自己,使自己无论是上课时还是在课余都感到很充实。
在本次课程设计的过程中,曾得到过老师与几位同学的悉心指导与帮助,才使得我的设计非常圆满的完成,在此对他们表示我们最衷心的感谢,谢谢你们!
因学习知识的能力和时间有限,并且此次单片机原理及应用课程设计对于我们来说还只是初体验,因此在本次的课程设计过程中,难免存在错误,恳请老师给以批评和指正,并再次感谢曾帮助过我的老师和同学。
参考文献
[1]楼然苗,李光飞编著.单片机课程设计指导[M].北京:
北京航空航天大学出版社,2007
[2]朱定华,戴汝平编著.单片微机原理与应用[M].北京:
清华大学出版社,2003
[3]胡汉才编著.单片机原理及接口技术[M].北京:
清华大学出版社,2004
[4]谭浩强编著.C程序设计(第三版)[M].北京:
清华大学出版社,2005
[5]李大友.姜秀芳主编.单片微型硬件.软件及应用[M].北京:
高等教出版社,2003
[6]沈红卫编著.单片机应用系统设计实例与分析[M].北京:
北京航空航天大学出版社,2002
附录一:
单片机系统板原理图
附录二:
详细系统源程序
#include
/**************************************************************************/
voiddelayus(unsignedintt);//us级延时程序
voiddelayms(unsignedintn);//ms级延时程序
voidReadKey(void);//扫描键盘及做相应处理
voidtime0_initialize(void);//定时器初始化
voidtime_s_min_hour(void);//中断处理函数
voiddisplay0(void);//工作方式1、3显示函数(只显示分、秒)
voiddisplay1(void);//工作方式2、4显示函数(只显示时、分)
voiddisplay2(void);//待命状态显示函数(显示“----”)
voiddisplay3(void);//设置分、秒位显示函数
voiddisplay4(void);//设置时、分位显示函数
/**************************************************************************/
unsignedchartable[][2]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//不带小数点的显示段码表
unsignedcharT50ms,Ts,Tmin,Thour;//时间变量
unsignedcharSet_Ts=0,Set_Tmin=0,Set_Thour=0;//设定时间变量值
unsignedcharKey_number=0;//键值
sbitjqc=P3^5;//继电器接口
sbitspeak=P3^4;//蜂鸣器接口
/********************************主函数************************************/
voidmain()
{
while
(1)
{
switch(Key_number)//根据键值确定定时方式
{
case1:
//方式1:
定时关电源,定时范围为0s~59min59s;
{
jqc=0;//供电状态
display0();
}break;
case2:
//方式2:
定时关电源,定时范围为0s~99h59min
{
jqc=0;//供电状态
display1();
}break;
case3:
//方式3:
定时开电源,定时范围为0s~59min59
{
display0();
}break;
case4:
//方式4:
定时开电源,定时范围为0s~99h59min.
{
display1();
}break;
case10:
//定时时间设置:
0min~99h59min.
{
display4();//显示设置的时、分位
ReadKey();
}break;
case12:
//定时时间设置:
0s~59min59s;
{
display3();//显示设置的分、秒位
ReadKey();
}break;
default:
//数码管显示“----”,表示系统处于待命状态。
{
ReadKey();
display2();//显示“----”
}break;
}
}
}
/***************************定时器初始化函数*******************************/
voidtime0_initialize(void)[4]
{
TMOD=0x01;//16位定时器计数器
ET0=1;//T0开中断
EA=1;//中断总开关打开
TH0=0X3c;//T0装入初值,实现50ms定时
TL0=0Xb0;
TR0=1;//开启T0
jqc=1;//初始化继电器
speak=1;//初始化蜂鸣器
}
/********************************中断处理函数******************************/
voidtime_s_min_hour(void)interrupt1
{
ET0=0;//关中断T0
TR0=0;//关T0
TH0=0x3c;//重新装入初值
TL0=0xB0;
TR0=1;//开T0
T50ms++;
if(T50ms==20)
{
T50ms=0;
Ts++;//到了1秒钟
if(Ts==60)//到了1分钟
{
Ts=0;//秒值清0
Tmin++;
}
if(Tmin==60)//到了1小时时到了
{
Tmin=0;//分值清0
Thour++;
}
}
ET0=1;//重新开中断T0
}
/*************************读键盘值函数并做相应操作*************************/
voidReadKey(void)[1]
{
P0=0x7F;//将第一排的公共线拉低,检测第一排是否有按键按下
switch(P0)//读回P0口值做判断
{
case0x7e:
//0键被按下设定定时时间的时位
{
Key_number=10;//只显示时、分
Set_Thour++;//时位加1
delayms(300);
if(Set_Thour>99)//超出范围重新初始化
Set_Thour=0;
}break;
case0x7d:
//1键被按下设定定时时间分位
{
Key_number=12;
Set_Tmin++;//分位加1
delayms(300);
if(Set_Tmin>59)//超出范围重新初始化
Set_Tmin=0;
}break;
case0x7b:
//2键被按下设定定时时间秒位
{
Key_number=12;//只显示分、秒
delayms(300);
Set_Ts++;//秒位加1
if(Set_Ts>59)//超出范围重新初始化
Set_Ts=0;
}break;
default:
break;
}
P0=0xbF;//选定工作方式按键
switch(P0)
{
case0xbe:
//说明4键被按下:
工作方式1
{
Key_number=1;
time0_initialize();//定时器初始化
}break;
case0xbd:
//同上5键按下:
工作方式2
{
Key_number=2;
time0_initialize();//定时器初始化
}break;
case0xbb:
//6键按下:
工作方式3
{
Key_number=3;
time0_initialize();//定时器初始化
}break;
case0xb7:
//7键按下:
工作方式4
{
Key_number=4;
time0_initialize();//定时器初始化
}break;
default:
break;
}
}
/********************工作方式1、3显示函数(只显示分、秒)*********************/
voiddisplay0(void)
{
unsignedcharfenshi,fenge,miaoshi,miaoge;//定义分,秒的十、个位
fenshi=Tmin/10;//分的十位
fenge=Tmin%10;//分的个位
miaoshi=Ts/10;//秒的十位
miaoge=Ts%10;//秒的个位
P2=table[fenshi];
P1=0x00;//第0个数码管显示分的十位
delayus(200);
P2=table[fenge];
P1=0x01;//第1个数码管显示分的个位
delayus(200);
P2=table[miaoshi];
P1=0x02;//第2个数码管显示秒的十位
delayus(200);
P2=table[miaoge];
P1=0x03;//第3个数码管显示秒的个位
delayus(200);
if((Set_Tmin==Tmin)&&((Set_Ts-Ts)<=5))//最后5秒钟蜂鸣器报警
speak=0;
if((Set_Tmin==Tmin)&&(Set_Ts==Ts))
{
Set_Ts=0;
Set_Tmin=0;
Set_Thour=0;
jqc=!
jqc;//时间到了,供电状态改变
Key_number=0;//按键复位
}
}
/********************工作方式2、4显示函数(只显示时、分)********************/
voiddisplay1(void)
{
unsignedcharshishi,shige,fenshi,fenge;//定义时分的十、个位
shishi=Thour/10;//时的十位
shige=Thour%10;//时的个位
fenshi=Tmin/10;//分的十位
fenge=Tmin%10;//分的个位
P2=table[shishi];
P1=0x00;//第0个数码管显示时的十位
delayus(200);
P2=table[shige];
P1=0x01;//第1个数码管显示时的个位
delayus(200);
P2=table[fenshi];
P1=0x02;//第2个数码管显示分的十位
delayus(200);
P2=table[fenge];
P1=0x03;//第3个数码管显示分的个位
delayus(200);
if(((Set_Thour-1)==Thour)&&((Set_Tmin-1)==Tmin)&&((Ts>=55)&&(Ts<=59)))//最后5秒钟蜂鸣器报警
speak=0;
if((Set_Thour-Thour==0)&&(Set_Tmin-Tmin==0)&&(Ts==0))
{
Set_Ts=0;
Set_Tmin=0;
Set_Thour=0;
jqc=!
jqc;//时间到了,供电状态改变
Key_number=0;//按键复位
}
}
/*************************待命状态显示函数(显示“----”)*********************/
voiddisplay2(void)[5]
{
P1=0x00;
delayus(20);
P2=table[10];
delayus(20);
P1=0x01;
delayus(20);
P2=table[10];
delayus(20);
P1=0x02;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子 定时器 设计 报告