可编倒计时装置.docx

上传人:b****6 文档编号:8159723 上传时间:2023-01-29 格式:DOCX 页数:20 大小:252.17KB
下载 相关 举报
可编倒计时装置.docx_第1页
第1页 / 共20页
可编倒计时装置.docx_第2页
第2页 / 共20页
可编倒计时装置.docx_第3页
第3页 / 共20页
可编倒计时装置.docx_第4页
第4页 / 共20页
可编倒计时装置.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

可编倒计时装置.docx

《可编倒计时装置.docx》由会员分享,可在线阅读,更多相关《可编倒计时装置.docx(20页珍藏版)》请在冰豆网上搜索。

可编倒计时装置.docx

可编倒计时装置

目录

1.MCS-51单片机简介及设计原理1

1.1MCS-51单片机简介1

1.2设计原理3

2.系统硬件线路设计图4

2.1CPU介绍4

2.2LED数码管模块和显示原理4

2.3振荡电路模块和原理6

2.4复位电路模块和原理7

2.5独立按键电路和原理8

2.6矩阵按键电路和原理8

2.7蜂鸣器电路和原理9

2.8上拉电阻的使用9

3.程序框图11

4.单片机资源分配表12

5.源程序13

6.性能分析18

7.总结与心得20

8.参考文献21

 

1.MCS-51单片机简介及设计原理

1.1MCS-51单片机简介

单片机它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。

作为嵌入式系统控制核心的单片机具有其体积小、功能全、性价比高等诸多优点。

51系列单片机是国内目前应用最广泛的单片机之一,随着嵌入式系统、片上系统等概念的提出和普遍接受及应用,51系列单片机的发展又进入了一个新的阶段。

在今后很长一段时间内51系列单片机仍将占据嵌入式系统产品的中低端市场。

C语言是本设计的程序设计语言,它比低级语言更通俗易懂,设计更为方便,故采用它来设计程序。

单片机全称为单片微型计算机(SingleChipMicrocomputer)。

因为单片机主要用于控制系统中,所以又称微控制器(MicrocontrollerUnit,MCU)或嵌入式控制器(EmbeddedController)。

它具有嵌入式应用系统所要求的体系结构,微处理器,指令系统,总线方式,管理模式等。

他把计算机的基本部件都微型化集成到一块芯片上了,通常片内部都含有中央处理部件(CPU),数据存储器(RAM),程序存储器(ROM,EPROM,FlashROM),定时器/计数器和各种输入/输出(I/O)接口他们之间的相互连接结构如图1-1所示。

图1-1-1单片机结构

8051是MCS-51系列单片机的典型产品,我们以这一代表性的机型进行系统的讲解。

8051单片机包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线,现在我们分别加以说明:

·中央处理器:

中央处理器(CPU)是整个单片机的核心部件,是8位数据宽度的处理器,能处理8位二进制数据或代码,CPU负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入输出功能等操作。

·数据存储器(RAM)

8051内部有128个8位用户数据存储单元和128个专用寄存器单元,它们是统一编址的,专用寄存器只能用于存放控制指令数据,用户只能访问,而不能用于存放用户数据,所以,用户能使用的RAM只有128个,可存放读写的数据,运算的中间结果或用户定义的字型表。

·程序存储器(ROM):

8051共有4096个8位掩膜ROM,用于存放用户程序,原始数据或表格。

·定时/计数器(ROM):

8051有两个16位的可编程定时/计数器,以实现定时或计数产生中断用于控制程序转向。

·并行输入输出(I/O)口:

8051共有4组8位I/O口(P0、P1、P2或P3),用于对外部数据的传输。

·全双工串行口:

8051内置一个全双工串行通信口,用于与其它设备间的串行数据传送,该串行口既可以用作异步通信收发器,也可以当同步移位器使用。

·中断系统:

8051具备较完善的中断功能,有两个外中断、两个定时/计数器中断和一个串行中断,可满足不同的控制要求,并具有2级的优先级别选择。

·时钟电路:

8051内置最高频率达12MHz的时钟电路,用于产生整个单片机运行的脉冲时序,但8051单片机需外置振荡电容。

单片机的结构有两种类型,一种是程序存储器和数据存储器分开的形式,即哈佛(Harvard)结构,另一种是采用通用计算机广泛使用的程序存储器与数据存储器合二为一的结构,即普林斯顿(Princeton)结构。

INTEL的MCS-51系列单片机采用的是哈佛结构的形式,而后续产品16位的MCS-96系列单片机则采用普林斯顿结构。

1.2设计原理

本课设使用AT89C52加上少许的外围电路就可做成一个可预置秒分的倒计时装置,并在计时结束时发出报警声音。

本文旨在从硬件和软件上具体分析其设计方法。

系统由主单片机和外围电路构成,其功能框图如图:

系统整体硬件电路包括,电源部分、显示部分、按键调整部分以及单片机主板部分。

 

图1-2-1秒分倒计时器单片机结构

整个设计包括振荡电路、复位电路、按键控制电路、矩阵键盘扫描电路、LED显示电路、扬声器输出电路等。

其中振荡电路,复位电路是和芯片AT89C52一起构成一个最小系统,按键控制电路通过P3口来控制置数和启动倒计时,矩阵键盘扫描电路通过和P1口连接来进行循环按键扫描,LED显示电路则是用P0口的数选和P2口低四位的位选来实现数字显示,而扬声器是跟P3.6口对接得到周期的报警信号从而发出规律的报警声。

2.系统硬件线路设计图

2.1CPU介绍

由单片机AT89C52,,12M晶振,1nF和10uF电容,1k电阻和按键等组成。

图2-1-1CPU组成电路图

2.2LED数码管模块和显示原理

LED显示器又称为数码管,LED显示器由8个发光二极管组成。

中7个长条形的发光管排列成“日”字形,另一个贺点形的发光管在显示器的右下角作为显示小数点用,它能显示各种数字及部份英文字母。

LED显示器有两种不同的形式:

一种是8个发光二极管的阳极都连在一起的,称之为共阳极LED显示器;另一种是8个发光二极管的阴极都连在一起的,称之为共阴极LED显示器

下图为典型的数码管:

图2-2-18段LED数码管

数码管的分类:

数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。

共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。

共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。

当某一字段的阴极为高电平时,相应字段就不亮。

共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。

共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。

当某一字段的阳极为低电平时,相应字段就不亮。

数码管的驱动方式:

数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,因此根据数码管的驱动方式的不同,可以分为静态式和动态式两类。

①静态显示驱动:

静态驱动也称直流驱动。

静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。

静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动,要知道一个89C521单片机可用的I/O端口才32个呢:

),实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。

②动态显示驱动:

数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。

通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。

在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。

本次电路设计采用的是共阴极数码管,通过动态扫描方式驱动,其电路模块如下:

图2-2-28段LED数码管显示电路

2.3振荡电路模块和原理

本次设计要使用到AT89C52单片机的时钟振荡功能。

AT89C52中有一个用于构成内部振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是该放大器的输入和输出端。

这个放大器与作为反馈元件的片外石英晶体或者陶瓷谐振器一起构成自激振荡器。

振荡电路如下图所示:

图2-3-1时钟振荡电路

如图所示,外接石英晶体或者陶瓷谐振器以及电容C1,C2接在放大器的反馈电路中构成并联谐振电路。

谐振器本身对外接电容C1、C2虽然没有十分严格的要求,但电容容量的大小会轻微影响振荡频率的高低、振荡器工作的稳定性、起振的难易程度以及温度的稳定性,如果使用石英晶体,推荐使用30pF,而使用陶瓷谐振器建议选择40pF。

本次设计使用的是石英晶体谐振器,因此采用1nF的电容,频率大小采用12MHZ与6MHZ均可,这里采用的是12MHZ晶振。

2.4复位电路模块和原理

复位电路虽然简单,但其作用非常重要。

一个单片机系统能复正常运行,首先要检查是否能复位成功,其中手动复位开关比较常用。

图2-4-1手动开关复位电路

VCC上电时,C充电,在1K电阻上出现电压,使得单片机复位;几个毫秒后,C充满,1K电阻上电流降为0,电压也为0,使得单片机进入工作状态。

工作期间,按下Reset,C放电。

Reset松手,C又充电,在1K电阻上出现电压,使得单片机复位。

几个毫秒后,单片机进入工作状态。

2.5独立按键电路和原理

采用一一对应式方式输入设计键盘控制电路部分,其键盘结构图如下所示:

图2-5-1独立按键电路

独立按键与P3口P3.2与P3.3连接,其中P3.2口按键的作用是开始置数,每按一次,置一位数,而与P3.3口连接的按键则是起启动倒计时的作用,同时需要注意的是,P3.2口的按键一旦按下必须置数,否则按下P3.3口按键无效。

2.6矩阵按键电路和原理

图2-6-1矩阵按键电路

矩阵键盘扫描电路与P1口的8个端口相连进行键盘扫描,而此次设计中使用的是3*4矩阵键盘的按列扫描,通过不断循环给P1.4,P1.5,P1.6口置零,观察P1.0,P1.1,P1.2,P1.3口是否有低电平,来判断是否有按键被按下,从而通过列端口和行端口得出是哪个按键被按下。

2.7蜂鸣器电路和原理

蜂鸣器部分采用IO口输出,单片机P1端口驱动蜂鸣器。

蜂鸣器有两类3大品种。

一类是压电式,一类是电磁式,电磁式又有两大品种,铁振膜式和动圈式,二者原理一样只是结构不同。

所有蜂鸣器都有两种类型:

纯蜂鸣器和带驱动的蜂鸣器,蜂鸣器都是用音频信号驱动的,都是交流驱动。

报警器的种类很多,比如:

扬声器,蜂鸣器等,本次设计采用的是电磁式蜂鸣器作为报警器。

电磁式蜂鸣器由振荡器、电磁线圈、磁铁、震动膜片以及外壳等组成。

接通电源后,振荡器产生的音频信号通过电磁线圈,使得电磁线圈产生了一个磁场。

振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。

蜂鸣器电路图如图所示:

图2-7-1喇叭报警电路

2.8上拉电阻的使用

考虑在什么时候使用上拉电阻呢?

总结如下:

(1)当TTL电路驱动CMOS电路时,如果TTL电路输出的高电平低于CMOS电路的最低高电平(一般为3.5V),这时就需要在TTL的输出端接上拉电阻,以提高输出高电平的值。

(2)OC门电路必须加上拉电阻,以提高输出的高电平值。

(3)为加大输出引脚的驱动能力,有的单片机管脚上也常使用上拉电阻。

(4)在CMOS芯片上,为了防止静电造成损坏,不用的管脚不能悬空,一般接上拉电阻降低输入阻抗,提供泄荷通路。

(5)芯片的管脚加上拉电阻来提高输出电平,从而提高芯片输入信号的噪声容限,增强抗干扰能力。

(6)提高总线的抗电磁干扰能力。

管脚悬空就比较容易接受外界的电磁干扰。

(7)长线传输中电阻不匹配容易引起反射波干扰,加上拉电阻使电阻匹配,有效的抑制反射波干扰。

另外,上拉电阻阻值的选择原则包括:

(1)从节约功耗及芯片的灌电流能力考虑应当足够大;电阻大,电流小。

(2)从确保足够的驱动电流考虑应当足够小;电阻小,电流大。

(3)对于高速电路,过大的上拉电阻可能边沿变平缓。

综合考虑以上三点,上拉电阻阻值通常在1k到10k之间选取。

根据以上原则,本设计所选择的是10K的电阻。

