基于51单片机写出4位共阳极数码管使用地址为p3.2的按钮调节其3个模式,即当前值,上限和下限,并在当前值超出上下限制是地址为p1.7的蜂鸣器报警的keil程序
时间: 2024-02-25 12:57:05 浏览: 56
基于51单片机的报警器(模拟量,上下限,数码管)原理图、流程图、物料清单、仿真图、源代码
好的,下面是基于 51 单片机的代码实现:
```c
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;
sbit beep = P1^7;
uchar code smgduan[] = { // 数码管显示 0~9
0x3f, // 0
0x06, // 1
0x5b, // 2
0x4f, // 3
0x66, // 4
0x6d, // 5
0x7d, // 6
0x07, // 7
0x7f, // 8
0x6f // 9
};
uchar mode = 0; // 当前模式,0 表示当前值,1 表示上限,2 表示下限
uint current_value = 0; // 当前值
uint upper_limit = 9999; // 上限值
uint lower_limit = 0; // 下限值
void delay(uint t) { // 延时函数
uint i, j;
for (i = t; i > 0; i--) {
for (j = 110; j > 0; j--);
}
}
void display(uchar num) { // 数码管显示函数
switch(num) {
case 0: LSA = 0; LSB = 0; LSC = 0; P0 = smgduan[0]; break;
case 1: LSA = 1; LSB = 0; LSC = 0; P0 = smgduan[1]; break;
case 2: LSA = 0; LSB = 1; LSC = 0; P0 = smgduan[2]; break;
case 3: LSA = 1; LSB = 1; LSC = 0; P0 = smgduan[3]; break;
case 4: LSA = 0; LSB = 0; LSC = 1; P0 = smgduan[4]; break;
case 5: LSA = 1; LSB = 0; LSC = 1; P0 = smgduan[5]; break;
case 6: LSA = 0; LSB = 1; LSC = 1; P0 = smgduan[6]; break;
case 7: LSA = 1; LSB = 1; LSC = 1; P0 = smgduan[7]; break;
case 8: LSA = 0; LSB = 0; LSC = 0; P0 = smgduan[8]; break;
case 9: LSA = 1; LSB = 0; LSC = 0; P0 = smgduan[9]; break;
default: break;
}
}
void display_num(uint num) { // 显示数字函数
uchar i, j, k, m;
i = num / 1000; // 千位
j = num % 1000 / 100; // 百位
k = num % 100 / 10; // 十位
m = num % 10; // 个位
display(i); // 显示千位
delay(5); // 延时
P0 = 0x00; // 关闭数码管显示
display(j); // 显示百位
delay(5);
P0 = 0x00;
display(k); // 显示十位
delay(5);
P0 = 0x00;
display(m); // 显示个位
delay(5);
P0 = 0x00;
}
void main() {
IT0 = 1; // 外部中断0下降沿触发
EX0 = 1; // 打开外部中断0
EA = 1; // 打开总中断
while(1) {
switch(mode) { // 根据当前模式显示不同的值
case 0: display_num(current_value); break;
case 1: display_num(upper_limit); break;
case 2: display_num(lower_limit); break;
default: break;
}
if (current_value > upper_limit || current_value < lower_limit) { // 如果当前值超出上下限,打开蜂鸣器
beep = 1;
} else {
beep = 0;
}
}
}
void button_interrupt() interrupt 0 { // 外部中断0中断函数
delay(10); // 延时去抖
if (mode == 2) { // 如果当前模式为下限,按一次按钮后回到当前值模式
mode = 0;
} else {
mode++; // 切换模式
}
}
```
这段代码实现了题目要求的三个功能:
1. 显示当前值、上限和下限:通过数码管显示函数 `display_num` 实现,根据当前模式显示不同的值。
2. 调节模式:使用外部中断0检测地址为p3.2的按钮状态的改变,根据当前模式切换显示的值。
3. 报警:如果当前值超出上下限,打开地址为p1.7的蜂鸣器。
注意,由于数码管的刷新频率较高,需要在 `display_num` 函数中加入一定的延时,否则数码管显示可能会出现闪烁现象。此外,为了防止按钮抖动,需要在中断函数中加入一定的延时去抖。
阅读全文