51单片机数码管显示,倒计时10分钟,定义一个按键,按下时间可以传输到电脑上,写一个代码
时间: 2024-02-22 21:55:16 浏览: 81
好的,下面是一个完整的代码实现,仅供参考:
```C
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit key = P1^0; // 定义按键引脚
sbit LSA = P2^2; // 数码管位选引脚LSA
sbit LSB = P2^3;
sbit LSC = P2^4;
uchar num_code[] = { // 数码管段码表
0x3f, 0x06, 0x5b, 0x4f, 0x66,
0x6d, 0x7d, 0x07, 0x7f, 0x6f
};
uchar timer_value = 600; // 定义计时器初值,10分钟
uchar key_value = 0; // 定义按键按下的时间,单位为10ms
void delay(uint x) // 延时函数,单位为0.1ms
{
uint i, j;
for(i=x; i>0; i--)
{
for(j=110; j>0; j--);
}
}
void display(uchar num) // 数码管显示函数
{
LSA = 0; LSB = 0; LSC = 0; // 全部清零
P0 = num_code[num/1000]; // 输出千位数码管
LSA = 1; LSB = 0; LSC = 0; delay(1);
P0 = num_code[num%1000/100]; // 输出百位数码管
LSA = 0; LSB = 1; LSC = 0; delay(1);
P0 = num_code[num%100/10]; // 输出十位数码管
LSA = 0; LSB = 0; LSC = 1; delay(1);
P0 = num_code[num%10]; // 输出个位数码管
LSA = 0; LSB = 0; LSC = 0; delay(1);
}
void timer_init() // 定时器初始化函数
{
TMOD |= 0x01; // 设置定时器0为模式1
TH0 = 0xFC; // 设置定时器初值,1ms中断一次
TL0 = 0x67;
ET0 = 1; // 允许定时器0中断
TR0 = 1; // 启动定时器0
EA = 1; // 开启总中断
}
void timer_isr() interrupt 1 // 定时器中断函数
{
TH0 = 0xFC; // 重新设置定时器初值
TL0 = 0x67;
timer_value--; // 计时器每次减1
}
void key_isr() interrupt 0 // 外部中断函数
{
uint count = 0; // 定义计数器
while(!key) // 检测按键是否松开,防止抖动
{
count++; // 计数器每次加1
_nop_(); // 空操作
if(count > 1000) // 如果按键一直按下超过1s,则认为按键有效
{
key_value = count / 10; // 计算按键按下的时间,单位为10ms
break;
}
}
}
void main()
{
timer_init(); // 定时器初始化
IT0 = 1; // 设置外部中断为下降沿触发模式
EX0 = 1; // 允许外部中断0
while(1)
{
display(timer_value); // 将计时器的值显示在数码管上
if(timer_value == 0) // 如果倒计时结束
{
ES = 1; // 开启串口中断
SCON = 0x50; // 设置串口工作模式,8位数据位,无校验位,1位停止位
TMOD = 0x20; // 设置定时器1为模式2
TH1 = 0xFD; // 设置定时器1初值,9600波特率
TL1 = 0xFD;
TR1 = 1; // 启动定时器1
while(!TI); // 等待发送完成
TI = 0; // 清除发送完成标志
break;
}
}
}
void ser() interrupt 4 // 串口中断函数
{
if(RI) // 接收中断
{
RI = 0; // 清除接收标志
}
if(TI) // 发送中断
{
TI = 0; // 清除发送标志
SBUF = key_value; // 将按键按下的时间发送出去
ES = 0; // 关闭串口中断
TR1 = 0; // 关闭定时器1
}
}
```
需要注意的是,在代码中使用了外部中断0(INT0)和串口通信模块(UART),同时还需要在电路中添加数码管、按键、串口通信模块等外围电路,具体实现还需要根据实际情况进行调整和优化。
阅读全文