倒计时器课程设计详解文档格式.docx
《倒计时器课程设计详解文档格式.docx》由会员分享,可在线阅读,更多相关《倒计时器课程设计详解文档格式.docx(21页珍藏版)》请在冰豆网上搜索。
1、设计目的
1)掌握利用keiluv4进行软件的编程及编译。
2)加深对单片机原理及系统设计课程的理解。
3)掌握倒计时的设计原理和方法。
4)加深用Protel99SE进行原理图的绘制、原理图库创建、PCB的生成及PCB库的创建的操作方式。
2﹑设计准备
1)单片机STC89C52RC、数码管、74HC573锁存器、按键及其他元件。
2)软件keiluv4和Protel99SE。
3、设计要求和设计指标
1)设计要求
①设计一个倒计时电路,并具有显示功能。
②设置外部操作键,能对倒计时器进行修改、启动、停止和清零。
③当计时器递减为零时,实现声光报警(蜂鸣器鸣叫,LED灯闪烁),当重新计时时,报警关闭。
④利用六位数码管的动态显示,来显示倒计时时间(时、分、秒),中间利用小数点隔开。
⑤当利用外部功能键设置时间时,利用三个LED灯来区分修改的是小时、分钟还是秒。
2)设计指标
①具有基本的倒计时功能。
②具有暂停、清零和报警的功能
③可以任意设置时间。
④开始时显示为六个零。
4、设计内容
4.1硬件部分
4.11硬件部分工作原理
1)显示部分
利用六位七段数码管的动态显示,用来显示倒计时间和设置时间。
数码管采用共阴极接法,当阳极接入高电平时,数码管显示,位选送入低电平时,数码管被选中可以参与显示(位选),再送入段选数值。
段选采用共阴极接法,送入高电平可显示数值,如图1-3。
利用D8、D7、D6三个数码管用于显示功能键。
2)按键部分
利用51单片机P3端口独立键盘,即P3^4﹑P3^5、P3^6、P3^7(如图1-8)。
按键检测流程如图1-2所示,程序中用延时10ms的方式进行消抖。
按键S1为复位按键。
3)定时器部分
用定时器T0和定时器T1,软启动、工作方式1。
运用时首先打开全局中断、定时器1中断和定时器0中断才能运行。
装入初值时,因为晶振频率为11.0592MHZ(如图1-5),所以一个机器周期为1.09us,计算65536个数字小于1s,所以应装初值为:
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
运行20次就1s。
4)报警部分
当倒计时减为零时,用P1端口P1^0LED灯1s闪烁,蜂鸣器发声报警。
LED灯为共阳极接口,当送入低电平时发光,蜂鸣器图1-1,与单片机相连如图1-9.
图1-2按键检测流程图
图1-1蜂鸣器原理图
4.1.2、设计原理
sbitkey1=P3^4用于启动倒计时和停止倒计时。
sbitkey1=P3^5切换功能键(当第一次按下时切换到sec,此时D6灯亮。
当第二次按下时切换到min,此时D7灯亮。
当第三次按下时切换到hour,此时D8灯亮)。
sbitkey1=P3^6设定数值(当D6灯亮时sec++,当D7灯亮时min++,当D8灯亮时hour++。
)。
sbitkey1=P3^7清零。
六位数码管:
前两位显示小时,中间两位显示分,最后两位显示秒。
中间用小数点隔开。
图1-3六位数码管原理图
图1-4STC89C52RC单片机原理图
图1-5复位电路及时钟原理图
图1-6锁存器原理图
图1-7led灯连接原理图
图1-8按键连接原理图
图1-9蜂鸣器连接原理图
图1-10原理图
原理图介绍:
STC89C52RC单片机采用DIP40封装,电阻采用AXIAL0.4封装,led灯采用DIODE0.4封装,数码管采用SMG封装(如图1-13),蜂鸣器采用beep封装(如图1-11),按键采用S1封装(如图1-12),电容采用RAD0.1封装,极性电容采用RB.2/.4封装,晶振采用XTAL1封装,三极管采用TO-92B封装。
(PCB库如图1-11所示)
4.1.3PCB图与PCB库
Protel99SE是ProklTechnology公司基于Windows环境下开发的电路板设计软件。
该软件功能强大,人机界面友好,易学易用,是大中专院校电学专业必学课程,同时也是业界人士首选的电路板设计工具。
Protel99SE由两大部分组成:
电路原理图设计(AdvancedSchematic)和多层印刷电路板设计(AdvancedPCB)。
其中AdvancedSchematic由两部分组成:
电路图编辑器(Schematic)和元件库编辑器(SchematicLibrary)。
图1-11蜂鸣器封装图(beep)
图1-12按键的封装图(S1)
图1-13数码管的封装图(SMG)
图1-14PCB封装图
4.2软件部分
Keil软件介绍:
支持8051微控制器体系结构的Keil开发工具,适合每个阶段的开发人员,不管是专业的应用工程师,还是刚学习嵌入式软件开发的学生。
KEILC51开发工具旨在解决嵌入式软件开发商面临的复杂问题。
当你开始一个新项目,只需简单的从设备数据库选择使用的设备,uVisionIDE将设置好所有的编译器、汇编器、链接器和存储器选项。
包含大量的例程,帮助你着手使用最流行的嵌入式8051设备。
KeilμVision调试器准确地模拟8051设备的片上外围设备(IC、CAN、UART、SPI、中断、I/O端口、A/D转换器、D/A转换器和PWM模块)。
模拟帮助你了解硬件配置,避免在安装问题上浪费时间。
此外,使用模拟器你可以在没有目标设备的情况下编写和测试应用程序。
当你准备在目标硬件上测试软件应用时,可以使用MON51、MON390、NONADI、或者FlashMON51目标监视器、ISD51In-System调试器、ULINKUSB-JTAG适配器在目标系统上下载并测试程序代码。
4.2.1程序流程图
图1-12程序流程图
4、本设计改进建议
①可以设计让其正计时,当计时时间到时报警。
②不用数码管,用1602液晶显示。
③程序中设计时,设置只能加,不能减,可以设计让其可以减。
④利用矩阵键来设计。
5、总结(感想和心得等)
单片机是我们重要的一门课程,因为在生活中有很多地方都运用了单片机方面的知识,例如我们的手表、计算器、充电器等等,都运用到单片机方面的知识。
经过多天的设计,设计基本完成,从中学习了很多知识。
也知道了设计是多么不容易的事情,需要很多知识才能设计出来。
从这几天的设计中,学习到了很多知识,加深了对学到的知识的理解,使对以前学习的知识有了深刻的理解。
而且在设计发现好多知识在课本中没有,还有许多知识记不住,基础知识没掌握好,明白了不能只读书,还要多操作单片机,不断地学习。
6、主要参考文献
[1]《单片机原理及运用》主编董少明中国铁道出版社2007.11出版
[2]《模拟电子技术》主编杨毅德重庆大学出版社2004出版
[3]《8051单片机实践与应用》主编吴金戌沈庆阳清华大学出版社2002出版
附录
C语言程序:
#include<
REG52.H>
(头文件)
#defineucharunsignedchar(宏定义)
#defineuintunsignedint
sbitdula=P2^6;
(声明变量,锁存器U3、锁存器U4、位选端、led灯、蜂鸣器和四个按键)
sbitwela=P2^7;
sbitkey1=P3^4;
sbitkey2=P3^5;
sbitkey3=P3^6;
sbitkey4=P3^7;
sbitbeep=P2^3;
sbitled=P1^0;
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
(定义共阴数码管编码)
ucharsec,min,hour,temp1,num1,num2,temp2;
(定义所需使用的变量)
voiddelay(uintxms)(延时程序)
{
uinti,j;
for(i=xms;
i>
0;
i--)
for(j=110;
j>
j--);
}
voiddisplay(ucharhour,ucharmin,ucharsec)(显示程序)
uchars1,s2,m1,m2,h1,h2;
s2=sec/10;
(分开秒的十位和各位)
s1=sec%10;
m2=min/10;
(分开分的十位和各位)
m1=min%10;
h2=hour/10;
(分开时的十位和各位)
h1=hour%10;
dula=1;
(打开U4锁存端)
P0=table[h2];
(送入段选信号)
dula=0;
(关闭U4锁存端)
P0=0xff;
(消影)
wela=1;
(打开U3锁存端)
P0=0xfe;
(送入位选信号)
wela=0;
(关闭U3锁存端)
delay
(1);
(延时1毫秒)
P0=table[h1]+0x80;
(+0x80是为了显示小数点)
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay
(1);
dula=1;
P0=table[m2];
P0=0xfb;
wela=0;
P0=table[m1]+0x80;
dula=0;
P0=0xf7;
P0=table[s2];
P0=0xef;
P0=table[s1];
P0=0xdf;
voidkeyscan()(按键程序)
if(key1==0)
{
delay(10);
(延时消抖)
if(key1==0)
while(!
key1);
(检测按键释放)
temp1++;
(key1键每按一次temp1加一次)
if(temp1==1)
{TR0=1;
(启动定时器T0)
TR1=0;
(关闭定时器T1)
if(temp1==2)
{TR0=0;
beep=1;
(关闭报警)
led=1;
temp1=0;
}
}
if(key3==0)
{
switch(temp2)(当temp2=1时功能键切换到秒,temp2=2时切换到分,temp2=3切换到时)
case1:
sec++;
if(sec==60)sec=0;
break;
(秒加一)
case2:
min++;
if(min==60)min=0;
(分加一)
case3:
hour++;
if(hour==24)hour=0;
(时加一)
key3);
(检测按键释放)
if(key2==0)(功能键)
if(key2==0)
{while(!
key2);
temp2++;
(功能键每按一次temp2加一次,如图1-7当temp2=1时,D4灯亮,表示切换到秒。
当temp2=2时,D3灯亮,表示切换到秒分。
当temp2=3时,D4灯亮,表示切换到时。
)
if(temp2==1)
{P1=0xdf;
if(temp2==2)
{P1=0xbf;
if(temp2==3)
{P1=0x7f;
if(temp2==4)
{temp2=0;
P1=0xff;
(关闭所有的灯)
if(key4==0)(清零键并且能关闭报警)
{
if(key4==0)
key4);
hour=0;
min=0;
sec=0;
TR0=0;
(关闭声报警)
led=1;
(关闭光报警)
}
voidmain()(主函数)
TMOD=0x11;
(设置定时器T0、T1为工作方式1,软启动00010001)
TH0=(65536-45872)/256;
(装初值为50ms)
TL0=(65536-45872)%256;
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
EA=1;
(开总中断)
ET0=1;
(开T0定时器中断)
ET1=1;
(开T1定时器中断)
hour=0;
(设定开始倒计时初值)
min=0;
sec=60;
while
(1)(大循环)
{keyscan();
(检测按键程序)
display(hour,min,sec);
(显示)
}
voidT0_time()interrupt1
{TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
num1++;
if(num1==20)
{num1=0;
if(sec==0)
{if(min==0)
{if(hour==0)
;
elsehour--;
(此时hour不为零)
min=59;
elsemin--;
(此时min不为零)
sec=59;
elsesec--;
(此时sec不为零)
if((sec==0)&
&
(min==0)&
(hour==0))(如果秒为零,分为零,时为零说明倒计时已经完成,开始报警,停止计时)
{TR1=1;
}
voidT1_time()interrupt3
{TH1=(65536-45872)/256;
num2++;
beep=0;
(蜂鸣器鸣叫)
if(num2==10)
{num2=0;
led=~led;
(数码管没0.5s闪烁一次)
keyscan();