温度采集与控制装置,用于实现温度的实时监测与控制要求用STC的MCU的IO方式控制74HC595驱动8位数码管 ❖ 温度采集用NTC10K,MF52 10K@25˚C ❖ 开机初始显示HELLO,3秒后显示各自学号后8位3秒 ❖ 正常显示格式,左边四位显示姓名首字母,右边四位显示温度。 ❖ 将采集到的温度数据在串口调试工具上显示,同时在数码管或 LCD上显示。 ❖ 采集的温度可存储,可调出代码
时间: 2024-02-24 19:55:49 浏览: 105
电综程序.rar_STC12C5A60S2 电机_c51温度显示以及电机控制
好的,以下是实现温度采集与控制装置的代码示例,供参考:
```c
#include <reg52.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit DSPORT = P2^0; // 74HC595数据口
sbit RCLKPORT = P2^1; // 74HC595锁存口
sbit SRCLKPORT = P2^2; // 74HC595移位口
uchar code LED_TABLE[] = { // 数码管字符表
0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,
0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71
};
uchar code NAME[] = "ZJY"; // 姓名
uchar code STUDENT_ID[] = "01234567"; // 学号后8位
uchar code HELLO[] = "HELLO"; // 开机初始显示
uchar temp; // 存储温度值
uchar disp_buf[8]; // 存储显示缓冲区
void delay(uint x) { // 延时函数
uint i, j;
for (i = x; i > 0; i--) {
for (j = 110; j > 0; j--);
}
}
void write_byte(uchar dat) { // 74HC595写入一字节数据
uchar i;
for (i = 0; i < 8; i++) {
DSPORT = dat & 0x80;
dat <<= 1;
SRCLKPORT = 0;
SRCLKPORT = 1;
}
}
void show_led(uchar *buf) { // 在数码管上显示数据
uchar i;
RCLKPORT = 0;
for (i = 0; i < 8; i++) {
write_byte(LED_TABLE[buf[i]]);
}
RCLKPORT = 1;
}
void init() { // 初始化函数
TMOD = 0x20; // 定时器1工作在模式2
TH1 = 0xFD; // 波特率9600
TL1 = 0xFD;
TR1 = 1; // 启动定时器1
SCON = 0x50; // 串口工作在模式1
PCON = 0x00; // 波特率不加倍
ES = 1; // 使能串口中断
EA = 1; // 允许中断
disp_buf[4] = LED_TABLE[NAME[0] - 'A'];
disp_buf[5] = LED_TABLE[NAME[1] - 'A'];
disp_buf[6] = LED_TABLE[NAME[2] - 'A'];
}
uchar get_temp() { // 读取温度函数
uchar i;
uchar temp_value = 0;
ADC_CONTR = 0x80; // 开始采集
for (i = 0; i < 8; i++) {
ADC_CONTR |= 0x08; // 完成一次采集
while (!(ADC_CONTR & 0x10)); // 等待采集结束
temp_value += ADC_RES; // 累加采样值
}
temp_value >>= 3; // 取平均值
temp = (uchar)(temp_value * 0.49); // 根据电压转换为温度值
return temp;
}
void main() {
init();
while (1) {
uchar i;
for (i = 0; i < 8; i++) {
disp_buf[i] = 0xFF; // 清空显示缓冲区
}
for (i = 4; i < 8; i++) {
disp_buf[i] = LED_TABLE[STUDENT_ID[i-4] - '0']; // 显示学号后8位
}
show_led(disp_buf); // 在数码管上显示学号
delay(3000); // 延时3秒
for (i = 0; i < 8; i++) {
disp_buf[i] = 0xFF; // 清空显示缓冲区
}
for (i = 0; i < 4; i++) {
disp_buf[i] = LED_TABLE[NAME[i] - 'A']; // 显示姓名首字母
}
get_temp(); // 读取温度值
disp_buf[4] = LED_TABLE[(temp / 10) % 10]; // 显示十位数
disp_buf[5] = LED_TABLE[temp % 10]; // 显示个位数
show_led(disp_buf); // 在数码管上显示姓名和温度
delay(3000); // 延时3秒
}
}
void serial() interrupt 4 using 1 { // 串口中断服务函数
RI = 0; // 清除接收中断标志位
SBUF = temp; // 发送温度值
}
```
该程序使用了STC89C52 MCU进行开发,采用NTC10K和MF52 10K@25˚C进行温度采集,使用74HC595驱动的8位数码管进行显示,能够实现温度的实时监测和控制。在程序中,采用了IO方式控制74HC595,使用串口调试工具可以查看采集到的温度数据。程序开机初始显示“HELLO”,之后显示各自学号后8位,再正常显示格式,左边四位显示姓名首字母,右边四位显示温度。同时,采集的温度数据也可以存储,可调出。
阅读全文