基于单片机用四位共阳极数码管显示上限,下限和当个前值的keil程序
时间: 2024-02-23 21:00:42 浏览: 81
STM32+2片74HC595驱动四位共阳极数码管
5星 · 资源好评率100%
以下是基于STC89C52单片机和共阳极数码管的Keil程序示例,用于显示上限、下限和当前值:
```
#include <reg52.h>
#include <intrins.h>
// 数码管显示表,0~9对应的值
unsigned char code num_table[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};
// 定义数码管位选引脚
sbit DIG_1 = P1^0;
sbit DIG_2 = P1^1;
sbit DIG_3 = P1^2;
sbit DIG_4 = P1^3;
// 定义数码管段选引脚
sbit SEG_A = P2^0;
sbit SEG_B = P2^1;
sbit SEG_C = P2^2;
sbit SEG_D = P2^3;
sbit SEG_E = P2^4;
sbit SEG_F = P2^5;
sbit SEG_G = P2^6;
sbit SEG_DP = P2^7;
// 定义上限、下限和当前值
unsigned char upper_limit = 99;
unsigned char lower_limit = 0;
unsigned char current_value = 50;
// 定义蜂鸣器引脚
sbit BEEP = P3^7;
// 数码管显示函数
void display(unsigned char num)
{
unsigned char i;
// 数码管位选和段选的映射表,用于设置相应的引脚状态
unsigned char code seg_map[4] = {0xFE, 0xFD, 0xFB, 0xF7};
// 数码管位选
DIG_1 = 1;
DIG_2 = 1;
DIG_3 = 1;
DIG_4 = 1;
// 数码管段选
for (i = 0; i < 4; i++)
{
P2 = seg_map[i]; // 设置段选引脚状态
P0 = num_table[num % 10]; // 显示个位数
if (i == 1) SEG_DP = 1; // 小数点控制
_nop_(); // 延时
_nop_();
DIG_1 = 0; // 第一位数码管亮
P0 = num_table[num / 10]; // 显示十位数
if (i == 2) SEG_DP = 0; // 小数点控制
_nop_();
_nop_();
DIG_2 = 0; // 第二位数码管亮
P0 = 0x00; // 关闭数码管
SEG_DP = 0;
DIG_3 = 0; // 第三位数码管亮
DIG_4 = 0; // 第四位数码管亮
}
}
// 蜂鸣器报警函数
void beep()
{
unsigned char i;
for (i = 0; i < 50; i++)
{
BEEP = 0; // 发出蜂鸣器声音
_nop_();
_nop_();
BEEP = 1; // 关闭蜂鸣器
_nop_();
_nop_();
}
}
void main()
{
while (1)
{
// 读取当前值
current_value = P0;
// 判断当前值是否超出上限或下限
if (current_value > upper_limit)
{
beep(); // 超出上限,发出蜂鸣器报警
current_value = upper_limit; // 修正当前值为上限
}
else if (current_value < lower_limit)
{
beep(); // 超出下限,发出蜂鸣器报警
current_value = lower_limit; // 修正当前值为下限
}
// 在数码管上显示当前值、上限和下限
display(current_value);
display(upper_limit);
display(lower_limit);
}
}
```
该程序使用P0口读取当前值,通过数码管显示上限、下限和当前值,并在超出范围时发出蜂鸣器报警。具体的数码管位选和段选引脚需要根据具体的电路连接进行修改。同时,需要根据具体的数码管类型和显示要求进行调整。
阅读全文