金沙滩51单片机60秒数码管倒计时
时间: 2023-07-02 13:08:16 浏览: 638
实现该功能需要以下步骤:
1. 接线:将数码管的阳极接到单片机的P0口,将8个阴极接到P1~P8口。
2. 初始化:设置P0口为输出,P1~P8口为输入,同时设置定时器1的计时器初值为65536-12000,即每1ms中断一次。
3. 倒计时:在定时器1中断函数中,每1ms更新计时器计数值,同时判断是否到达1秒,如果到达1秒,则将秒数减1,并更新数码管显示。
4. 显示:将秒数转换为BCD码,分别存储在P1~P4口中,然后依次输出到数码管。
以下是代码实现:
```
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula = P2^6;
sbit wela = P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
};
uint count = 60000; // 倒计时60秒
void delay_ms(uint xms) // 延时函数
{
uint i,j;
for(i = xms;i > 0;i--)
for(j = 110;j > 0;j--);
}
void display(uchar num) // 显示函数
{
P1 = table[num/1000];
P2 = 0xfe;
delay_ms(1);
P2 = 0xff;
P1 = table[num%1000/100];
P2 = 0xfd;
delay_ms(1);
P2 = 0xff;
P1 = table[num%100/10];
P2 = 0xfb;
delay_ms(1);
P2 = 0xff;
P1 = table[num%10];
P2 = 0xf7;
delay_ms(1);
P2 = 0xff;
}
void timer1() interrupt 3 // 定时器1中断函数
{
TH1 = (65536-12000)/256;
TL1 = (65536-12000)%256;
count--;
if(count == 0) // 到达1秒,减1秒
{
count = 60000;
display(count/1000); // 显示秒数
}
}
void main()
{
TMOD = 0x10; // 定时器1工作在方式1
TH1 = (65536-12000)/256;
TL1 = (65536-12000)%256;
ET1 = 1; // 打开定时器1中断
EA = 1; // 打开总中断
TR1 = 1; // 启动定时器1
P0 = 0x00;
P1 = 0x00;
P2 = 0xff;
P3 = 0xff;
P4 = 0xff;
while(1)
{
dula = 1;
P0 = 0x00;
dula = 0;
wela = 1;
P0 = 0x7f;
wela = 0;
}
}
```
需要注意的是,这里使用了定时器1中断来实现每1秒减1秒的倒计时,同时更新数码管显示。数码管的显示函数中,使用了延时函数来控制显示时间。
阅读全文