使用51单片机设计两个按键控制数码管显示0-9,当K1按下复位清零且继续计时,当K2按下,暂停计时或从暂停状态恢复计时,KEY2必须采用外部中断方式,定时器均采用T1定时器掉方式1
时间: 2024-03-09 22:45:47 浏览: 70
C51单片机开发led流水灯,pwm,电机综合控制,独立按键,计时器,数码管,8位
5星 · 资源好评率100%
下面是使用51单片机设计两个按键控制数码管显示0-9的程序,满足题目中的要求:
```c
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit DIO = P1^0;
sbit CLK = P1^1;
sbit STB = P1^2;
sbit KEY1 = P3^2;
sbit KEY2 = P3^3;
uchar code digit[10] = {
0xC0, 0xF9, 0xA4, 0xB0, 0x99,
0x92, 0x82, 0xF8, 0x80, 0x90
};
uint count = 0; // 计时器计数值
bit pause = 0; // 计时器暂停标志
void delay(uint x) {
uint i, j;
for(i = x; i > 0; i--)
for(j = 110; j > 0; j--);
}
void writeData(uchar dat) {
uchar i;
for(i = 0; i < 8; i++) {
DIO = dat & 0x01;
CLK = 0;
dat >>= 1;
CLK = 1;
}
}
void sendCommand(uchar cmd) {
uchar i;
STB = 0;
for(i = 0; i < 8; i++) {
DIO = cmd & 0x01;
CLK = 0;
cmd >>= 1;
CLK = 1;
}
STB = 1;
}
void initInterrupt() {
EA = 1; // 开总中断
ET1 = 1; // 开T1中断
EX1 = 1; // 开外部中断1
IT1 = 1; // 设置外部中断1为下降沿触发
}
void initTimer1() {
TMOD |= 0x10; // 设置T1为工作方式1
TH1 = 0xFC; // 设置T1初值
TL1 = 0x18;
TR1 = 1; // 启动T1
}
void pauseTimer1() {
TR1 = 0; // 关闭T1
pause = 1; // 设置计时器暂停标志
}
void startTimer1() {
TR1 = 1; // 启动T1
pause = 0; // 清除计时器暂停标志
}
void main() {
uchar i, j;
initInterrupt();
initTimer1();
while(1) {
if(KEY1 == 0) { // K1按下
count = 0;
startTimer1();
while(KEY1 == 0); // 等待K1释放
}
if(KEY2 == 0) { // K2按下
if(!pause)
pauseTimer1();
else
startTimer1();
while(KEY2 == 0); // 等待K2释放
}
sendCommand(0x01);
sendCommand(0x40);
j = count % 10; // 取个位数
writeData(digit[j]);
delay(500);
}
}
void timer1_isr() interrupt 3 {
TH1 = 0xFC; // 重新设置T1初值
TL1 = 0x18;
count++; // 计数器加1
}
void external1_isr() interrupt 2 {
if(!pause)
pauseTimer1();
else
startTimer1();
}
```
程序中使用了P3口的两个引脚分别连接K1和K2按键,P3.2引脚还用作了外部中断1的输入口。按键控制部分通过检测按键状态来执行不同的操作,而计时部分则利用T1定时器的中断来实现计时功能。外部中断1用于捕捉K2按键的下降沿触发,以实现计时器的暂停和继续。具体实现过程中,需要根据所使用的数码管型号和接口电路来调整代码。
阅读全文