当前位置:文档之家› 单片机温度传感器及无线传输

单片机温度传感器及无线传输

通信与测控系统课程设计报告一、课程设计目的及要求①通过一个具体的项目实例,熟悉项目开发的流程,学习与通信相关的测控系统开发,包括基本知识、技术、技巧②锻炼硬件编程能力(C51),积累编程经验,形成代码风格,理解软件层次结构③常用外围器件(接口)的操作、驱动一、实习主要任务①采集远端温度信息,无线收集,上位机显示信息②硬件配置:51系统板、DS18B20、无线数传模块IA4421、数码管③编程、调试,完成作品二、硬件电路的原理框图图一、AT89S51、数码管硬件原理图图二、IA4421硬件原理图图三、DS18B20硬件原理图最终实现的功能:三、软件设计及原理1、读主程序流程图主程序代码:#include<reg52.h>#include<IA4421.h>#include<absacc.h>#include<intrins.h>#include<math.h>#include<xianshi.h>#define uint unsigned int#define uchar unsigned charunsigned char m;unsigned char n;void zhuanhuan();void delay_led(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}uint aa;uchar wei_1,wei_2,wei_3,v,wei_4,wei_5,wei_6;uint shuju;//得到的温度值uchar temp[2]={0,0}; //存放DS18B20的温度寄存器值uint value = 0;sbit DQ=P3^3; //数据线void ReadSerialNumber(void);uchar sn1,sn2,sn3,sn4,sn5,sn6,sn7,sn8; //存放DS18B20的64位序列号void ow_reset(void);void tmstart (void);void ReadSerialNumber(void);void Read_Temperature(void);void write_byte(char);uint read_byte(void);void delay_18B20(uint);//void baojing();/*******主函数**********/void main(){ m=0;//init_led();//初始化子程序tmstart ();delay_18B20(50); /*等待转换结束*/while(1){ m++;Read_Temperature();delay_18B20(50);tmstart();delay_18B20(50); /*等待转换结束*/zhuanhuan();ia4421();n=wei_4;wei_4<<=4;txdata[4]=wei_5|wei_4;if(m==50){m=0;UART_Init();P1=0xfc;txdata[0]=0x2d;txdata[1]=0xd4;txdata[2]=0xfa;txdata[3]=0x01;ia442xinit();spirevtwobyte();spisendcommand(0x8288);txregframe();}P2=0xff;P0=table[n];P2_4=0;delay1s();P2_4=1;P0=table[wei_5];P2_5=0;delay1s();P2_5=1;P0=~0x80;P2_6=0;delay1s();P2_6=1;P0=~0x39;P2_7=0;delay1s();P2_7=1;}}/******转换************/void zhuanhuan(){aa=shuju;wei_1=aa/100000;wei_2=aa/10000%10;wei_3=aa/1000%100%10;wei_4=aa/100%1000%100%10;wei_5=aa/10%10000%1000%100%10;wei_6=aa/1%100000%10000%1000%100%10;}/******延时函数*********///========18b20程序=================*/void delay_18B20(uint seconds) //延时{for(;seconds>0;seconds--);}/******************************************18b20程序******************************************///===============复位===========void ow_reset(void){uchar presence;DQ = 0; //pull DQ line lowdelay_18B20(44); //至少480微秒,leave it low for 501usDQ = 1; // allow line to return high?delay_18B20(3); // wait for presence18b20 36uspresence = DQ; // get presence signal // 0= DS18B20 ready, 1= busy//if(!presence)P1_0=0;delay_18B20(12); // wait for end of timeslot}//=========从总线上读取一个字节========uint read_byte(void){uchar i;for (i=8;i>0;i--){value>>=1;DQ = 0; // pull DQ low to start timeslot_nop_();_nop_();_nop_();_nop_();DQ = 1; // then return highif(DQ){value|=0x80;}delay_18B20(4); // wait for rest of timeslotreturn(value);}//===========向18B20写一个字节=================void write_byte(char val){uchar i,j;for (i=8; i>0; i--) // writes byte, one bit at a time{DQ = 0; // pull DQ low to start timeslotj++; /*延时4us*/DQ = val&0x01;delay_18B20(8); // hold value for remainder of timeslotDQ = 1;j++;val>>=1;}}//============读取温度============void Read_Temperature(void){int k,i;int temple; /*存放读取的温度值将其除以16即为得到的值*/ ow_reset();k++; //延时4uswrite_byte(0xCC); //Sk_nop_();ip ROMk++; //延时4uswrite_byte(0xBE); // read registerk++;k++; //延时8ustemp[0]=read_byte(); //读取低字节temp[1]=read_byte(); //读取高字节//if(!(temp[0]&0x80)) /*当低位寄存器第八位为0时*/// {}i=temp[1];i<<=8; /*把b放到高八位上去*/i|=temp[0]; /*将a放到底八位上去*/i&=0x07ff;if( (temp[1]&0x08)){temple=~i+1; //如果为负温则去除其补码// FWD=0; /*表示温度为负数*/}{temple=i;// FWD=1; /*表示温度为正数*/}//temple=temp[1]*0x100+temp[0];shuju=temple*10/16;}//以下是读取器件序列号的子程序,需要读取序列时可在程序中调用;//调用时确保总线中只有一只器件,若有多个器件时则读取出来的号码无效;//将读取出来的序列号填到前面的数组中即可使用;//平时可以将此子程序删除以节约空间。

//////////////////////////读取器件序列号子程序////////////////////////////void ReadSerialNumber(void){ow_reset(); //复位delay_18B20(1); //延时write_byte(0x33); //发送读序列号子程序sn1=read_byte(); //读取第一个序列号,应为16H;sn2=read_byte(); //读取第二个序列号,应为10H;sn3=read_byte(); //sn4=read_byte(); //sn5=read_byte(); //sn6=read_byte(); //sn7=read_byte(); //sn8=read_byte();}//=======初始化============void tmstart (void){ow_reset(); //复位delay_18B20(1); //延时// ReadSerialNumber();write_byte(0xCC); //跳过序列号命令,对所有器件有效write_byte(0x44); //发转换命令44H,}//========报警===========///*void baojing(){if(aa>=250)FM=0;else FM=1;}2、温度传感器DS18B20功能简介:美国DALLAS半导体公司的数字化温度传感器DS18B20是世界上第一片支持“一线总线”接口的温度传感器。

一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。

现在,新一代的DS18B20体积更小、更经济、更灵活。

DS18B20测量温度范围为55℃~+125℃。

在10℃~+85℃范围内,精度为0.5℃。

现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。

工作原理:DS18B20采用串行单总线,单总线即只有一根数据线,系统中的数据交换、控制都由这根线完成。

相关主题