2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 【c#作为上位机控制51单片机(下位机)温度检测】

【c#作为上位机控制51单片机(下位机)温度检测】

时间:2019-02-22 21:45:04

相关推荐

【c#作为上位机控制51单片机(下位机)温度检测】

文章目录

概要C#上位机程序51单片机(下位机)程序使用DS18B20温度传感器实现测温小结

概要

通过串口方式与下位机通信,通信协议自定上位机可以实时显示下位机采集到的温度数据

C#上位机程序

Form.cs部分代码:

using System;

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;

namespace WindowsFormsApp1

{

public partial class Form1 : Form

{

//SerialPort serialPort1 = new SerialPort();

GreenHouse greenHouse = new GreenHouse();

private bool serial_open = false;

public Form1()

{

InitializeComponent();

serialPort1.DataReceived += serialPort1_DataReceived;

greenHouse.RequestSendData += Greenhouse1_RequestSendData;

}

private void Greenhouse1_RequestSendData(byte[] data)

{

serialPort1.Write(data, 0, data.Length);

}

private void Form1_Load(object sender, EventArgs e)

{

uart_name();

cb_bot.SelectedIndex = 1;

Cb_databit.SelectedIndex = 0;

cb_jiaoyan.SelectedIndex = 2;

cb_stopbit.SelectedIndex = 0;

}

private void suo_uart_Click(object sender, EventArgs e)

{

uart_name();

}

private void open_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();

}

}

public void uart_name()

{

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;

}

}

private void usart_portclose()

{

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 uart_close_Click(object sender, EventArgs e)

{

label2.Text = "";

}

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs 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 uartReadbit(byte[] data)

{

string str = System.Text.Encoding.UTF8.GetString(data);

}

private void Tx_Data_Click(object sender, EventArgs e)

{

//serialPort1.Write(tb_TxData.Text);

}

private void button3_Click(object sender, EventArgs e)

{

float temp = ((float)greenHouse.ReadTemperature())/10;

label2.Text = temp.ToString() + "℃";

}

}

}

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中,再通过引脚,将信号传给单片机使用。

本篇文章仅供学习参考,并非完整程序,如有需求请联系博主,如有错误或不足可在评论区指正!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。