1.应用MCS-51单片机设计倒计时器电路
2.选用4位LED数码显示;倒计时时间9.99s~99.99s可调,倒计时结束后,点亮一个发光二极管。
原理图绘制和程序编码
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit D1 = P1^0; // 4位LED数码管控制引脚
sbit D2 = P1^1;
sbit D3 = P1^2;
sbit D4 = P1^3;
sbit LED = P1^4; // 发光二极管控制引脚
sbit KEY1 = P3^0; // 按钮1控制引脚
sbit KEY2 = P3^1; // 按钮2控制引脚
uint cnt = 0; // 计数器
uchar sec = 0; // 秒数
uchar ms = 0; // 毫秒数
bit flag = 0; // 倒计时标志位
void delayms(uint xms) // 延时函数,单位为毫秒
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display(uchar num) // 数码管显示函数
{
switch(num)
{
case 0: D1=0;D2=0;D3=0;D4=0;break;
case 1: D1=1;D2=0;D3=0;D4=0;break;
case 2: D1=0;D2=1;D3=0;D4=0;break;
case 3: D1=1;D2=1;D3=0;D4=0;break;
case 4: D1=0;D2=0;D3=1;D4=0;break;
case 5: D1=1;D2=0;D3=1;D4=0;break;
case 6: D1=0;D2=1;D3=1;D4=0;break;
case 7: D1=1;D2=1;D3=1;D4=0;break;
case 8: D1=0;D2=0;D3=0;D4=1;break;
case 9: D1=1;D2=0;D3=0;D4=1;break;
}
}
void main()
{
while(1)
{
if(KEY1 == 0) // 按钮1按下
{
delayms(20); // 延时去抖动
if(KEY1 == 0)
{
flag = 1; // 标志位设为1,开始倒计时
sec = 10; // 初始时间设为10秒
ms = 0;
}
while(!KEY1); // 等待按钮1释放
}
if(KEY2 == 0) // 按钮2按下
{
delayms(20); // 延时去抖动
if(KEY2 == 0)
{
flag = 0; // 标志位设为0,停止倒计时
sec = 0; // 时间清零
ms = 0;
LED = 0; // 发光二极管熄灭
}
while(!KEY2); // 等待按钮2释放
}
if(flag) // 倒计时进行中
{
display(sec/10); // 显示秒的十位数
delayms(5); // 延时5毫秒
display(sec%10); // 显示秒的个位数
delayms(5);
display(ms/10); // 显示毫秒的十位数
delayms(5);
display(ms%10); // 显示毫秒的个位数
delayms(5);
ms--; // 每隔5毫秒毫秒数减1
if(ms == 255) // 毫秒数减到0时,秒数减1
{
ms = 99;
sec--;
}
if(sec == 0 && ms == 0) // 倒计时结束
{
flag = 0; // 标志位设为0,停止倒计时
LED = 1; // 发光二极管点亮
}
}
}
}
以下是51单片机倒计时器电路的原理图和程序编码。
#include <reg52.h> //头文件
sbit D1 = P0^0; //定义LED数码管引脚
sbit D2 = P0^1;
sbit D3 = P0^2;
sbit D4 = P0^3;
sbit beep = P2^3; //定义蜂鸣器引脚
void delay(unsigned int i); //函数声明
void main() //主函数
{
unsigned char a,b,c,d; //定义计数器,a、b、c、d分别为万位、千位、百位、十位
unsigned int time; //定义倒计时时间
unsigned char i,j,k,l; //定义计数器
while(1)
{
P1 = 0xfe; //设置P1口输出低电平,用于扫描LED数码管的第一个位置
for(i=0;i<100;i++) //100ms延时
{
for(j=0;j<10;j++) //10ms延时
{
for(k=0;k<10;k++) //1ms延时
{
for(l=0;l<10;l++) //100us延时
{
if((time > 0) && (time <= 9999)) //判断时间是否在合法范围内
{
a = time / 1000; //计算万位
b = time % 1000 / 100; //计算千位
c = time % 100 / 10; //计算百位
d = time % 10; //计算十位
P0 = 0x00; //清零LED数码管
if(a != 0) //判断万位是否为0
{
D1 = 1; //点亮对应的LED数码管
P0 = 0x3f;
delay(2);
}
D1 = 0; //关闭LED数码管
if((b != 0) || (a != 0)) //判断千位和万位是否为0
{
D2 = 1;
P0 = 0x06;
delay(2);
}
D2 = 0;
if((c != 0) || (b != 0) || (a != 0)) //判断百位、千位和万位是否为0
{
D3 = 1;
P0 = 0x5b;
delay(2);
}
D3 = 0;
D4 = 1;
P0 = 0x4f;
delay(2);
D4 = 0;
delay(1); //延时1ms
time--; //倒计时时间减1
}
}
}
}
}
beep = 1; //蜂鸣器响一声
if(time == 0) //倒计时结束,点亮一个发光二极管
{
P2 = 0x01;
}
}
}
void delay(unsigned int i) //延时函数
{
unsigned int j,k;
for(j=0;j<i;j++)
{
for(k=0;k<121;k++);
}
}
该程序的主要思路如下:
初始化计数器和倒计时时间,并设置LED数码管和蜂鸣器的引脚。
在 while 循环中执行以下操作:
a. 设置 P1 口输出低电平,用于扫描 LED 数码管的第一个位置。
b. 分别循环延时100ms、10ms、1ms和100us。
c. 判断倒计时时间是否在合法范围内,如果是,计算出万位、千位、百位和十位的值