3,C# 物联网温度采集系统开发,STC51,DS18B20 温度采集上位机C# 的开发,与51程序的开发(三)

前现大约几周的时候把硬件的选型与硬件连接搞定了,接下来就开始进行芯片开发了,单片机用的是STC的,温度传感器是美信的,接下来写一个温度读取的单片机的程序,我使用的是Keill 5  烧录软件也是官方提供的大家可以去官网进行下载

烧录软件下载地址如下:  http://www.stcmcudata.com/STCISP/stc-isp-15xx-v6.86R.zip

Keill 软件可以自己百度,如果自己实在是找不到,也可以留言,或加我发给你,都可以。

也会用到串口工具进行开发完成进行测试串口数据的正确性,大家随便百度了,这个网上有很多,我使用的ComAssistant 这个,不需要安装直接使用就可以了,如果大家也找不到或者不想找,我也可以一起发给你。

3,C# 物联网温度采集系统开发,STC51,DS18B20 温度采集上位机C# 的开发,与51程序的开发(三)_第1张图片

下程序的过程我就不详细的写步骤,我下面上一部分代码,主要是读取DS18b20传感器器的温度,与串口传输的程程序,

下面中读取温度传感器的C51程序

18b20.h头文件如下

#ifndef __DS18B20_H__
#define __DS18B20_H__

#include     //°üº¬Í·Îļþ£¬Ò»°ãÇé¿ö²»ÐèÒª¸Ä¶¯£¬Í·Îļþ°üº¬ÌØÊ⹦ÄܼĴæÆ÷µÄ¶¨Òå
#include

#define uchar unsigned char
#define uint   unsigned int;
/*------------------------------------------------
                    ¶Ë¿Ú¶¨Òå
------------------------------------------------*/
sbit DQ=P1^3;//ds18b20 ¶Ë¿Ú
/*------------------------------------------------
                  º¯ÊýÉùÃ÷
------------------------------------------------*/
unsigned int ReadTemperature(void);
bit Init_DS18B20(void);
unsigned char ReadOneChar(void);
void WriteOneChar(unsigned char dat);

#endif

18b20 C文件 


#include"delay.h"
#include"18b20.h"
/*------------------------------------------------
                    18b20³õʼ»¯
------------------------------------------------*/
bit Init_DS18B20(void)
{
 bit dat=0;
 DQ = 1;    //DQ¸´Î»
 DelayUs2x(5);   //ÉÔ×öÑÓʱ
 DQ = 0;         //µ¥Æ¬»ú½«DQÀ­µÍ
 DelayUs2x(200); //¾«È·ÑÓʱ ´óÓÚ 480us СÓÚ960us
 DelayUs2x(200);
 DQ = 1;        //À­¸ß×ÜÏß
 DelayUs2x(50); //15~60us ºó ½ÓÊÕ60-240usµÄ´æÔÚÂö³å
 dat=DQ;        //Èç¹ûx=0Ôò³õʼ»¯³É¹¦, x=1Ôò³õʼ»¯Ê§°Ü
 DelayUs2x(25); //ÉÔ×÷ÑÓʱ·µ»Ø
 return dat;
}

/*------------------------------------------------
                    ¶ÁÈ¡Ò»¸ö×Ö½Ú
------------------------------------------------*/
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
 {
  DQ = 0; // ¸øÂö³åÐźÅ
  dat>>=1;
  DQ = 1; // ¸øÂö³åÐźÅ
  if(DQ)
   dat|=0x80;
  DelayUs2x(25);
 }
 return(dat);
}
/*------------------------------------------------
                    дÈëÒ»¸ö×Ö½Ú
------------------------------------------------*/
void WriteOneChar(unsigned char dat)
{
 unsigned char i=0;
 for (i=8; i>0; i--)
 {
  DQ = 0;
  DQ = dat&0x01;
  DelayUs2x(25);
  DQ = 1;
  dat>>=1;
 }
DelayUs2x(25);
}

