倒计时器课程设计详解

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

河南机电高等专科学校课程设计报告书
课程名称:单片机原理及系统设计
课题名称:倒计时器课程设计
专业:计算机控制技术
班级:
学号:
姓名:
成绩:
2013 年12 月30 日
目录
1.设计目的 (1)
2. 设计准备 (1)
3.设计要求和设计指标 (1)
4.设计内容 (2)
4.1硬件部分 (2)
4.1.1硬件部分工作原理 (2)
4.1.2设计原理 (4)
4.1.3 PCB图及PCB库 (8)
4.2软件部分 (11)
4.2.1程序流程图 (12)
5.本设计改进建议 (12)
6.总结(感想和心得等) (13)
7.主要参考文献 (13)
附录 (13)
1)掌握利用keil uv4进行软件的编程及编译。

2)加深对单片机原理及系统设计课程的理解。

3)掌握倒计时的设计原理和方法。

4)加深用Protel 99SE进行原理图的绘制、原理图库创建、PCB的生成及PCB库的创建的操作方式。

2﹑设计准备
1)单片机STC89C52RC、数码管、74HC573锁存器、按键及其他元件。

2)软件keil uv4和Protel99 SE。

3、设计要求和设计指标
1)设计要求
①设计一个倒计时电路,并具有显示功能。

②设置外部操作键,能对倒计时器进行修改、启动、停止和清零。

③当计时器递减为零时,实现声光报警(蜂鸣器鸣叫,LED灯闪烁),当重新计时时,报警关闭。

④利用六位数码管的动态显示,来显示倒计时时间(时、分、秒),中间利用小数点隔开。

⑤当利用外部功能键设置时间时,利用三个LED灯来区分修改的是小时、分钟还是秒。

2)设计指标
①具有基本的倒计时功能。

②具有暂停、清零和报警的功能
③可以任意设置时间。

④开始时显示为六个零。

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、设计原理
sbit key1=P3^4 用于启动倒计时和停止倒计时。

sbit key1=P3^5 切换功能键(当第一次按下时切换到sec,此时D6灯亮。

当第二次按下时切换到min,此时D7灯亮。

当第三次按下时切换到
hour,此时D8灯亮)。

sbit key1=P3^6设定数值(当D6灯亮时sec++,当D7灯亮时min++,当D8
灯亮时hour++。

)。

sbit key1=P3^7清零。

六位数码管:前两位显示小时,中间两位显示分,最后两位显示秒。

中间用小数点隔开。

图1-3六位数码管原理图
图1-4 STC89C52RC单片机原理图
图1-5复位电路及时钟原理图
图1-6锁存器原理图
图1-7 led灯连接原理图
图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.3 PCB图与PCB库
Protel 99SE是ProklTechnology公司基于Windows环境下开发的电路板设计软件。

该软件功能强大,人机界面友好,易学易用,是大中专院校电学专业必学课程,同时也
是业界人士首选的电路板设计工具。

Protel 99SE由两大部分组成:电路原理图设计(Advanced Schematic)和多层印刷电路板设计(Advanced PCB)。

其中Advanced Schematic由两部分组成:电路图编辑器(Schematic)和元件库编辑器(Schematic Library)。

图1-11蜂鸣器封装图(beep)
图1-12按键的封装图(S1)
图1-13 数码管的封装图(SMG)
图1-14 PCB封装图
4.2软件部分
Keil软件介绍:支持8051微控制器体系结构的Keil开发工具,适合每个阶段的开发人员,不管是专业的应用工程师,还是刚学习嵌入式软件开发的学生。

KEIL C51开发工具旨在解决嵌入式软件开发商面临的复杂问题。

当你开始一个新项目,只需简单的从设备数据库选择使用的设备,uVision IDE将设置好所有的编译器、汇编器、链接器和存储器选项。

包含大量的例程,帮助你着手使用最流行的嵌入式8051设备。

Keil μVision调试器准确地模拟8051设备的片上外围设备(IC、CAN、UART、SPI、中断、I/O端口、A/D转换器、D/A转换器和PWM模块)。

模拟帮助你了解硬件配置,避免在安装问题上浪费时间。

此外,使用模拟器你可以在没有目标设备的情况下编写和测试应用程序。

当你准备在目标硬件上测试软件应用时,可以使用MON51、MON390、NONADI、或者FlashMON51目标监视器、ISD51 In-System调试器、ULINK USB-JTAG适配器在目标系统上下载并测试程序代码。

4.2.1程序流程图
图1-12 程序流程图
4、本设计改进建议
①可以设计让其正计时,当计时时间到时报警。

②不用数码管,用1602液晶显示。

③程序中设计时,设置只能加,不能减,可以设计让其可以减。

④利用矩阵键来设计。

5、总结(感想和心得等)
单片机是我们重要的一门课程,因为在生活中有很多地方都运用了单片机方面的知识,例如我们的手表、计算器、充电器等等,都运用到单片机方面的知识。

经过多天的设计,设计基本完成,从中学习了很多知识。

也知道了设计是多么不容易的事情,需要很多知识才能设计出来。

从这几天的设计中,学习到了很多知识,加深了对学到的知识的理解,使对以前学习的知识有了深刻的理解。

而且在设计发现好多知识在课本中没有,还有许多知识记不住,基础知识没掌握好,明白了不能只读书,还要多操作单片机,不断地学习。

6、主要参考文献
[1]《单片机原理及运用》主编董少明中国铁道出版社 2007.11出版
[2]《模拟电子技术》主编杨毅德重庆大学出版社 2004出版
[3]《8051单片机实践与应用》主编吴金戌沈庆阳清华大学出版社 2002出版附录
C语言程序:
#include <REG52.H>(头文件)
#define uchar unsigned char(宏定义)
#define uint unsigned int
sbit dula=P2^6;(声明变量,锁存器U3、锁存器U4、位选端、led灯、蜂鸣器和四个按键)
sbit wela=P2^7;
sbit key1=P3^4;
sbit key2=P3^5;
sbit key3=P3^6;
sbit key4=P3^7;
sbit beep=P2^3;
sbit led=P1^0;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};(定义共阴数码管编码)
uchar sec,min,hour,temp1,num1,num2,temp2;(定义所需使用的变量)
void delay(uint xms)(延时程序)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display(uchar hour,uchar min,uchar sec)(显示程序)
{
uchar s1,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毫秒)
dula=1;
P0=table[h1]+0x80;(+0x80是为了显示小数点)dula=0;
P0=0xff; wela=1;
P0=0xfd ;wela=0;
delay(1);
dula=1;
P0=table[m2];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delay(1);
dula=1;
P0=table[m1]+0x80;
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
delay(1);
dula=1;
P0=table[s2];
dula=0;
P0=0xff;
wela=1;
P0=0xef;
wela=0;
delay(1);
dula=1;
P0=table[s1];
dula=0;
P0=0xff;
wela=1;
P0=0xdf;
wela=0;
delay(1);
}
void keyscan()(按键程序)
{
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;
TR1=0;
beep=1;(关闭报警)
led=1;
temp1=0;
}
}
}
if(key3==0)
{
delay(10);
if(key3==0)
{
switch(temp2)(当temp2=1时功能键切换到秒,temp2=2时切换到分,temp2=3切换到时)
{
case 1:sec++;if(sec==60)sec=0;break;(秒加一)
case 2:min++;if(min==60)min=0;break;(分加一)
case 3:hour++;if(hour==24)hour=0;break;(时加一)
}
while(!key3);(检测按键释放)
}
}
if(key2==0)(功能键)
{
delay(10);
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)(清零键并且能关闭报警)
{
delay(10);
if(key4==0)
{ while(!key4);
hour=0;
min=0;
sec=0;
TR0=0;
TR1=0;
beep=1;(关闭声报警)
led=1;(关闭光报警)
}
}
}
void main()(主函数)
{
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);(显示)
}
}
void T0_time() interrupt 1
{ TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
num1++;
if(num1==20)
{ num1=0;
if(sec==0)
{ if(min==0)
{ if(hour==0)
{
;
}
else hour--;(此时hour不为零)
min=59;
}
else min--;(此时min不为零)
sec=59;
}
else sec--;(此时sec不为零)
if((sec==0)&&(min==0)&&(hour==0))(如果秒为零,分为零,时为零说明倒计时已经完成,开始报警,停止计时)
{ TR1=1;
TR0=0;
}
}
}
void T1_time() interrupt 3
{ TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
num2++;
beep=0;(蜂鸣器鸣叫)
if(num2==10)
{ num2=0;
led=~led;(数码管没0.5s闪烁一次)
keyscan();
}
}。

相关文档
最新文档