文章目录
概要C#上位机程序51单片机(下位机)程序使用DS18B20温度传感器实现测温小结概要
通过串口方式与下位机通信,通信协议自定上位机可以实时显示下位机采集到的温度数据
C#上位机程序
Form.cs部分代码:
using System.Collections.Generic; using ponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO.Ports;using System;
{ public partial class Form1 : Form {namespace WindowsFormsApp1
GreenHouse greenHouse = new GreenHouse(); private bool serial_open = false;//SerialPort serialPort1 = new SerialPort();
public Form1() { InitializeComponent(); serialPort1.DataReceived += serialPort1_DataReceived;
greenHouse.RequestSendData += Greenhouse1_RequestSendData;
}
{ serialPort1.Write(data, 0, data.Length); }private void Greenhouse1_RequestSendData(byte[] data)
{ uart_name(); cb_bot.SelectedIndex = 1; Cb_databit.SelectedIndex = 0; cb_jiaoyan.SelectedIndex = 2; cb_stopbit.SelectedIndex = 0; }private void Form1_Load(object sender, EventArgs e)
{ uart_name(); }private void suo_uart_Click(object sender, EventArgs e)
{ if (serial_open == true) { usart_portclose(); } else { serialPort1.PortName = Cb_uartname.Text; serialPort1.BaudRate = Convert.ToInt32(cb_bot.Text); usart_Open(); } }private void open_uart_Click(object sender, EventArgs e)
{ string[] port_name = SerialPort.GetPortNames(); Cb_uartname.Items.Clear(); foreach (string port in port_name) { Cb_uartname.Items.Add(port); } if (Cb_uartname.Items.Count > 0) { Cb_uartname.SelectedIndex = 0; } } private void usart_Open() { if (Cb_uartname.Text == "" || Cb_uartname.Text == null) { MessageBox.Show("串口号为空"); return; } serialPort1.Open(); if (serialPort1.IsOpen == true) { serial_open = true; open_uart.Text = "关闭串口"; //tb_Rxdata.Text += "打开成功\r\n"; Cb_uartname.Enabled = false; cb_bot.Enabled = false; cb_stopbit.Enabled = false; cb_jiaoyan.Enabled = false; Cb_databit.Enabled = false; } }public void uart_name()
{ serialPort1.Close(); open_uart.Text = "打开串口"; //tb_Rxdata.Text += "关闭成功\r\n"; serial_open = false; Cb_uartname.Enabled = true; cb_bot.Enabled = true; cb_stopbit.Enabled = true; cb_jiaoyan.Enabled = true; Cb_databit.Enabled = true; }private void usart_portclose()
{ label2.Text = ""; }private void uart_close_Click(object sender, EventArgs e)
{ int n = serialPort1.BytesToRead; //byte[] data = new byte[n]; if(n>0) { byte[] data = new byte[n]; serialPort1.Read(data, 0, n); //uartReadbit(data); greenHouse.ReceivedRawData(data); } }private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{private void uartReadbit(byte[] data)
}string str = System.Text.Encoding.UTF8.GetString(data);
{ //serialPort1.Write(tb_TxData.Text); }private void Tx_Data_Click(object sender, EventArgs e)
{private void button3_Click(object sender, EventArgs e)
label2.Text = temp.ToString() + "℃"; }float temp = ((float)greenHouse.ReadTemperature())/10;
}
}
51单片机(下位机)程序
main.c主函数
u8 read_temp_flag = 0;
void GH_RecValidData(u8 device,u8 HV,u8 LV)
{
u16 value =HV<<8 + LV;
switch (device)
{
case DEVICE_TEMP:
read_temp_flag = 1;
break;
}
}
void GH_DataAssemblyComplete(u8 data_arr[],u8 len)
{
u8 i ;
for(i=0;i<len;i++)
{
uart_send_byte(data_arr[i]);
}
}
void main()
{
uart_init(BAUD_9600); //波特率9600
ds18b20_init();
printf("init ok, baud = %d \r\n",9600);
cb_GH_RecValidData = GH_RecValidData;
cb_GH_DataAssemblyComplete = GH_DataAssemblyComplete;
while(1)
{
int temp = ds18b20_read_temperture()*10;
printf("temp = %d\r\n",temp);
Delay100ms();
if(read_temp_flag ==1)
{
read_temp_flag = 0;
UploadDeviceValue(DEVICE_TEMP,temp>>8,temp&0xFF);
}
}
}
void uart() interrupt 4
{
u8 rec_data;
RI = 0;
rec_data=SBUF;
ReceivedRawData(rec_data);
}
ds18b20.c函数
#include "ds18b20.h"
void ds18b20_reset()
{
DS18B20_PORT = 0;
Delay_10us(60);
DS18B20_PORT = 1;
Delay_10us(2);
}
u8 ds18b20_check()
{
u8 time_cnt = 0;
while(DS18B20_PORT == 1 )
{
Delay_10us(1);
time_cnt++;
if(time_cnt>20)
break;
}
if(time_cnt>=20)
return 1;
time_cnt = 0;
while(DS18B20_PORT == 0)
{
Delay_10us(1);
time_cnt++;
if(time_cnt>20)
break;
}
if(time_cnt>=20)
return 1;
return 0;
}
u8 ds18b20_read_bit(void)
{
u8 dat = 0;
DS18B20_PORT=0;
_nop_();_nop_();
DS18B20_PORT=1;
_nop_();_nop_();
if(DS18B20_PORT == 1)
dat=1;
else
dat=0;
Delay_10us(5);
return dat;
}
u8 ds18b20_read_byte(void)
{
u8 i = 0;
u8 dat = 0;
for(i=0;i<8;i++)
{
u8 temp = ds18b20_read_bit();
dat=(temp<<7)|(dat>>1);
}
return dat;
}
void ds18b20_write_byte(u8 dat)
{
u8 i;
for(i =0;i<8;i++)
{
u8 temp = dat&0x01;
dat =dat>>1;
if(temp ==1)
{
DS18B20_PORT=0;
_nop_();_nop_();
DS18B20_PORT=1;
Delay_10us(6);
}
else
{
DS18B20_PORT=0;
Delay_10us(6);
DS18B20_PORT=1;
_nop_();_nop_();
}
}
}
u8 ds18b20_init()
{
ds18b20_reset();
return ds18b20_check();
}
float ds18b20_read_temperture(void)
{
float temp =0;
u8 dath =0;
u8 datl =0;
u16 value=0;
ds18b20_reset();
ds18b20_check();
ds18b20_write_byte(0xcc);
ds18b20_write_byte(0x44);
ds18b20_reset();
ds18b20_check();
ds18b20_write_byte(0xcc);
ds18b20_write_byte(0xBE);
datl = ds18b20_read_byte();
dath = ds18b20_read_byte();
value=(dath<<8)+datl;
if((value&0xf800)==0xf800)
{
value=(~value)+1;
temp=value*(-0.0625);
}
else
{
temp=value*0.0625;
}
return temp;
ds18b20.h函数
#ifndef _DS18B20_H
#define _DS18B20_H
#include "reg52.h"
sbit DS18B20_PORT = P3^7;
u8 ds18b20_init();
float ds18b20_read_temperture(void);
#endif
使用DS18B20温度传感器实现测温
DS18B20是一种常见的数字温度传感器,其控制命令和数据都是以数字信号的方式输入输出,相比较于模拟温度传感器,具有功能强大、硬件简单、易扩展、抗干扰性强等特点
测温范围:-55°C 到 +125°C
通信接口:1-Wire(单总线)
其它特征:可形成总线结构、内置温度报警功能、可寄生供电(VCC都不用接,直接信号线加GND线就可以通信)
模拟温度传感器:热敏电阻,可通过温度的变化改变电阻值,一般再接一个分压电阻,串联到VCC和GND之间,需要用AD转换芯片将模拟信号转换为数字信号才能供单片机使用
小结
主要使用到DS18B20温度传感器测温,DS18B20内部集成了模拟温度传感器所需的电路,其内部也相当于有个小芯片,将模拟信号处理成数字信号后存到RAM中,再通过引脚,将信号传给单片机使用。
本篇文章仅供学习参考,并非完整程序,如有需求请联系博主,如有错误或不足可在评论区指正!