/*------------------------------------------------
                    ¶ÁȡζÈ
------------------------------------------------*/
unsigned int ReadTemperature(void)
{
unsigned char a=0;
unsigned int b=0;
unsigned int t=0;
Init_DS18B20();
WriteOneChar(0xCC); // Ìø¹ý¶ÁÐòºÅÁкŵIJÙ×÷
WriteOneChar(0x44); // Æô¶¯Î¶Èת»»
DelayMs(10);
Init_DS18B20();
WriteOneChar(0xCC); //Ìø¹ý¶ÁÐòºÅÁкŵIJÙ×÷ 
WriteOneChar(0xBE); //¶ÁȡζȼĴæÆ÷µÈ£¨¹²¿É¶Á9¸ö¼Ä´æÆ÷£© Ç°Á½¸ö¾ÍÊÇζÈ
a=ReadOneChar();   //µÍλ
b=ReadOneChar();   //¸ßλ

b<<=8;
t=a|b;
	
return(t);
}

main.c 文件如下:

/*-----------------------------------------------
  Ãû³Æ£ºDS18b20ÊýÂë¹ÜÏÔʾ
  ÂÛ̳£ºwww.doflye.net
  ±àд£ºshifang
  ÈÕÆÚ£º2009.5
  Ð޸ģºÎÞ
  ÄÚÈÝ£ºÏÔʾ¸ñʽ ·ûºÅ xxx.x C 
        ¿ÉÒÔÏÔʾ¸ºÎ¶È
------------------------------------------------*/
#include //°üº¬Í·Îļþ£¬Ò»°ãÇé¿ö²»ÐèÒª¸Ä¶¯£¬Í·Îļþ°üº¬ÌØÊ⹦ÄܼĴæÆ÷µÄ¶¨Òå
#include "18b20.h"
#include 

#define DataPort P0 //¶¨ÒåÊý¾Ý¶Ë¿Ú ³ÌÐòÖÐÓöµ½DataPort ÔòÓÃP0 Ìæ»»

sbit jdq = P1^0;
sbit led = P1^1;


bit ReadTempFlag;//¶¨Òå¶Áʱ¼ä±êÖ¾


void Display(unsigned char FirstBit,unsigned char Num);//ÊýÂë¹ÜÏÔʾº¯Êý
void Init_Timer0(void);//¶¨Ê±Æ÷³õʼ»¯
unsigned char i;


void init_com(void)
{
     SCON=0x50; //´®¿Ú¹¤×÷·½Ê½1£¬8λUART£¬ ²¨ÌØÂÊ¿É±ä  
     TH2=0xFF;           
     TL2=0xFD;    //²¨ÌØÂÊ:115200 ¾§Õñ=11.0592MHz 
	
     RCAP2H=0xFF;   
     RCAP2L=0xFD; // 16λ×Ô¶¯×°ÈëÖµ

		/*****************/
     TCLK=1;   
     RCLK=1;   
     C_T2=0;   
     EXEN2=0; //²¨ÌØÂÊ·¢ÉúÆ÷ ¹¤×÷·½Ê½

		 /*****************/
     TR2=1 ; //¶¨Ê±Æ÷2¿ªÊ¼
}
void SendByte(char dat)
{
 SBUF = dat;
 while(!TI);
      TI = 0;
} 

void SendInt(unsigned int dat)
{
 
	 SBUF = dat>>8;
	 while(!TI);
				TI = 0;
	 SBUF = dat&0x00FF;
	 while(!TI);
				TI = 0;
 
} 

