stc15f2串口传输温度和OLED显示温度
时间: 2023-08-05 14:04:24 浏览: 110
好的,下面是基于STC15F2K60S2单片机的串口传输温度和OLED显示温度的代码示例:
```c
#include <STC15F2K60S2.h>
#include <intrins.h>
// 定义串口参数
#define BAUD 9600
#define FOSC 24000000L
// 定义温度传感器引脚和OLED屏幕引脚
#define SENSOR_PIN P3_0
#define OLED_SCL P1_0
#define OLED_SDA P1_1
// 定义温度传感器数据转换参数
#define VCC 5.0
#define ADC_RES 1024.0
#define TEMP_RES 10.0
// 定义OLED显示屏参数
#define OLED_ADDR 0x78
#define OLED_WIDTH 128
#define OLED_HEIGHT 32
// 定义温度变量和串口接收缓存
float temperature = 0.0;
unsigned char rec_buf;
// 初始化串口
void init_uart()
{
TMOD |= 0x20;
SCON = 0x50;
TH1 = TL1 = -(FOSC/12/32/BAUD);
TR1 = 1;
ES = 1;
EA = 1;
}
// 串口接收中断
void uart_isr() interrupt 4
{
if (RI) {
rec_buf = SBUF;
RI = 0;
}
}
// 初始化ADC
void init_adc()
{
P1ASF = 0x01; // 将P1.0设置为ADC输入
ADC_RES = 0; // 清零ADC结果寄存器
ADC_CONTR = 0x88; // 启动ADC,选择ADC输入通道和ADC时钟分频
}
// 读取温度传感器数据
float read_temperature()
{
unsigned int ad_value = 0;
float voltage = 0.0;
ADC_RES = 0;
ADC_CONTR |= 0x08; // 开始ADC转换
_nop_(); // 等待ADC转换完成
_nop_();
_nop_();
_nop_();
ad_value = ADC_RES;
voltage = ad_value * VCC / ADC_RES;
temperature = voltage / TEMP_RES;
return temperature;
}
// 初始化OLED显示屏
void init_oled()
{
i2c_start();
i2c_send_byte(OLED_ADDR);
i2c_send_byte(0x00);
i2c_send_byte(0xAE); // 关闭OLED屏幕
i2c_send_byte(0x20);
i2c_send_byte(0x00);
i2c_send_byte(0x21);
i2c_send_byte(0x00);
i2c_send_byte(0x7F);
i2c_send_byte(0x22);
i2c_send_byte(0x00);
i2c_send_byte(0x03);
i2c_send_byte(0xAF); // 打开OLED屏幕
i2c_stop();
}
// 在OLED显示屏上显示温度数据
void show_temperature(float temp)
{
char temp_str[10] = {0};
sprintf(temp_str, "%.1fC", temp);
i2c_start();
i2c_send_byte(OLED_ADDR);
i2c_send_byte(0x00);
i2c_send_byte(0x40);
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 64; j++) {
i2c_send_byte(0x00);
}
}
i2c_stop();
i2c_start();
i2c_send_byte(OLED_ADDR);
i2c_send_byte(0x00);
i2c_send_byte(0x40);
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 32; j++) {
int idx = i * 32 + j;
if (idx < strlen(temp_str)) {
i2c_send_byte(font8x16[temp_str[idx] - ' '][2*j]);
i2c_send_byte(font8x16[temp_str[idx] - ' '][2*j+1]);
} else {
i2c_send_byte(0x00);
i2c_send_byte(0x00);
}
}
}
i2c_stop();
}
void main()
{
init_uart();
init_adc();
init_oled();
while (1) {
read_temperature();
show_temperature(temperature);
SBUF = temperature;
while (!TI);
TI = 0;
delay(1000);
}
}
```
这段代码使用了STC15F2K60S2单片机内置的ADC模块来读取温度传感器数据,并通过串口将温度数据传输到PC机上。同时,使用了一个OLED屏幕来显示温度数据,使用了I2C通信协议来控制OLED屏幕。需要注意的是,您需要在程序中实现正确的数据格式转换和传输格式,以确保数据的准确性和可靠性。
阅读全文