用NY8B062D单片机写一个NTC温度显示计的程序
时间: 2023-06-11 20:09:22 浏览: 81
以下是一个基于NY8B062D单片机的NTC温度显示计的程序示例:
```c
#include <NY8B062D.h>
#define ADC_DELAY 300 // AD转换延时
#define DISPLAY_DELAY 100 // 数码管刷新延时
unsigned char AD_value; // 存储AD转换结果
unsigned char display[4]; // 存储数码管显示内容
// 数码管段选码
const unsigned char seg_code[] = {
0x3F, // 0
0x06, // 1
0x5B, // 2
0x4F, // 3
0x66, // 4
0x6D, // 5
0x7D, // 6
0x07, // 7
0x7F, // 8
0x6F // 9
};
// NTC电阻-温度表
const unsigned int temp_table[] = {
1000, // -40℃
1280,
1570,
1870,
2180,
2500,
2840,
3190,
3560,
3940,
4330,
4730,
5140,
5560,
5990,
6430, // 125℃
};
// AD转换
unsigned char ADC_convert() {
unsigned char i, value = 0;
ANSEL = 0x10; // P1.4设置为模拟输入
ADCON0 = 0x9C; // ADC使能,通道选择为P1.4
for (i = 0; i < 3; i++) {
ADCON0 |= 0x04; // 启动AD转换
while ((ADCON0 & 0x02) == 0); // 等待转换完成
ADCON0 &= ~0x02; // 清除转换完成标志
value += ADRESL; // 读取低8位结果
__delay_us(ADC_DELAY); // 延时
}
ANSEL = 0x00; // P1.4设置为数字输入
return value / 3; // 取平均值
}
// 温度转换
unsigned char temp_convert(unsigned char AD_value) {
unsigned char i;
for (i = 0; i < sizeof(temp_table) / sizeof(temp_table[0]); i++) {
if (AD_value > temp_table[i]) {
return i - 40; // 返回温度值
}
}
return 125; // 超出范围,返回125℃
}
// 数码管显示
void display_show(unsigned char *data) {
unsigned char i;
for (i = 0; i < 4; i++) {
P1 = (P1 & 0xF0) | (i + 1); // 选择位选
P0 = seg_code[data[i] % 10]; // 显示个位
__delay_ms(DISPLAY_DELAY); // 延时
P0 = seg_code[data[i] / 10]; // 显示十位
__delay_ms(DISPLAY_DELAY); // 延时
}
}
void main() {
unsigned char i;
// IO口初始化
P0 = 0x00;
P1 = 0x00;
P3 = 0x00;
// 主循环
while (1) {
AD_value = ADC_convert(); // AD转换
display[0] = temp_convert(AD_value) / 10; // 十位
display[1] = temp_convert(AD_value) % 10; // 个位
display[2] = 0x0C; // 小数点
display[3] = 0x0A; // 温度符号
if (temp_convert(AD_value) < 0) {
display[3] = 0x0B; // 负号
}
display_show(display); // 数码管显示
}
}
```
该程序通过AD转换获取NTC电阻的值,并根据预先定义的NTC电阻-温度表进行温度转换,最后将温度值显示在4位数码管上。程序中使用了数码管段选码和延时函数,需要根据具体硬件平台进行修改。