找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4522|回復: 2
收起左側(cè)

基于ZigBee的無線溫度變送器

[復制鏈接]
ID:81961 發(fā)表于 2018-6-29 10:23 | 顯示全部樓層 |閱讀模式
臨近畢業(yè),有朋友找我?guī)兔ψ鰝無線溫度變送器,想到大學四年就這么過去了,到最后其實沒學到什么真正的看家手段,有些遺憾,但是做點簡單的制作還是沒有問題的。于是就動手,順便發(fā)個帖。
系統(tǒng)的功能是,利用pt100熱電阻采集溫度數(shù)據(jù),利用電阻電橋來獲取準確的電壓值,利用AD轉(zhuǎn)換芯片tlc549進行AD轉(zhuǎn)換,然后將采集的溫度數(shù)據(jù)通過ZigBee模塊發(fā)送到主機部分,利用LCD1602顯示,這里我是每分鐘對發(fā)送數(shù)據(jù)存儲一次,一個小時更新一次,也可以選擇片外存儲器,能夠容納更多的數(shù)據(jù)。

制作出來的實物圖如下:

無線溫度數(shù)據(jù)傳輸

無線溫度數(shù)據(jù)傳輸

溫度測試

溫度測試

整體外觀

整體外觀

看溫度采集部分的程序。
  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數(shù)據(jù)


  8. uchar    bdata ADCdata;
  9. sbit     ADbit=ADCdata^0;        //定義可為選址變量
  10. uchar n,AD_DATA;
  11. uchar temper[3];                  //一次溫度存儲數(shù)組


  12. uchar Data_start[]={0xFE,0X08,0x91,0x90,0xBB,0x37};
  13. uchar Data_end[]={0xFF};
  14. /*·····················1毫秒延時函數(shù)···························*/
  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. /************************讀取溫度電壓函數(shù)*********************************/
  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轉(zhuǎn)換     
  37.         CLK=0;
  38. //                Delay_MS(5);
  39.         _nop_(); _nop_();_nop_();      
  40.     }
  41.     return (ADCdata);
  42. }
  43. /*························串口發(fā)送初始化函數(shù)·····················*/
  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; //波特率發(fā)生器工作方式
  55. /*****************/
  56.     TR2=1 ; //定時器2開始
  57.     ES=1;
  58.     EA=1;
  59.    
  60. }
  61. /****************串行口1發(fā)送****************/
  62. void UART_1SendOneByte(unsigned char c)
  63. {
  64.     if(c=='\n')            //如果遇到\n就換行
  65.     {
  66.                         //發(fā)送CR(carriage return)
  67.         SBUF=0x0D;  
  68.         while(!TI);        //等待發(fā)送完成
  69.         TI=0;
  70.          
  71.                         //發(fā)送 LF(NL line feed,new line)
  72.         SBUF=0x0A;  
  73.         while(!TI);        //等待發(fā)送完成
  74.         TI=0;        
  75.     }
  76.     else
  77.     {
  78.         SBUF=c;
  79.         while(!TI);        //等待發(fā)送完成
  80.         TI=0;
  81.     }
  82. }
  83. /*·································溫度電壓值發(fā)送函數(shù)·························································*/
  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. /*································主函數(shù)··············································*/
  103. void main()
  104. {        
  105.          InitUART(); //串行口初始化
  106.         while(1)
  107.         {
  108.                
  109.                                                 AD_DATA=TLC549ADC();     //讀取當前電壓值A/D轉(zhuǎn)換數(shù)據(jù)   
  110.                         send();                   //數(shù)據(jù)發(fā)送
  111.                
  112.         for(n=10;n>0;n--)                         //10秒發(fā)送延時
  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];             //顯示溫度數(shù)據(jù)臨時存放
  132. uchar  num1=0,flag=0,dat[70];           //計數(shù)值,按鍵標志位,歷史數(shù)據(jù)存儲數(shù)組
  133. uint time,AD_value,flag2,rev;            //每分鐘計數(shù)
  134. uint temp1=0,temp2=0,count1=0;
  135. uchar Receive_Buff1[12];            //接受數(shù)據(jù)緩存數(shù)組


  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. /*························串口發(fā)送初始化函數(shù)·····················*/
  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; //波特率發(fā)生器工作方式
  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;//把熱電阻上的電壓值轉(zhuǎn)為溫度值,加補償
  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. /***************主函數(shù)*****************/
  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中斷處理函數(shù)*************/
  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 發(fā)表于 2018-6-29 22:14 | 顯示全部樓層
自己頂一個
回復

使用道具 舉報

ID:218728 發(fā)表于 2019-4-11 11:19 | 顯示全部樓層
大佬求整個工程
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表