找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3819|回复: 2
收起左侧

基于ZigBee的无线温度变送器

[复制链接]
ID:81961 发表于 2018-6-29 10:23 | 显示全部楼层 |阅读模式
临近毕业,有朋友找我帮忙做个无线温度变送器,想到大学四年就这么过去了,到最后其实没学到什么真正的看家手段,有些遗憾,但是做点简单的制作还是没有问题的。于是就动手,顺便发个帖。
系统的功能是,利用pt100热电阻采集温度数据,利用电阻电桥来获取准确的电压值,利用AD转换芯片tlc549进行AD转换,然后将采集的温度数据通过ZigBee模块发送到主机部分,利用LCD1602显示,这里我是每分钟对发送数据存储一次,一个小时更新一次,也可以选择片外存储器,能够容纳更多的数据。

制作出来的实物图如下:

无线温度数据传输

无线温度数据传输

温度测试

温度测试

整体外观

整体外观

看温度采集部分的程序。
  1. #include <STC89C5xRC.H>
  2. #include <intrins.h>
  3. #define uchar unsigned char  //无符路字符型 宏定义        变量范围0~255
  4. #define uint  unsigned int         //无符路整型 宏定义        变量范围0~65535
  5. sbit CS=P0^0;                //tlc549片选
  6. sbit CLK=P0^2;                //tlc549时钟
  7. sbit DAT=P0^1;                 //tlc549数据


  8. uchar    bdata ADCdata;
  9. sbit     ADbit=ADCdata^0;        //定义可为选址变量
  10. uchar n,AD_DATA;
  11. uchar temper[3];                  //一次温度存储数组


  12. uchar Data_start[]={0xFE,0X08,0x91,0x90,0xBB,0x37};
  13. uchar Data_end[]={0xFF};
  14. /*·····················1毫秒延时函数···························*/
  15. void delay(uint z)
  16. {
  17. uint x,y;
  18. for(x=z;x>0;x--)
  19. for(y=110;y>0;y--);
  20. }
  21. /************************读取温度电压函数*********************************/
  22.         uchar TLC549ADC(void)
  23. {  
  24.     uchar i;
  25.     CS=1;   
  26.     CLK=0;   
  27.     DAT=1;
  28.     CS=0;
  29.     for(i=0;i<8;i++)
  30.     {
  31.         CLK=1;
  32. //                Delay_MS(5);
  33.        _nop_();  _nop_();_nop_();
  34.        _nop_();
  35.        ADbit=DAT;  
  36.        ADCdata<<=1;    //AD转换     
  37.         CLK=0;
  38. //                Delay_MS(5);
  39.         _nop_(); _nop_();_nop_();      
  40.     }
  41.     return (ADCdata);
  42. }
  43. /*························串口发送初始化函数·····················*/
  44. void InitUART(void)
  45. {
  46.            SCON=0x50; //串口工作方式1,8位UART,波特率可变  
  47.      TH2=0xFF;           
  48.      TL2=0xFD;    //波特率:115200 晶振=11.0592MHz
  49.      RCAP2H=0xFF;   
  50.      RCAP2L=0xFD; //16位自动再装入值
  51.                         TCLK=1;   
  52.      RCLK=1;   
  53.      C_T2=0;   
  54.      EXEN2=0; //波特率发生器工作方式
  55. /*****************/
  56.     TR2=1 ; //定时器2开始
  57.     ES=1;
  58.     EA=1;
  59.    
  60. }
  61. /****************串行口1发送****************/
  62. void UART_1SendOneByte(unsigned char c)
  63. {
  64.     if(c=='\n')            //如果遇到\n就换行
  65.     {
  66.                         //发送CR(carriage return)
  67.         SBUF=0x0D;  
  68.         while(!TI);        //等待发送完成
  69.         TI=0;
  70.          
  71.                         //发送 LF(NL line feed,new line)
  72.         SBUF=0x0A;  
  73.         while(!TI);        //等待发送完成
  74.         TI=0;        
  75.     }
  76.     else
  77.     {
  78.         SBUF=c;
  79.         while(!TI);        //等待发送完成
  80.         TI=0;
  81.     }
  82. }
  83. /*·································温度电压值发送函数·························································*/
  84. void send()
  85. {                uchar n;                                
  86.                 temper[0]=AD_DATA/100;
  87.           temper[1]=AD_DATA%100/10;
  88.           temper[2]=AD_DATA%100%10;
  89.         ES=0;
  90.         for(n=0;n<6;n++)
  91.         {
  92.                 UART_1SendOneByte(Data_start[n]);
  93.         }
  94.   UART_1SendOneByte(temper[0]);
  95.         UART_1SendOneByte(temper[1]);
  96.         UART_1SendOneByte(temper[2]);
  97.   UART_1SendOneByte('
  98. );
  99.         UART_1SendOneByte(0xFF);
  100.         ES=1;
  101. }
  102. /*································主函数··············································*/
  103. void main()
  104. {        
  105.          InitUART(); //串行口初始化
  106.         while(1)
  107.         {
  108.                
  109.                                                 AD_DATA=TLC549ADC();     //读取当前电压值A/D转换数据   
  110.                         send();                   //数据发送
  111.                
  112.         for(n=10;n>0;n--)                         //10秒发送延时
  113.                 {
  114.                                                 delay(1000);                     
  115.                 }
  116.         }
  117. }

  118. 下面是主机部分程序。
  119. #include <STC89C5xRC.H>
  120. #include <intrins.h>
  121. #define uchar unsigned char  //无符路字符型 宏定义        变量范围0~255
  122. #define uint  unsigned int         //无符路整型 宏定义        变量范围0~65535


  123. sbit E=P2^5;
  124. sbit RW=P2^6;
  125. sbit RS=P2^7;


  126. sbit key1=P1^1;
  127. sbit key2=P1^2;
  128. sbit beep=P1^3;


  129. uchar code table[] ="C_temper:  ";       //当前温度显示
  130. uchar code table1[]="P_temper:  ";         //上一时刻温度显示
  131. uchar temper[10],temper1[10];             //显示温度数据临时存放
  132. uchar  num1=0,flag=0,dat[70];           //计数值,按键标志位,历史数据存储数组
  133. uint time,AD_value,flag2,rev;            //每分钟计数
  134. uint temp1=0,temp2=0,count1=0;
  135. uchar Receive_Buff1[12];            //接受数据缓存数组


  136. void delay(uint z)
  137. {
  138. uint x,y;
  139. for(x=z;x>0;x--)
  140. for(y=110;y>0;y--);
  141. }
  142. void key_scan()
  143. {
  144.         if(key1==0)
  145.         {
  146.                 delay(1);
  147.                 if(key1==0)
  148.                 {
  149.                         num1++;
  150.                         flag=1;
  151.                         while(!key1);
  152.                 }
  153.         }
  154.         if(key2==0)
  155.         {
  156.                 delay(1);
  157.                 if(key2==0)
  158.                 {
  159.                         num1=0;
  160.                         flag=0;
  161.                         while(!key2);
  162.                 }
  163.         }
  164.         if(num1>100)
  165.                 num1=0;
  166. }
  167. void wr_com(uchar com)
  168. {
  169. RS=0;
  170. RW=0;
  171. P0=com;
  172. delay(5);
  173. E=1;
  174. delay(5);
  175. E=0;
  176. }


  177. void wr_dat(uchar date)
  178. {
  179. RS=1;
  180. P0=date;
  181. delay(5);
  182. E=1;
  183. delay(5);
  184. E=0;
  185. }


  186. void init()
  187. {
  188. E=0;
  189. wr_com(0x38);
  190. wr_com(0x0c);
  191. wr_com(0x06);
  192. wr_com(0x01);
  193. }


  194. void display(unsigned char *p)//显示//
  195. {
  196. while(*p!='\0')
  197. {
  198. wr_dat(*p);
  199. p++;
  200. delay(1);
  201. }
  202. }


  203. void init_play()//初始化显示
  204.   {
  205.     wr_com(0x80);
  206.          display(table);
  207.          wr_com(0xc0);
  208.          display(table1);
  209.          }


  210. /*························串口发送初始化函数·····················*/
  211. void InitUART(void)
  212. {
  213.          SCON=0x50; //串口工作方式1,8位UART,波特率可变  
  214.      TH2=0xFF;           
  215.      TL2=0xFD;    //波特率:115200 晶振=11.0592MHz
  216.      RCAP2H=0xFF;   
  217.      RCAP2L=0xFD; //16位自动再装入值
  218.                         TCLK=1;   
  219.      RCLK=1;   
  220.      C_T2=0;   
  221.      EXEN2=0; //波特率发生器工作方式
  222. /*****************/
  223.     TR2=1 ; //定时器2开始
  224.     ES=1;
  225.    EA=1;
  226. }
  227. void init_count()
  228. {
  229.              TMOD=0x61;
  230.                                 TCON|=0X01;
  231.         TH0=(65536-9216)/256;
  232.         TL0=(65536-9216)%256;
  233.         EA=1;
  234.         ET0=1;
  235.         TR0=1;
  236. }
  237. void AD_to_temper()
  238. { uint i;
  239.         
  240.         temp1=AD_value*100/25.6+32;//把热电阻上的电压值转为温度值,加补偿
  241.         temper[0]=temp1/1000+0x30;
  242.         temper[1]=(temp1/100)%10+0x30;
  243.         temper[2]=(temp1%100)/10+0x30;
  244.         temper[3]='.';
  245.         temper[4]=(temp1%100)%10+0x30;
  246.         temper[5]='C';


  247.         if(flag==0)
  248.                 {
  249.         temper1[0]=rev/1000+0x30;
  250.         temper1[1]=(rev/100)%10+0x30;
  251.         temper1[2]=(rev%100)/10+0x30;
  252.         temper1[3]='.';
  253.         temper1[4]=(rev%100)%10+0x30;
  254.         temper1[5]='C';
  255.                 }
  256.                 if(flag==1)
  257.                 {
  258.         temper1[0]=dat[num1-1]/1000+0x30;
  259.         temper1[1]=(dat[num1-1]/100)%10+0x30;
  260.         temper1[2]=(dat[num1-1]%100)/10+0x30;
  261.         temper1[3]='.';
  262.         temper1[4]=(dat[num1-1]%100)%10+0x30;
  263.         temper1[5]='C';
  264.                 }
  265.         for(i=0;i<6;i++)
  266.         {
  267.                 wr_com(0xca+i);
  268.                 wr_dat(temper1[ i]);        [ i]
  269.         }
  270.         
  271.         for(i=0;i<6;i++)
  272.         {
  273.                 wr_com(0x8a+i);
  274.                 wr_dat(temper[ i]);        [ i]
  275.                 temper1[ i]=temper[ i];[ i][ i]
  276.         }


  277. }
  278. /***************主函数*****************/
  279. void main()
  280. {        
  281.    init();
  282.    init_play();//初始化显示
  283.          InitUART(); //串行口初始化
  284.          init_count();//初始化定时器
  285.         while(1)
  286.         {
  287.                 key_scan();
  288.         
  289.                 AD_to_temper();
  290.                         if(time>=6000)
  291.                 {
  292.                         beep=0;
  293.                         time=0;
  294.                         temp2++;
  295.                         dat[temp2]=temp1;
  296.                         if(temp2>70)temp2=0;
  297.                 }
  298.         }
  299. }
  300. /************串行口1中断处理函数*************/
  301. void UART_1Interrupt(void) interrupt 4
  302. {
  303. if(RI==1)
  304. {
  305.         RI=0;
  306.         ES=0;
  307.         Receive_Buff1[count1++]=SBUF;
  308. if(flag2==2&&SBUF==0xFF)
  309.         {
  310.                 count1=0;
  311.                 AD_value=Receive_Buff1[6]*100+Receive_Buff1[7]*10+Receive_Buff1[8];
  312.                 rev=temp1;
  313.         }
  314.         if(SBUF=='
  315. )
  316.         {
  317.                 flag2=2;
  318.         }
  319.         
  320.         ES=1;
  321. }
  322. }
  323.         void timer0_isr(void) interrupt 1
  324. {
  325.        TH0=(65536-9216)/256;
  326.        TL0=(65536-9216)%256;
  327.                          time++;
  328. }
复制代码

回复

使用道具 举报

ID:81961 发表于 2018-6-29 22:14 | 显示全部楼层
自己顶一个
回复

使用道具 举报

ID:218728 发表于 2019-4-11 11:19 | 显示全部楼层
大佬求整个工程
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表