void SendStr(unsigned char *s)
{
 while(*s!='\0')
  {
  SendByte(*s);
  s++;
  }
} 
/*------------------------------------------------
                    Ö÷º¯Êý
------------------------------------------------*/
void main (void)
{                  
unsigned int TempH,TempL,temp;
unsigned char jdqsign;
Init_Timer0();
init_com();
jdq=1;
jdqsign=0;
while (1)         //Ö÷Ñ­»·
  { 
if(ReadTempFlag==1)
{
  ReadTempFlag=0;
  temp=ReadTemperature();
  SendInt(temp); 
  
}
 
/*------------------------------------------------
                    ¶¨Ê±Æ÷³õʼ»¯×Ó³ÌÐò
------------------------------------------------*/
void Init_Timer0(void)
{
 TMOD |= 0x01;	  //ʹÓÃģʽ1£¬16λ¶¨Ê±Æ÷£¬Ê¹ÓÃ"|"·ûºÅ¿ÉÒÔÔÚʹÓöà¸ö¶¨Ê±Æ÷ʱ²»ÊÜÓ°Ïì		     
 //TH0=0x00;	      //¸ø¶¨³õÖµ
 //TL0=0x00;
 EA=1;            //×ÜÖжϴò¿ª
 ET0=1;           //¶¨Ê±Æ÷Öжϴò¿ª
 TR0=1;           //¶¨Ê±Æ÷¿ª¹Ø´ò¿ª
}
/*------------------------------------------------
                 ¶¨Ê±Æ÷ÖжÏ×Ó³ÌÐò
------------------------------------------------*/
void Timer0_isr(void) interrupt 1 
{
 static unsigned int num;
 TH0=(65536-2000)/256;		  //ÖØи³Öµ 2ms
 TL0=(65536-2000)%256;
 
 Display(0,8);       // µ÷ÓÃÊýÂë¹ÜɨÃè
 num++;
 if(num==300)        //
   {
    num=0;
    ReadTempFlag=1; //¶Á±ê־λÖÃ1
	}
}


以上单片机的程序就完成了,下面就测试一下串口是否与Pc可正常通信

下面启动串口工具后收到数据如下

3,C# 物联网温度采集系统开发,STC51,DS18B20 温度采集上位机C# 的开发,与51程序的开发(三)_第2张图片

现在证明可以正常了,大家一定要记住一定要使用115200的波特率,因为为了和ES8266进行匹配后在方便和WIFI模块进行对接,接下来进行开一个C# 串口工具进行温度的解析,解析完了就可以,直接略过步骤,直接上代码如下:


using Microsoft.AspNetCore.SignalR.Client;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WenduDisp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;//设置该属性 为false
        }

        /// 
        /// 字节数组转16进制字符串
        /// 
        /// 
        /// 
        public static string byteToHexStr(byte[] bytes)
        {
            string returnStr = "";
            if (bytes != null)
            {
                for (int i = 0; i < bytes.Length; i++)
                {
                    returnStr += bytes[i].ToString("X2");
                }
            }
            return returnStr;
        }

        private void Button1_Click(object sender, EventArgs e)
        {
        }

        List buffer = new List(2);
        Queue duilie = new Queue();
        /// 
        /// 串口
        /// 
        /// 
        /// 
        private async void SerialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            byte[] revice = new byte[1];
            var bbb = serialPort1.BytesToRead;
            Console.WriteLine(bbb);
            serialPort1.Read(revice, 0, 1);//读取数据 
            buffer.AddRange(revice);
            //  duilie.Enqueue(revice[0]);
            //buffer.AddRange(buf); 

            if (buffer.Count() == 4)
            {

                byte[] vs = new byte[2];
                vs[0] = buffer[0];
                vs[1] = buffer[1];

                var chaowensign = buffer[2];
                var chaowensign1 = buffer[3];

                var aa = byteToHexStr(vs);
                var temp = Convert.ToUInt16("0x" + aa, 16);
                if (chaowensign == 0xff)
                {
                    label3.Text = "超温";
                    label3.ForeColor = Color.Red;
                    label2.ForeColor = Color.Red;
                }
                else if (chaowensign == 0xfd)
                {
                    label3.Text = "正常温度";
                    label3.ForeColor = Color.Black;
                    label2.ForeColor = Color.Black;
                }

                var temph = temp >> 4;
                var templ = temp & 0x0f;
                templ = templ * 6 / 10;
                label2.Text = (temph % 100) / 10 + "" + (temph % 100) % 10 + "." + templ + "℃";
                buffer = new List(4);

            }

            if (buffer.Count() > 4)
            {
                buffer = new List(4);
            }
        }


        HubConnection _connection;

        private async void Form1_Load(object sender, EventArgs e)
        { 
            serialPort1.PortName = "COM1";
            serialPort1.BaudRate = 115200;
            serialPort1.Parity = Parity.None;
            serialPort1.DataBits = 8;
            serialPort1.StopBits = StopBits.One;
            serialPort1.Open();
        }

        
    }
}

上面的温度解析涉及到相关的部分高低位的转换,大家在解析的时候注意一下就行了

以下是C# Winform最终于的效果

3,C# 物联网温度采集系统开发,STC51,DS18B20 温度采集上位机C# 的开发,与51程序的开发(三)_第3张图片

这周实现了芯片采集温度并通过串口传输到C# Winform上面显示。这样的话,还不能达到我们最终的目的,不能为了采集一个温度开一台电脑吧 ,这显然是不行的,所以,得把Wifi连接上,下周更新

 

欢迎大家加群进行C# IOT方面的技术沟通

你可能感兴趣的:(C#,上位机,IOt,通信)