多功能定时器.docx
《多功能定时器.docx》由会员分享,可在线阅读,更多相关《多功能定时器.docx(21页珍藏版)》请在冰豆网上搜索。
多功能定时器
应用科学学院
《电子系统设计》课程设计报告
姓名:
杨春波
学号:
5号
专业班级:
12级嵌入式系统实验班
指导教师:
朱水金
设计题目:
基于单片机多功能定时器
完成时间:
2015年06月27日
设计(45%)
制作(35%)
实训报告(20%)
总评
简易难度(15%)
控制方式
(10%)
原理图
(10%)
装配图
(10%)
器件焊接
(5%)
软件控制
(10%)
功能实现
(10%)
质量评估
(10%)
格式
(5%)
内容
(15%)
指导教师签名:
2.3.3模拟图……………………………………………………………………………...9
第一章引言
1.1选题背景
定时器已成为人们日常生活中必不可少的物品,广泛用于个人家庭以及车站,码头,剧院,办公室等公共场所,给人们的生活,学习,工作,娱乐带来极大的方便。
随着技术的发展,人们已不满足于钟表原先的报时功能,希望出现许多新的功能,但这些新的功能都是以定时器为基础的,因此研究定时器及其扩展功能有着非常现实的意义,具有很大的实用价值。
本次课程设计中,采用单片机作为主要芯片设计倒计时控制系统,本设计的使用性强,设计灵活方便并且适合在任何条件下进行定时。
1.2内容摘要
利用单片定时器及计时器产生定时效果通过编程形成倒计时效果,再利用数码管动态扫描显示单片机内部处理的数据,同时通过端口读入当前外部控制状态来改变程序的不同的状态,实现不同的功能。
系统上电自检后,实现分钟,秒钟信息的显示,通过按键可实现校对时间,倒计时的设定和显示。
当设置的定时时间到时,单片机通过蜂鸣器来实现报警,再利用开关实现止闹的功能。
1.3设计任务
设计题目:
多功能定时器
设计一个适用于需要显示当前时间或倒计时的场所(如演讲比赛等)的多功能电子定时器电路,实现设计要求提出的各项控制功能。
1.4性能指标
(1)应用单片机和时钟芯片设计电路,功能切换通过按键控制,显示采用LED数码管;
(2)实现4位时间显示(“时”2位,“分”2位);
(3)实现5分钟的倒计时功能,由按键控制计时开始或停止、重新开始,可以通过按键重新设置计时时间(如改为3分30秒等);
(4)实现秒计时功能,最大显示达到60分钟;
第二章系统电路设计
2.1系统总体设计框架
本设计主要功能是实现时间的设定,倒计时,报警功能,采用分秒显示,在4位八段LED上显示分和秒。
若想设置时间,需复位;用定时器1进行扫描按键,判断是否有键按下,是哪个键按下;定时时间到则蜂鸣器会报警;复位后停止发出警报声音,时间显示为系统初始时间(由软件设定),按下确认健后,系统开始重新倒计时。
结构框图如图2-1所示:
图2-1系统结构框图
2.2系统硬件单元电路设计
2.2.1主控单元
主控单元主要有89c52单片机构成,主要利用片内定时器0进行定时,定时器1进行按键扫描,控制各个模块完成倒计时定时功能。
具体引脚安排如图2-2.1所示:
图2-2.1
2.2.2时钟电路设计
时钟电路对单片机是不可缺的,单片机的每个功能都要以时钟电路为基础工作。
单片机内部自带一个时钟电路,外部接入定时控制元件即可构成一个稳定的自激振荡器。
其中机器周期共有12个振荡脉冲周期,因此,机器周期是时钟周期的12倍。
本课题中定时器电路中使用的晶体是12MHz,则时钟周期为(1/12)us,机器周期为1us。
如图2-2所示:
图2-2.2时钟电路图
2.2.3复位电路
复位操作是使单片机进入设定的初始状态。
复位电路的基本功能是:
系统上电时提供复位信号,直至系统电源稳定后,撤销复位信号。
复位操作有上电自动复位、按键电平复位和外部脉冲复位三钟方式,本次课设用的是按键电平复位,利用电容的充放电公式来选择所需的电容、电阻,能保证复位信号高电平持续时间大于2个机器周期。
电路图如图2-2.3所示:
图2-2.3
2.2.4键盘模块
(1)键盘的作用
计算机控制系统中,数据和控制信号的输入主要使用键盘,键盘接口,尤其是按键输入信号的软件处理方法是影响系统使用和操作的重要因素,键盘接口和软件的任务主要包括一下几个方面:
*检测并判断是否有按键按下
*按键开关的延时消抖功能
*计算并确定按键的键值
*程序根据键值进行一系列的处理和执行
(2)键盘的选择
键盘可以分为独立连接式和矩阵式。
,每类按译码方式分为编码式的和非编码式两种,单片机中一般都使用的是软件来识别和产生键代码的非编码式键盘行列式键盘编码方式有静态和动态两种,静态接口主要由一个行编码器和列编码器构成,动态接口可采用计数器,译码器和数据选择器来构成这两种键盘,由硬件完成键的译码任务。
一般小的控制系统较多采用非编码独立式较合适,使用矩阵键盘,能减少键盘与单片机接口时说占用的I/O线的数目,综上所述,本实验用的是非编码式键盘。
(3)矩阵式键盘基本原理
对于这种矩阵式的键盘连接,扫描时依次将行线置为低电平,即在置某根行线为低电平时,其它都线为高电平。
在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。
若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。
注意在按键时一定要调延时子程序来消除抖动。
(4)按键电路:
如图2-2.4
图2-2.4
2.2.5显示模块
本模块的主要功能就是显示倒计时的起始时间,开始倒计时后的时间变化以及显示设定好的时间。
基于AT89C52单片机的数码管显示分为了两个大块:
分钟显示和秒钟显示。
其工作原理由段码线送出待显示字符,然后通过顺序执行依次选中的每一位数码管,同时使显示的字符在每一位停留一会,由于人眼的惰性,可以同时看到4个LED的显示。
4个LED由p0口控制,由于是供阴极,所以高电平有效。
动态显示设计电路如图2-2.5
图2-2.5
2.2.6蜂鸣器报警电路
系统为了提示倒计时完成设计了报警提示电路,电路主要有一个蜂鸣器和一个三极管组成。
在倒计时完成时通过控制端口P3.2给三极管送入一个低电平使其导通,实现蜂鸣器报警,当数码管数字显示为0时,蜂鸣器报警。
蜂鸣器电路设计电路图如图2-2.6所示
图2-2.6
2.3系统原理图及印刷板图
2.3.1系统硬件原理图
总电路图由时钟电路、复位电路、蜂鸣器电路、键盘电路、数码管显示电路组成来实现定时功能。
其中四个数码管为共阴极的数码管。
74HC573为锁存器,这里是增加驱动的功能,使数码管可以正常显示。
系统硬件电路图如图2-3.1所示:
图2-3.1
2.3.2pcb布线图
图2-3.2
2.3.3模拟图
如图2-3.3
图2-3.3
2.4实物图
正面图2-4.1
反面图2-4.2
第三章系统软件设计
3.1系统软件流框图
本系统中,定时器0负责计时,并且以秒为单位,定时器1负责进行定时扫描,所以当进入系统主函数后,系统不停地进行显示和按键处理,定时和按键扫描在中断中进行,这样就提高了系统的实用性。
软件流框图如图3-1所示:
图3-1
3.2按键扫描流程图和程序
如图3-2所示:
代码
void K_scan(void)
{
uchar i;
if(P1==0xff)
{
return;
}
for(i=0;i<5;i++)
{
if((P1|(0x10>>i))==0xff)
{
key=i+1;
return;
}
}
}
图3-2
3.3按键处理子程序流程图和程序
如图3-3所示
图3-3
代码:
void DealKey(void)
{
if(key ==0)
return;
switch(key)
{
case 1:
key=0;
if(rocket<2){
if(sec<=0){
sec=0;
return;
}
sec--;
}
else{
if(min<=0){
min=0;
return;
}
min--;
}
return;
case 2:
key=0;
if(rocket==0)
rocket=0;
rocket--;
return;
case 3:
key=0;
TR0=1;
TR1=1;
return;
case 4:
key=0;
TR0=0;
//min=3;
//sec=30;
//if(rocket==4)
//rocket=4;
//rocket++;
return;
case 5:
key=0;
if(rocket<2){
sec++;
if(sec>59)
sec=59;
}
else{
min++;
if(min>59)
min=59;
}
return;
}
}
3.4系统总体软件设计代码
见附录一
第四章系统整体调试
5.1硬件调试
单片机应用系统的硬件调试和软件调试是分不开的.许多硬件故障只有通过软、硬件统调才能发现,但一般是先排除系统中比较明显的硬件故障后才和软件一起统调。
常见的硬件故障:
(1)逻辑错误
硬件的逻辑错误是由于设计错误和焊接过程中的工艺错误而造成的,包括错线、开路、短路等,其中最常见的是短路故障。
(2)元器件错误
元器件错误的原因有器件损坏或性能不符合要求,电解电容、二极管的极性接反或集成块装反等。
(3)可靠性差
应用系统可靠性差的原因很多,如内部和外部的干扰、电压纹波系数过大、器件负载过重等均会造成系统的可靠性差。
另外,走线和布置的不合理也会造成系统可靠性差。
(4)电源故障
电源故障包括:
电压值不符合设计要求、电源功率不足、负载能力差、纹波太重等。
(5)硬件调试方法
脱机调试是在加电前,先用万用表等工具,按图纸仔细核对线路是否正确,并对元器件的安装、型号、规格等进行仔细检查,特别焊接时有无走线之间相互短路等。
5.2软件调试
程序在KEILC51上调试,采用模块程序设计技术,则逐个模块调好后再进行系统程序总调。
对于模块结构程序.要一个个子程序分别调试。
调试时,一定要符合入口条件和出口条件,调试可用单步运行和断点运行方式,通过检查用者系统的CPU现场情况、RAM的内容和I/O口的状态,检测程序执行结果是否符合设计要求,有无循环错误、有无机器码错误以及转移地址的错误,同时,还可以发现系统中存在的硬件设计错误和软件算法错误。
各程序模块通过后,则可以把相关功能块连在一起进行总调。
这个阶段若有故障,可以考虑各子程序运行时是否破坏了现场,缓冲单元、工作寄存器是否发生冲突,标志位的建立和清除是否有误,堆栈区是否有溢出,输入设备的状态是否正常等等,若用者系统是在开发机的监控程序下运行时,还要考虑用者缓冲单元是否和监控程序的工作单元发生冲突。
单步和断点调试后,还应进行连续调试,用以确定定时精度、CPU的实时响应等问题。
当全部调试和修改完成后,将程序固化到STR89C54RD+中。
进行整机调试,各功能实现则调试完成。
第五章结论
5.1总结
本系统的功能主要有这几部分组成,通过定时器0来实现数码管的倒计时,通过单片机P2口都数码管位进行扫描,通过定时器1对按键进行扫描,看按键是否按下,通过p3.2对蜂鸣器控制,本系统有6个按键,一个复位按键,五个控制按键,依次功能是:
加暂停移位开始减。
开始倒计时后,出复位键其他键都无效,当按下复位键后,实现系统复位,将再次倒计时功能。
5.2系统展望
由于本系统的局限性,我觉还有完善的可能,可以在系统中增加一个数字按键盘,通过按键盘对定时器初值设置,还可以增加一个红外线遥控控制,对于定时器来说,我觉得还可以改成双模式,一种是定时,一种是电子表功能,随着人们对定时器功能的智能化越来越高,将来会有更大的发展空间的。
5.3心得体会
两周的单片机课程设计终于顺利完成了,其中包含着快乐,也有辛酸。
我们选的设计题目是“多功能定时器”,我都觉得这个题目是比较简单的。
其实不然,做了之后,发现设计电路虽然简单,但我们认为它真正困难的地方是程序设计,不过在我的努力下最终完成了。
我们刚选该题目时,真的是一头雾水,硬件电路不知如何下手,更何谈解决程序那块,因为我们所学的都是单片机方面的理论知识,应用到实践中去还比较少。
不过,我也没偷下懒,迅速去查阅和收集资料。
我去了图书馆借一些参考书,上网找一些相关资料,并且请教指导老师。
通过不断努力,终于把定时器思路和模型定了下来并开始去焊接硬件电路,剩下的去整理和修改程序。
通过一番整理和修改后,在电脑上进行仿真,仿真成功后准备焊接电路板。
在焊接电路板中,我们首先对硬件电路进行布局,然后确认无误后,在电路板上进行焊接,这个过程我们觉得是做得比较快的,以至于后面出现了虚焊的错误。
焊接电路板完工,细心检查后,进行通电测试。
结果发现连PCD图时有些线没连,通过加上跳线,最终实现了功能。
在完成单片机课程设计后,我们发现我们还有许多不足,所学到的知识还远远不够,以至于还有一些功能不能被动完成。
但通过学习这一次实践,增强了我们的动手能力,提高和巩固了单片机方面的知识,特别是软件方面。
从中增强了我们的团队合作精神,并让我们认识到把理论应用到实践中去是多么重要。
附录一:
系统软件代码:
#include
#define uchar unsigned char
#define uint unsigned int
uchar min =1;
uchar sec =21;
uint k_delay = 0;
uchar key;
uint mid = 0;
uchar time[5];
uchar rocket=0;
uchar buff[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xff};
sbit bell=P3^2;
void K_scan(void);
void Time_0Init();
void TimeView();
void Time_1Init();
void DealKey(void);
void Delay();
void main()
{
bell=1;
Time_0Init();
Time_1Init();
while
(1)
{
TimeView();
DealKey();
if(sec==0&&min==0)
{
TR0=0;
bell=0;
}
}
}
void Time_0Init()
{
TMOD=0x22;
TH0=6;
TL0=6;
ET0=1;
EA=1;
TR0=0;
}
void Time_1Init()
{
TH1=0x00;
TL1=0x00;
ET1=1;
TR1=1;
}
void TimeView()
{
uchar scan;
time[0]=sec%10;
time[1]=sec/10;
time[4]=buff[10];
time[2]=min%10;
time[3]=min/10;
for(scan=0;scan<5;scan++)
{
P2=(0x08>>scan);
P0=buff[time[scan]];
Delay();
}
}
Time0() interrupt 1
{
mid++;
if(mid>3686)
{
mid=0;
sec--;
if(sec==-1)
{
sec=59;
min--;
if(min==-1)
min=59;
}
}
}
Time1() interrupt 3
{
k_delay++;
if(k_delay>600)
{
k_delay=0;
K_scan();
}
}
void Delay()
{
uint i=0;
for(i=0;i<500;i++)
;
}
void K_scan(void)
{
uchar i;
if(P1==0xff)
{
return;
}
for(i=0;i<5;i++)
{
if((P1|(0x10>>i))==0xff)
{
key=i+1;
return;
}
}
}
void DealKey(void)
{
if(key ==0)
return;
switch(key)
{
case 1:
key=0;
if(rocket<2){
if(sec<=0){
sec=0;
return;
}
sec--;
}
else{
if(min<=0){
min=0;
return;
}
min--;
}
return;
case 2:
key=0;
if(rocket==0)
rocket=0;
rocket--;
return;
case 3:
key=0;
TR0=1;
TR1=1;
return;
case 4:
key=0;
TR0=0;
//min=3;
//sec=30;
//if(rocket==4)
//rocket=4;
//rocket++;
return;
case 5:
key=0;
if(rocket<2){
sec++;
if(sec>59)
sec=59;
}
else{
min++;
if(min>59)
min=59;
}
return;
}
}