本文共 2763 字,大约阅读时间需要 9 分钟。
单片机倒计时器是基于定时而设计的实现及时报警的装置。它由键盘扫描、动态LED显示电路、报警三大部分构成,以实现对计时时间的控制。同时装置还用一个由电平控制的报警装置,用以实现倒计时时间到时进行声音提示。
倒计时器的实时性强,可操作性好,能应对不同要求进行过相应的调整以适应不同环境,倒计时器使用范围非常广泛,不难忘记奥运倒计时,场面让人震撼。
以proters仿真工程为例,建立一个倒计时工程,主要器件需要用到AT89C51单片机芯片,采用两个数码管显示,数码管采用共阴极,一个倒计时开启按钮,按钮按下低电平有效,一个扬声器,扬声器在工作时发出声音,PR1上拉排阻,一般可以根据亮度强弱调节电阻大小。
程序设计可以分为几部的工作,1,定时器timer()初始化和开启;2,数码管显示驱动模块;3,倒计时器功能设计。4,按键检测和扬声器工作。用定时器主要就是可以做到更精确倒计时,数码管扫描显示也不好抖动,然而刷新显示数码管的周期也要选择一个合理的时间范围,一般不能大于50ms,不然人眼是可以看出来。
#include
#include
typedef unsigned char uint08;
typedef unsigned short int uint16;
typedef unsigned long int uint32;
#define INIT_TIME_VAR 10000 // 10 ms
#define BIT(a) (1<
sbit BezzerIO = P1^6;
//共阴 数码管段码
char code LedDisplayCode1[] =
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//共阳 数码管段码
char code LedDisplayCode2[] =
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
// 数码管显示 缓存
uint08 AppRefreshDisplayBuf[2];
// 数码管显示 开启显示标志
uint08 AppRefreshDisplayflag=0;
uint16 time10msCount;
/*
void delay_ms(uint16 ms)
{
uint16 i,j;
for(i=0;i
{
for(j=0;j<255;j++)
{
_nop_();
}
}
}
*/
// 定时器初始化
void TimerInit()
{
TMOD = 0X01; // 设置工作模式1
TH0 = (65536 - INIT_TIME_VAR)/256;//(65536-X)设定初值10ms,X=10000
TL0 = (65536 - INIT_TIME_VAR)%256; //(65536-X)设定初值10ms,X=10000
EA = 1; // 允许全部中断
ET0 = 1; // 允许定时器中断
TR0 = 1; // 开启定时
}
static uint08 BitFlag=0;
// 刷新显示数码管
void refreshDisplay(void)
{
uint08 code refreshDisplayCode[2]={0x01,0x02};
static uint08 refreshDisplayPt; // 刷新位地址
static uint08 refreshDisplayBuf[2]; // 刷新位段码
if(AppRefreshDisplayflag)
{
refreshDisplayBuf[0] = AppRefreshDisplayBuf[0];
refreshDisplayBuf[1] = AppRefreshDisplayBuf[1];
AppRefreshDisplayflag = 0;
}
refreshDisplayPt ++;
if(refreshDisplayPt>1) refreshDisplayPt=0;
P0 = 0x00; // 关闭上次的数码
P2 = 0x03; // 关闭上次的数码
_nop_();
_nop_();
P2 = refreshDisplayCode[refreshDisplayPt]; // 第一个数码管点亮
P0 = LedDisplayCode1[refreshDisplayBuf[refreshDisplayPt]];
}
void main()
{
uint08 CountDown;
// 定时器初始化
TimerInit();
// 初始化端口
P0 = 0x00;
P2 = 0x00;
P1 = 0x80;
CountDown = 0;
while(1)
{
if(!(P1 & BIT(7)))
{
CountDown = 15;
// 倒计时器 开始运行
AppRefreshDisplayBuf[0] = CountDown%10;
AppRefreshDisplayBuf[1] = CountDown/10%10;
AppRefreshDisplayflag = 1;
time10msCount = 0;
BezzerIO = 0; // 扬声器关闭
}
if( CountDown )
{
if(time10msCount>100) // 1 S
{
time10msCount = 0;
CountDown--;
if( CountDown == 0)
{
BezzerIO = 1; // 扬声器开启
}
// 倒计时器 开始运行
AppRefreshDisplayBuf[0] = CountDown%10;
AppRefreshDisplayBuf[1] = CountDown/10%10;
AppRefreshDisplayflag = 1;
}
}
}
}
void timer1() interrupt 1 //定时2ms
{
TH0 = (65536 - INIT_TIME_VAR)/256;//(65536-X)设定初值10ms,X=10000
TL0 = (65536 - INIT_TIME_VAR)%256; //(65536-X)设定初值10ms,X=10000
refreshDisplay(); // 刷新数码管
time10msCount++;
}
转载地址:http://etowx.baihongyu.com/