做该设计的初衷是为自己的毕设打基础,因为我的毕设要做一个探测机器人,需要对某一地区的各种环境参数进行检测,然后通过WIFI返回到上位机。所以为了搞懂温度传感器以及练习上位机的设计,花了几天时间做了一个很简单的采集系统。今天把它拿出来跟各位小伙伴们分享,希望对各位有所帮助,同时也希望大佬们指出不足,起到一个相互学习,相互促进的作用。该系统原理是:51单片机把ds18b20传感器将采集到的温度值(十六进制)通过串口发送到labview,labview对单片机发来的数据做简单的处理然后显示。 上位机界面 上位机(接受程序) 简单的硬件连接 数据纪录 串口部分: void main() { if(flag==1||flag1==1) { S=test/10; Y=test%10; ES=0; flag=0; SBUF=S; while(!TI); TI=0; SBUF=Y; while(!TI); TI=0; if(temperature!=test) flag1=1; ES=1; } } //串口中断 void ser() interrupt 4 { if(RI==1) { RI=0; a=SBUF; if(a=='1') P1=0x55; if(a=='0') P1=0xaa; flag=1; } } 温度采集部分: #include #include "ds18b20.h" #include "delay.h" sbit DQ=P2^2; //温度传感器 I/O 口 uchar reset_ds18b20() { uchar presence; DQ=0; delay_ds18b20(29); //延时480 - 960 us DQ=1; delay_ds18b20(3); //延时 15 - 60 us presence=DQ; delay_ds18b20(25); //延时 60 - 240 us return(presence); } uchar read_bit_ds18b20() { uchar i; DQ=1; delay_ds18b20(1); DQ=0; //delay(1); //延时 15us 也可以不延时 DQ=1; //delay(3); //延时 1 - ∞ us for(i=0;i<3;i++); return(DQ); } void write_bit_ds18b20(uchar dat) { DQ=0; //置0 无需延时 if(dat==1) DQ=1; delay_ds18b20(1); //延时 60 - 120 us DQ=1; delay_ds18b20(1); //延时 1 - ∞ us } void write_byte_ds18b20(uchar dat) { uchar i,j; for(i=0;i<8;i++) { j=((dat>>i)&0x01); write_bit_ds18b20(j); //delay(1); //延时 1 - ∞ us } } uchar read_byte_ds18b20() { uchar dat=0; uchar i; for(i=0;i<8;i++) { if(read_bit_ds18b20()) dat|=0x01<<>< p=""><> //delay(1); //延时 1 - ∞ us } return(dat); } int read_temp_ds18b20() { uchar templ=0,temph=0; int temp=0; reset_ds18b20();//复位 write_byte_ds18b20(0xcc); //跳过ROM write_byte_ds18b20(0x44); //跳过温度采集 delay_ds18b20(10); //750ms reset_ds18b20(); write_byte_ds18b20(0xcc); //跳过ROM write_byte_ds18b20(0xbe); //准备好数据(开始温度转换采集) templ=read_byte_ds18b20();//读低字节温度值 temph=read_byte_ds18b20();//读低字节温度值 temp=(templ+(temph*256)); return(temp); |
|