📄 h23.c
字号:
#include <reg51.h>
#define LEDLen 6
#define LowTemp (-99) // A/D 0
#define HighTemp 99 // A/D 255
xdata unsigned char OUTBIT _at_ 0x9002;
xdata unsigned char OUTSEG _at_ 0x9004; // 段控制口
xdata unsigned char IN _at_ 0x9001;
xdata unsigned char ADPort _at_ 0x8000;
signed char CurTemp;
unsigned char LEDBuf[LEDLen];
code unsigned char LEDMAP[] = {
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
};
void Delay(unsigned char CNT)
{
unsigned char i;
do{
i = 100;
do{
}while(--i);
}while (--CNT);
}
void DisplayLED()
{
unsigned char i;
unsigned char Pos;
unsigned char LED;
// 初始位置为右边
Pos = 0x20;
for (i = 0; i < LEDLen; i++) {
// 关闭所显示位
OUTBIT = 0;
// 取出显示数据
LED = LEDBuf[i];
OUTSEG = LED;
// 输出位选通信号,选择一位LED点亮
OUTBIT = Pos;
// 延时
Delay(2);
// 移位,选择下一位LED准备点亮
Pos >>= 1;
}
OUTBIT = 0;
}
void DisplayResult()
{
signed char T;
T = CurTemp;
if (T < 0) {
//如果温度低于零度,显示'-'号
LEDBuf[0] = 0x40;
T = - T;
} else LEDBuf[0] = 0;
//显示温度十位数
LEDBuf[1] = LEDMAP[T / 10];
//显示温度个位数
LEDBuf[2] = LEDMAP[T % 10];
LEDBuf[3] = 0;
}
unsigned char ReadAD()
{
unsigned int i;
// 启动A/D变换
ADPort = 0;
//延时100us,
for (i=0; i<20; i++);
//得到A/D采样值
return (0xff - ADPort);
}
void ReadTemp()
{
unsigned char i;
signed int Temp;
Temp = 0;
//采样16次,取平均数
for (i=0; i<16; i++) {
Temp += ReadAD();
};
//AD采样值转换为实际温度
CurTemp = (Temp >> 4) * (HighTemp-LowTemp) / 256 + LowTemp;
}
void main()
{
unsigned char dtimer;
while (1) {
for(dtimer=15; dtimer>0; dtimer--){
// 当前温度和设定温度送显示缓冲
DisplayResult();
// 显示当前温度和设定温度
DisplayLED();
};
// 读入当前温度
ReadTemp();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -