基于51单片机,5个按键设置四位共阳数码管电压报警上下限,可以通过一个按键控制上下限切换,两个按键控制数值的增减,两个按键控制数码管左右位移动的keil程序
时间: 2024-02-26 20:56:29 浏览: 72
51单片机按键控制数码管程序
5星 · 资源好评率100%
以下是基于51单片机的程序:
```c
#include <reg51.h>
sbit S1 = P1^0; // 按键1
sbit S2 = P1^1; // 按键2
sbit S3 = P1^2; // 按键3
sbit S4 = P1^3; // 按键4
sbit S5 = P1^4; // 按键5
sbit D1 = P2^0; // 数码管第一位
sbit D2 = P2^1; // 数码管第二位
sbit D3 = P2^2; // 数码管第三位
sbit D4 = P2^3; // 数码管第四位
unsigned char code DIGITS[] = { // 数码管显示0~9
0xC0, 0xF9, 0xA4, 0xB0, 0x99,
0x92, 0x82, 0xF8, 0x80, 0x90
};
unsigned char code LIMIT[] = { // 上下限值
30, 40, 50, 60, 70, 80, 90, 100, 110, 120
};
unsigned char upper_limit = 80; // 默认上限
unsigned char lower_limit = 60; // 默认下限
unsigned char digit[4] = {0, 0, 0, 0}; // 数码管显示的数值
unsigned char digit_index = 0; // 数码管当前显示的位数
void delay(unsigned int ms) { // 延时函数
unsigned int i, j;
for (i = 0; i < ms; i++) {
for (j = 0; j < 125; j++);
}
}
void display(unsigned char num) { // 显示数字
D1 = 1;
P0 = DIGITS[num % 10];
D1 = 0;
D2 = 1;
P0 = DIGITS[num / 10 % 10];
D2 = 0;
D3 = 1;
P0 = DIGITS[num / 100 % 10];
D3 = 0;
D4 = 1;
P0 = DIGITS[num / 1000 % 10];
D4 = 0;
}
void update_digit() { // 更新数码管显示
if (digit_index == 0) {
display(digit[0] + 10 * digit[1]);
} else if (digit_index == 1) {
display(digit[2] + 10 * digit[3]);
} else if (digit_index == 2) {
display(upper_limit);
} else if (digit_index == 3) {
display(lower_limit);
}
}
void main() {
unsigned char i;
while (1) {
if (S1 == 0) { // 切换上下限
digit_index++;
if (digit_index > 3) {
digit_index = 0;
}
delay(20);
} else if (S2 == 0) { // 数值增加
digit[digit_index]++;
if (digit[digit_index] > 9) {
digit[digit_index] = 0;
}
update_digit();
delay(20);
} else if (S3 == 0) { // 数值减少
if (digit[digit_index] == 0) {
digit[digit_index] = 9;
} else {
digit[digit_index]--;
}
update_digit();
delay(20);
} else if (S4 == 0) { // 数码管左移
digit_index--;
if (digit_index > 3) {
digit_index = 0;
}
update_digit();
delay(20);
} else if (S5 == 0) { // 数码管右移
digit_index++;
if (digit_index > 3) {
digit_index = 0;
}
update_digit();
delay(20);
}
// 检查上下限是否合法
if (upper_limit <= lower_limit) {
upper_limit = lower_limit + 10;
}
for (i = 0; i < 10; i++) {
if (upper_limit == LIMIT[i]) {
break;
}
}
if (i == 10) {
upper_limit = 80;
}
for (i = 0; i < 10; i++) {
if (lower_limit == LIMIT[i]) {
break;
}
}
if (i == 10) {
lower_limit = 60;
}
// 检测是否超出上下限
if (digit[0] * 10 + digit[1] < lower_limit ||
digit[2] * 10 + digit[3] > upper_limit) {
P3 = 0xFF; // 报警
} else {
P3 = 0x00; // 取消报警
}
}
}
```
程序功能:
- 按键1切换上下限和数值的显示;
- 按键2和按键3分别增加和减少当前显示的数值;
- 按键4和按键5分别左移和右移数码管的显示位置;
- 数值范围可以通过LIMIT数组自行设置;
- 当数值超出上下限时,P3口输出全高电平,触发报警。
阅读全文