通信与测控系统设计报告.docx

上传人:b****6 文档编号:4830779 上传时间:2022-12-10 格式:DOCX 页数:13 大小:567.70KB
下载 相关 举报
通信与测控系统设计报告.docx_第1页
第1页 / 共13页
通信与测控系统设计报告.docx_第2页
第2页 / 共13页
通信与测控系统设计报告.docx_第3页
第3页 / 共13页
通信与测控系统设计报告.docx_第4页
第4页 / 共13页
通信与测控系统设计报告.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

通信与测控系统设计报告.docx

《通信与测控系统设计报告.docx》由会员分享,可在线阅读,更多相关《通信与测控系统设计报告.docx(13页珍藏版)》请在冰豆网上搜索。

通信与测控系统设计报告.docx

通信与测控系统设计报告

河北工业大学

通信与测控系统设计

 

姓名:

高旭

班级:

通信122班

学号:

122238

指导教师:

王蒙军、曾祥烨

1.项目需求

随着社会生产力的发展,社会的进步,传感器在工农业生产中都有了很重要的应用。

例如,现代化的智能温室系统,温度的测控与检测在农业生产中是很重要的环节,检测温室中的各处的温度是很重要的,因此温度采集和网络结合得到了广泛的应用。

本项目旨在完成设计收发双方两台设备之间的温度信息通信,由发送方对周围环境温度进行采集(此项目采用DS18B20芯片构成温度采集模块),通过核心处理芯片AT89C52对采集到的温度信息进行信息处理,并使用七段数码管对处理后的信息进行显示,并使用无线传输模块(本项目采用IA4421芯片)将温度信息传送至接收方的IA4421无线接收模块,并传送至中央处理芯片进行处理,并加以在七段数码管显示。

为了验证传输的可靠性,可将发送方显示模块的温度值与接收方的温度进行校正与对比。

2.原理介绍

无线传感器测温系统可划分为四部分。

CPU使用的是AT89S52单片机芯片,是该系统的核心部分,负责数据的处理和系统的控制。

温度测量模块使用的DS18B20传感器,是无线传感器网络的关键部分,负责温度的测量。

显示温度的四位数码管。

用于数据发送的是无线收发的IA4421芯片电路,负责单片机和上位机之间的无线通信。

温度传感器DS18B20传感器和CPU通过一总线协议相连,将测量的温度数据传输给CPU,CPU对数据进行处理通过四位数码管显示测得的温度数据CPU和IA4421之间通过SPI总线协议相连接,CPU通过无线收发模块IA4421芯片电路发送给上位机,与上位机之间的连接是无线连接。

2.1DS18B20传感器

在无线温度测量系统的设计中,温度测量使用DS18B20传感器。

DS18B20单线数字温度传感器,即“一线器件”。

其具有独特的优点。

⑴采用单总线的接口方式与微处理器连接时仅需要一条连线即可实现微处理器与DS18B20的双向通信。

单总线具有经济性好,抗干扰能力强,使用方便等优点。

⑵DS18B20测量温度范围宽,为-55℃~+125℃。

测量精度高,在-10℃~+85℃范围内,精度为±0.5℃。

⑶测量参数可配置DS18B20的测量分辨率可通过程序设定9~12位。

⑷持多点组网功能,多个DS18B20可以并联在一根单线上,实现多点测温。

⑸供电方式灵活,DS18B20可以通过内部寄生电路从数据线上获取电源。

因此,当数据线上的时序满足一定的要求时,可以不接外部电源,从而使系统结构更趋简单,可靠性更高。

DS18B20具有体积更小、适用电压更宽、更经济、可选更小的封装方式,更宽的电压适用范围,适合于构建经济的测温系统。

2.2IA4421

通用ISM频段FSK收发器:

IA4421

单片机与无线模块IA4421的连接

单片机与无线模块IA4421的连接标准是SPI,SPI的相关协议如下:

它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时)。

也是所有基于SPI的设备共有的,它们是SDI(数据输入)、SDO(数据输出)、SCLK(时钟)、CS(片选)。

(1)SDO–主设备数据输出,从设备数据输入;

(2)SDI–主设备数据输入,从设备数据输出;

(3)SCLK–时钟信号,由主设备产生;

(4)CS–从设备使能信号,由主设备控制。

设计中通过两块IA4421模块对数据进行无线传输,使得数据能够进行相互对比,从而使得实验的准确性得到提高。

系统原理图

 

3.原理框图

 

 

DS18B20和CPU之间的连接采用一总线协议。

IA4421和CPU之间的连接采用SPI总线协议。

4.程序流程图

1ds18b20工作流程图

2IA4421流程图

 

3系统流程图

5附录主程序

主程序代码:

 

#include

 #include 

#include 

#include 

#include 

#include 

#define uint unsigned int 

#define uchar unsigned char  

unsigned  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位序列号 v

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; 

 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 low 

delay_18B20(44); //至少480微秒,leave it low for 501us    

 DQ = 1;          // allow line to return high?

 

    delay_18B20(3);        // wait for presence18b20 36us 

presence = DQ;   // get presence signal           

    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 high       

  if(DQ)         { 

            value|=0x80; } 

        delay_18B20(4); // wait for rest of timeslot 

     return(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 timeslot        

 j++;         

  /*延时4us*/       

  DQ = val&0x01; 

   delay_18B20(8); // hold value for remainder of timeslot     

 DQ = 1;       

  j++; 

   val>>=1;   

   }  

//============读取温度============

 void Read_Temperature(void) 

    int k,i; 

int temple; /*存放读取的温度值 将其除以16即为得到的值*/     

ow_reset(); 

    k++;              //延时4us 

write_byte(0xCC); //Sk_nop_();ip ROM     

k++;              //延时4us    

write_byte(0xBE); // read register   

  k++;k++;          //延时8us 

temp[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;   //如果为负温则去除其补码  

   else  

   { 

        temple=i; 

    } 

//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, 

/**************读取ds18b20当前温度************/ 

unsigned char ReadTemperature(void) 

{ unsigned char tt[2];  Init_DS18B20(); 

 WriteOneChar(0xCC);     // 跳过读序号列号的操作 

 WriteOneChar(0x4E);//写入"写暂存器"命令                 

 WriteOneChar(RS);  //写配置寄存器,格式为0 R1 R0 1,1 1 1 1 

 delay_18B20(80);       // this message is wery important 

 Init_DS18B20(); 

 WriteOneChar(0xCC);     // 跳过读序号列号的操作  

WriteOneChar(0x44);  // 启动温度转换 

 delay_18B20(80);       // this message is wery important  

Init_DS18B20(); 

 WriteOneChar(0xCC);  //跳过读序列号的操作 

 WriteOneChar(0xBE);  //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 

 delay_18B20(80); 

 tt[0]=ReadOneChar();     //读取温度值低位 

 tt[1]=ReadOneChar();     //读取温度值高位 

 T=((tt[0]&0xf0)>>4)|((tt[1]&0x0f)<<4)  

 return(T); 

}

 }

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高中教育 > 高考

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1