1.问题提出
1.1、如何编写温湿度传感器实验程序
1.2、如何编写串口通信代码
1.3、如何利用c#的Serialport去获取串口传输的数据并完成上层应用界面设计
2.功能要求
2.1、设置温度报警值为26度,达到报警值时,红色闪亮,当低于报警值时,停止闪亮,同时,按下按钮,也可以解除报警;
2.2、将温湿度采集通过串口发送到电脑,上层用串口小助手查看,或者用VC等编程语言读取串口数据。
3.实验准备
3.1、IAR 安装
3.2、USB 转串口驱动安装
3.3、ZigBee 仿真器驱动安装
3.4、USBmini数据线、物联网基础实验箱、下载器
4.实验结果
4.1总体设计
4.2实验结果
描述:当温度高于26摄氏度时,Led闪烁警示,按下按键之后,报警解除,Led熄灭
4.3功能模块代码实现
void inttail(void)
{
P1DIR |=0x03;
PLED=0;
}
static void delay( uint32 d )
{
uint32 i,j;
for( i = 0; i < d; i ++ )
{
j = 1000;
while( j-- );
}
}
void Init_IO_AND_LED(void)
{
P0INP &= ~0X0c; //配置P0口上拉下拉情况
P1INP &= ~0X40; //配置P1口上拉下拉情况
P0IEN |= 0X40; //P06为中断模式
PICTL |= 0X02; //下降沿
EA = 1;
IEN1 |= 0X20; // P0IE = 1;开启P0口中断
P0IFG |= 0x00;
};
void initUARTtest(void)
{
CLKCONCMD &= ~0x40; //晶振
while(!(SLEEPSTA & 0x40)); //等待晶振稳定
CLKCONCMD &= ~0x47; //TICHSPD128分频,CLKSPD不分频
SLEEPCMD |= 0x04; //关闭不用的RC振荡器
PERCFG = 0x00; //位置1 P0口
P0SEL = 0x3c; //P0用作串口
P2DIR &= ~0XC0; //P0优先作为串口0
U0CSR |= 0x80; //UART方式
U0GCR |= 10; //baud_e
U0BAUD |= 216; //波特率设为57600
UTX0IF = 0;
}
</pre><pre name="code" class="cpp">/****************************************************************
*函数功能 :串口发送字符串函数
****************************************************************/
void UartTX_Send_String(char *Data,int len)
{
int j;
for(j=0;j<len;j++)
{
U0DBUF = *Data++;
while(UTX0IF == 0);
UTX0IF = 0;
}
}
void main(void)
{
uint16 sht;
float sht11;
intClock();
P2DIR |= 0x01; //打开电源
P2 |= 0x01;
initUARTtest();
SHT1X_INT();
ugOled9616int(); //初始化OLed配置
inttail();
Init_IO_AND_LED();
delay(10);
while(1)
{
char tempBuf[5];
sht = Read_SHT1X(3);
sht&=0x3fff;
sht11 = (float)(sht*0.01) - 39.60;
sprintf( (void *)tempBuf,"%f",sht11);
LcdPutString16_8(0,0,(uint8*)tempBuf,5,1);
delay(10);
if(m==0)
{
if(sht11>=29)
{
PLED=!PLED;
}
else PLED=1;
}
if(sht11<29)
m=0;
char humBuf[6];
sht = Read_SHT1X(5);
sht&=0x0fff;
sht11 = (float)(sht*0.0405) - 4 - (sht * sht * 0.000028);
sprintf( (void *)humBuf,"%f",sht11);
humBuf[5] = 37;//%
LcdPutString16_8(48,0,(uint8*)humBuf,6,1);
delay(10);
UartTX_Send_String(tempBuf,5);
delay(10); //延时
delay(10);
UartTX_Send_String(humBuf,6); //串口发送数据 //串口发送数据
delay(10); //延时
delay(10);
delay(10);
}
}
#pragma vector = P1INT_VECTOR
__interrupt void P1_ISR(void)
{
if(P0IFG>0) //按键中断
{
P0IFG = 0;
PLED = 1;
m=1;
delay(10);
}
P0IF = 0; //清中断标志
}
基于c#的应用界面简单设计
代码实现
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO.Ports;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using Microsoft.Win32;
namespace CommAssist
{
public partial class Form1 : Form
{
SerialPort Comm = new SerialPort("COM3", 57600, Parity.None, 8, StopBits.One); //初始化串口设置
public delegate void Displaydelegate(byte[] InputBuf);
Byte[] OutputBuf = new Byte[128];
public Displaydelegate disp_delegate;
public Form1()
{
disp_delegate = new Displaydelegate(DispUI);
InitializeComponent();
comboBox1.SelectedItem = "COM3";
Comm.DataReceived += new SerialDataReceivedEventHandler(Comm_DataReceived);
try
{
Comm.Open();
}
catch
{
MessageBox.Show("你选择的串口被占用或不存在,请重新选择");
OpenSerialPort.Text = "打开串口";
textBox1.Text = " ";
textBox2.Text = " ";
}
}
/**
*显示温度,湿度的值
**/
public void DispUI(byte[] InputBuf)
{
//textBox1.Text = Convert.ToString(InputBuf);
ASCIIEncoding encoding = new ASCIIEncoding();
if (encoding.GetString(InputBuf).Contains("%"))
{
textBox1.Text = encoding.GetString(InputBuf);
}
else
{
textBox2.Text = encoding.GetString(InputBuf);
}
}
/**
*获取缓冲区数据
**/
void Comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Byte[] InputBuf = new Byte[128];
try
{
Comm.Read(InputBuf,0,Comm.BytesToRead); //读取缓冲区的数据直到“}”即0x7D为结束符
//InputBuf = UnicodeEncoding.Default.GetBytes(strRD); //将得到的数据转换成byte的格式
System.Threading.Thread.Sleep(50);
this.Invoke(disp_delegate, InputBuf);
}
catch (TimeoutException ex) //超时处理
{
MessageBox.Show(ex.ToString());
}
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) //选择串口的处理过程
{
bool b_OpenFlag = Comm.IsOpen;
if (b_OpenFlag == true)
{
Comm.Close();
Comm.PortName = comboBox1.SelectedItem.ToString();
if (!Comm.IsOpen)
{
Comm.Close();
try
{
Comm.Open();
}
catch
{
MessageBox.Show("你选择的串口被占用或不存在,请重新选择");
OpenSerialPort.Text = "打开串口";
textBox1.Text = " ";
textBox2.Text = " ";
}
}
}
else
{
Comm.PortName = comboBox1.SelectedItem.ToString();
}
}
private void OpenSerialPort_Click(object sender, EventArgs e) //点击“打开串口”按钮的操作
{
if (OpenSerialPort.Text == "关闭串口")
{
Comm.Close();
OpenSerialPort.Text = "打开串口";
}
else
{
OpenSerialPort.Text = "关闭串口";
try
{
Comm.Open();
}
catch
{
MessageBox.Show("你选择的串口被占用或不存在,请重新选择");
OpenSerialPort.Text = "打开串口";
textBox1.Text = " ";
textBox2.Text = " ";
}
}
}
}
}
以上代码下载地址: