51单片机做出电子记分牌的代码且每次按键时蜂鸣器工作松开按键蜂鸣器停止工作的代码
以下是使用51单片机实现电子记分牌,并在按键时蜂鸣器工作,松开按键时蜂鸣器停止工作的代码示例:
#include <reg51.h>
sbit buzzer = P1^0; // 设置蜂鸣器连接的引脚
unsigned char score = 0; // 记分牌初始值为0
// 延时函数
void delay(unsigned int time) {
unsigned int i, j;
for(i = 0; i < time; i++)
for(j = 0; j < 125; j++);
}
// 按键检测函数
unsigned char keyScan() {
unsigned char keyVal = 0xff;
if(P2 != 0xff) { // 检测到按键按下
delay(10); // 延时一段时间,消除按键抖动
if(P2 != 0xff) {
keyVal = P2; // 获取按键值
while(P2 != 0xff); // 等待按键松开
}
}
return keyVal;
}
// 数码管显示函数
void display(unsigned char num) {
unsigned char code tubeTab[] = {
0x3f, // 0
0x06, // 1
0x5b, // 2
0x4f, // 3
0x66, // 4
0x6d, // 5
0x7d, // 6
0x07, // 7
0x7f, // 8
0x6f // 9
};
P0 = tubeTab[num]; // 显示数字
}
void main() {
EA = 1; // 允许中断
EX0 = 1; // 外部中断0使能
IT0 = 1; // 设置外部中断0为下降沿触发
while(1) {
display(score); // 显示当前分数
delay(1000); // 延时1秒
}
}
// 外部中断0中断服务函数
void int0_isr() interrupt 0 {
score++; // 每次按键分数加1
buzzer = 1; // 蜂鸣器工作
}
// 外部中断0中断服务函数
void int0_isr() interrupt 0 {
score++; // 每次按键分数加1
buzzer = 1; // 蜂鸣器工作
}
// 外部中断1中断服务函数
void int1_isr() interrupt 2 {
score--; // 每次按键分数减1
buzzer = 1; // 蜂鸣器工作
}
// 定时器0中断服务函数
void timer0_isr() interrupt 1 using 1 {
TH0 = (65536 - 50000) / 256; // 重新赋初值
TL0 = (65536 - 50000) % 256;
buzzer = !buzzer; // 蜂鸣器状态翻转
}
以上代码实现了一个简单的电子记分牌,使用外部中断0和1分别实现加分和减分功能,同时在按键时蜂鸣器工作,在松开按键时蜂鸣器停止工作。记分牌的当前分数通过数码管进行显示
原文地址: https://www.cveoy.top/t/topic/hQ7z 著作权归作者所有。请勿转载和采集!