stc串口传输温度数据代码
时间: 2023-12-01 22:02:31 浏览: 53
串口温度传输
以下是基于STC12C5A60S2单片机的串口传输温度数据的示例代码:
```
#include <reg52.h>
#include <stdio.h>
sbit DQ=P1^0; // DS18B20连接的GPIO口
// DS18B20 初始化
void Init_DS18B20(){
DQ=1; // 外部上拉
Delay_DS18B20(6); // 延时 480us 以上
DQ=0; // 发送复位脉冲
Delay_DS18B20(60); // 延时 480us 以上
DQ=1; // 收到应答信号
Delay_DS18B20(6); // 延时 60us 以上
}
// DS18B20 发送一位数据
void Write_DS18B20(unsigned char dat){
unsigned char i;
for(i=0;i<8;i++){
DQ=0; // 发送时间片
DQ=dat&0x01; // 发送数据位
Delay_DS18B20(6); // 延时 60us 以上
DQ=1; // 释放总线
dat>>=1;
}
}
// DS18B20 读取一位数据
unsigned char Read_DS18B20(){
unsigned char i,dat=0;
for(i=0;i<8;i++){
DQ=0; // 发送时间片
dat>>=1;
DQ=1; // 释放总线
if(DQ) dat|=0x80; // 读取数据位
Delay_DS18B20(6); // 延时 60us 以上
}
return dat;
}
// DS18B20 发送读取温度命令
void Start_DS18B20(){
Init_DS18B20();
Write_DS18B20(0xCC); // 跳过ROM指令
Write_DS18B20(0x44); // 发送温度转换指令
}
// DS18B20 读取温度值
unsigned int Read_DS18B20_Temp(){
unsigned char TL,TH;
unsigned int Temp;
Init_DS18B20();
Write_DS18B20(0xCC); // 跳过ROM指令
Write_DS18B20(0xBE); // 发送读取温度指令
TL=Read_DS18B20(); // 读取温度低八位
TH=Read_DS18B20(); // 读取温度高八位
Temp=TH;
Temp<<=8;
Temp|=TL;
return Temp;
}
// 延时函数
void Delay_DS18B20(unsigned int t){
unsigned int i;
while(t--){
for(i=0;i<12;i++);
}
}
// 串口初始化
void Init_UART(){
TMOD|=0x20; // 定时器1工作在模式2
TH1=0xFD; // 波特率为9600
TL1=0xFD;
TR1=1; // 启动定时器1
SCON=0x50; // 串口工作在模式1
}
// 串口发送一位数据
void Send_Data(unsigned char dat){
SBUF=dat;
while(!TI); // 等待发送完成
TI=0; // 清除发送完成标志位
}
// 串口发送字符串
void Send_String(unsigned char *s){
while(*s){
Send_Data(*s++);
}
}
void main(){
unsigned int Temp;
unsigned char Temp_Str[10];
Init_UART();
while(1){
Start_DS18B20(); // 发送读取温度命令
Temp=Read_DS18B20_Temp(); // 读取温度值
sprintf(Temp_Str,"%u.%u",Temp/10,Temp%10); // 转换成字符串
Send_String(Temp_Str); // 通过串口发送温度数据
Send_Data(0x0D); // 发送回车符
Send_Data(0x0A); // 发送换行符
Delay_DS18B20(1000); // 延时 1s
}
}
```
在上述代码中,使用了DS18B20数字温度传感器进行温度采集,并通过串口将温度数据发送出去。需要注意的是,本示例代码中的波特率为9600,如需更改请自行调整。
阅读全文