51单片机数码管显示19。并且按下K3后LED灯半秒闪烁,用定时器T0实现方式2
时间: 2024-02-17 12:01:39 浏览: 24
下面是基于定时器T0的方式2实现51单片机数码管显示19,并且按下K3后LED灯半秒闪烁的代码:
```c
#include <reg52.h>
// 数码管位选和段选控制端口定义
sbit DIGIT1 = P2^0;
sbit DIGIT2 = P2^1;
sbit SEG_A = P1^0;
sbit SEG_B = P1^1;
sbit SEG_C = P1^2;
sbit SEG_D = P1^3;
sbit SEG_E = P1^4;
sbit SEG_F = P1^5;
sbit SEG_G = P1^6;
sbit SEG_DP = P1^7;
// LED灯控制端口定义
sbit LED = P3^5;
// 定时器T0重载值
#define T0_LOAD_VALUE 50000
// 数码管显示的数据和位选控制
unsigned char digit_code[2] = {0xC0, 0xF9}; // 显示1和9的编码
unsigned char digit_select[2] = {0x01, 0x02}; // 数码管位选控制
// 定时器T0中断服务函数
void timer0_isr() interrupt 1 {
static unsigned int cnt = 0;
TH0 = (65536 - T0_LOAD_VALUE) / 256; // 重新设置定时器T0初值
TL0 = (65536 - T0_LOAD_VALUE) % 256;
cnt++;
if (cnt >= 500) { // 每500次中断周期闪烁一次LED
cnt = 0;
LED = ~LED;
}
}
// 数码管显示函数
void display(unsigned char digit, unsigned char num) {
P1 = digit_code[num];
switch (digit) {
case 1: DIGIT1 = 0; DIGIT2 = 1; break;
case 2: DIGIT1 = 1; DIGIT2 = 0; break;
default: DIGIT1 = 1; DIGIT2 = 1; break;
}
}
// 主函数
void main() {
TMOD = 0x01; // 定时器T0工作在模式1
TH0 = (65536 - T0_LOAD_VALUE) / 256; // 设置定时器T0初值
TL0 = (65536 - T0_LOAD_VALUE) % 256;
ET0 = 1; // 允许定时器T0中断
EA = 1; // 开启总中断
TR0 = 1; // 启动定时器T0
while (1) {
display(1, 1); // 显示1
display(2, 9); // 显示9
}
}
```
在上面的代码中,定时器T0的中断周期为50ms,通过计数器实现了按下K3后LED灯半秒闪烁的效果。数码管的显示采用了共阴数码管,通过位选和段选实现了显示数字1和9的效果。