图2-8-1上拉电阻电路

3.程序框图

4.单片机资源分配表

编程之前,应先将可用资源和需要资源列举出来,一一分配后就能清楚的了解整个设计结构,不易出错。

AT89C52单片机IO口有P0、P1、P2、P3,中断源有外部中断0、1两个,定时器中断0、1两个,一个串口中断。

外围电路为1个4位数码管,8个上拉电阻,1个蜂鸣器,1个LED,14个轻触式按键。

现分配如下:

4位数码管的数据端连接在一起,然后接入AT89C52P0端口,其8个共阴极引脚接入P2口作为选通。

将2个按键接到P3上,使用P3.2和P3.3端口;蜂鸣器也接到P3口上,使用P3.6端口,矩阵键盘则接入P1口的8个端口。

为了计时1秒以及动态扫描数码管,使用一个定时器0作为时钟。

 

P0

数码管数据端

P1

矩阵键盘扫描

P2

低四位为数码管的位选端

P3

P3.2和P3.3为独立按键,P3.6为喇叭选通端

表4-1单片机资源使用分配

5.源程序

#include

#defineucharunsignedchar

#defineuintunsignedint

ucharcodetable[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

uintmiao;

uintge,shi,bai,qian,i,j;

sbitd1=P3^2;

sbitd2=P3^3;

sbitd4=P3^6;

 

voiddelay(uintz)

{

uintx,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

 

voiddisplay(uintge,uintshi,uintbai,uintqian)

{

P2=0xf1;

P0=table[ge];

delay(10);

P2=0xf2;

P0=table[shi];

delay(10);

P2=0xf4;

P0=table[bai];

delay(10);

P2=0xf8;

P0=table[qian];

delay(10);

}

 

ucharkeyscan()

{

ucharnum,temp;

while

(1)

{

P1=0xef;

temp=P1;

temp=temp&0x0f;

if(temp!

=0x0f)

{

delay(10);//按键去抖动

temp=P1;

temp=temp&0x0f;

if(temp!

=0x0f)

{

temp=P1;

switch(temp)

{

case0xee:

num=1;

break;

case0xed:

num=4;

break;

case0xeb:

num=7;

break;

}

returnnum;

while(temp!

=0x0f)

{

temp=P1;

temp=temp&0x0f;

}

}

}

P1=0xdf;

temp=P1;

temp=temp&0x0f;

if(temp!

=0x0f)

{

delay(10);

temp=P1;

temp=temp&0x0f;

if(temp!

=0x0f)

{

temp=P1;

switch(temp)

{

case0xde:

num=2;

break;

case0xdd:

num=5;

break;

case0xdb:

num=8;

break;

case0xd7:

num=0;

break;

}

returnnum;

while(temp!

=0x0f)

{

temp=P1;

temp=temp&0x0f;

}

}

}

P1=0xbf;

temp=P1;

temp=temp&0x0f;

if(temp!

=0x0f)

{

delay(10);

temp=P1;

temp=temp&0x0f;

if(temp!

=0x0f)

{

temp=P1;

switch(temp)

{

case0xbe:

num=3;

break;

case0xbd:

num=6;

break;

case0xbb:

num=9;

break;

}

returnnum;

while(temp!

=0x0f)

{

temp=P1;

temp=temp&0x0f;

}

}

}display(ge,shi,bai,qian);//不加的话会有显示错误

}

}

 

voidmain()

{

bitd=1;

ucharkey;

uintwei=0x08;

ge=0;shi=0;bai=0;qian=0;

P2=0x0f;

while

(1)

{

display(ge,shi,bai,qian);

if(d1==0)

delay(10);

if(d1==0)

{

key=keyscan();

if(key>=0&&key<=5)

{

if(wei==0x08)wei=0x01;

elsewei=wei<<1;

switch(wei)

{

case0x01:

ge=key;break;

case0x02:

shi=key;break;

case0x04:

bai=key;break;

case0x08:

qian=key;break;

}

}

elseif(key>=6&&key<=9)

{

if(wei==0x08)wei=0x01;

elsewei=wei<<1;

switch(wei)

{

case0x01:

ge=key;break;

case0x02:

shi=5;break;

case0x04:

bai=key;break;

case0x08:

qian=5;break;

}

}

}while(!

d1);

if(d2==0)

delay(10);

if(d2==0)

d=0;

while(d==0)

{

miao=(qian*10+bai)*60+shi*10+ge;

miao--;

for(i=1;i<60;i++)

{display(ge,shi,bai,qian);}

ge=(miao%60)%10;

shi=(miao%60)/10;

bai=(miao/60)%10;

qian=(miao/60)/10;

if(miao==0)

{

display(0,0,0,0);

for(j=0;j<100;j++)

{

d4=0;

display(0,0,0,0);

delay(10);

d4=1;

}

d4=1;

d=1;

}

}

}

}

 

6.性能分析

图6-1程序仿真图1

如图,通过按按键P3.2进行置位,每按一下,置一位数字;再按按键P3.3进行启动倒计时,需要注意的是启动倒计时之前无需对4位都进行置数,但是一旦按了P3.2按键,就必须通过矩阵键盘进行置数,否则按P3.3无法启动倒计时。

图6-2程序仿真图2

由于,此次设计未采用定时器,所以倒计时装置的倒计时部分程序运用的是for循环和delay延时构成的自减函数,所以在计时方面不能准确的确定为一秒,会稍有误差,其次矩阵键盘扫描和LED数码管动态显示都会运用到循环,前者在此次设计中运用的是自循环,无返回值的话就不会跳出循环,而后者采用的是调用的时候必须放在一个循环体中,否则只会显示四位数码管中的一位。

当倒计时到0时,就会启动报警装置,如图,会有一段“滴滴滴滴”的声音提醒我们,倒计时已结束。

此时,可以重新按P3.2进行置数,之后又可以继续按P3.3进行启动倒计时,验证了这段程序重复运行的可能性。

另外,无论在何时,只要按下Reset复位键,都会重置程序,数码管初始化显示0000,可以重新进行置数和启动倒计时。

 

7.总结与心得

通过本次课程设计,我对单片机和C语言的相关知识得到了进一步的,刚开始看到这个题目的时候,感觉倒计时不是很难,有对应的输入,在控制芯片的作用下,进行递减的控制,就可以达到效果。

所以刚开始的时候,做的还不是很认真,当设计进行到具体环节的时候,问题就体现出来了,并不是像刚开始的那样简单。

首先要想到芯片的对应P口的功能,于是要对所学的单片机的知识进行复习,查找相关资料对那些知识进行扩充,于是就大量的查找相关资料和阅读,了解清楚了相应的功能后,开始了设计。

接着就是具体的模块部分的设计。

我把整体模块分为三个部分进行滴,输入部分,即倒计时的预设置模块,用键盘作为输入模块。

显示部分,由于我把设计的功能扩大到了小时,而且秒、分的设计要显示两位,所以需要用到4个七段数码管。

而控制部分则有AT89C52芯片来完成其功能。

再就是进行相对应的仿真设计。

由于再仿真用到的是Proteus软件,所以要对这个软件的应用进行学习。

也是开始查找一些资料书和上网找一些应用方面的技巧,在做了充分的准备后,开始了仿真绘图。

在绘图的过程中,有时候也是弄错了,导致仿真的结果出不来,在同学的帮助下,仔细查找和修改,还是完成了本设计,感觉集体的智慧还是很强大的。

最后就是程序的设计和完成,本次设计既可以用C语言,也可以用汇编来写,于是我就尝试着,用两种语言来写。

刚开始,着手用汇编写的时候,刚开始的功能还可以很顺利的完成,但是到多位数字输入的时候,感觉用汇编来写就有点复杂了,于是换成用C语言来写,这样就轻

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 工学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1