前现大约几周的时候把硬件的选型与硬件连接搞定了,接下来就开始进行芯片开发了,单片机用的是STC的,温度传感器是美信的,接下来写一个温度读取的单片机的程序,我使用的是Keill 5 烧录软件也是官方提供的大家可以去官网进行下载
烧录软件下载地址如下: http://www.stcmcudata.com/STCISP/stc-isp-15xx-v6.86R.zip
Keill 软件可以自己百度,如果自己实在是找不到,也可以留言,或加我发给你,都可以。
也会用到串口工具进行开发完成进行测试串口数据的正确性,大家随便百度了,这个网上有很多,我使用的ComAssistant 这个,不需要安装直接使用就可以了,如果大家也找不到或者不想找,我也可以一起发给你。
下程序的过程我就不详细的写步骤,我下面上一部分代码,主要是读取DS18b20传感器器的温度,与串口传输的程程序,
下面中读取温度传感器的C51程序
18b20.h头文件如下
#ifndef __DS18B20_H__
#define __DS18B20_H__
#include<reg52.h> //°üº¬Í·Îļþ£¬Ò»°ãÇé¿ö²»ÐèÒª¸Ä¶¯£¬Í·Îļþ°üº¬ÌØÊ⹦ÄܼĴæÆ÷µÄ¶¨Òå
#include<intrins.h>
#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<reg52.h> //°üº¬Í·Îļþ£¬Ò»°ãÇé¿ö²»ÐèÒª¸Ä¶¯£¬Í·Îļþ°üº¬ÌØÊ⹦ÄܼĴæÆ÷µÄ¶¨Òå
#include "18b20.h"
#include<stdio.h>
#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可正常通信
下面启动串口工具后收到数据如下
现在证明可以正常了,大家一定要记住一定要使用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
}
/// <summary>
/// 字节数组转16进制字符串
/// </summary>
/// <param name="bytes"></param>
/// <returns></returns>
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<byte> buffer = new List<byte>(2);
Queue<byte> duilie = new Queue<byte>();
/// <summary>
/// 串口
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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<byte>(4);
}
if (buffer.Count() > 4)
{
buffer = new List<byte>(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最终于的效果
这周实现了芯片采集温度并通过串口传输到C# Winform上面显示。这样的话,还不能达到我们最终的目的,不能为了采集一个温度开一台电脑吧 ,这显然是不行的,所以,得把Wifi连接上,下周更新
欢迎大家加群进行C# IOT方面的技术沟通