久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4500|回復: 2
打印 上一主題 下一主題
收起左側

基于ZigBee的無線溫度變送器

[復制鏈接]
跳轉到指定樓層
樓主
臨近畢業,有朋友找我幫忙做個無線溫度變送器,想到大學四年就這么過去了,到最后其實沒學到什么真正的看家手段,有些遺憾,但是做點簡單的制作還是沒有問題的。于是就動手,順便發個帖。
系統的功能是,利用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. }
復制代碼

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:81961 發表于 2018-6-29 22:14 | 只看該作者
自己頂一個
回復

使用道具 舉報

板凳
ID:218728 發表于 2019-4-11 11:19 | 只看該作者
大佬求整個工程
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲www啪成人一区二区麻豆 | 亚洲精品视频观看 | 美女露尿口视频 | 成人精品一区二区户外勾搭野战 | 激情 婷婷 | 国产91亚洲精品一区二区三区 | 日韩不卡三区 | 青青草在线视频免费观看 | 亚洲成人观看 | 国产精品女人久久久 | 成人高清视频在线观看 | 99精品99久久久久久宅男 | 福利在线观看 | 精品欧美一区免费观看α√ | 国产中文字幕网 | 色资源站 | 亚洲精品1| 日本视频在线播放 | 欧美成人免费在线 | 久久福利电影 | 国产一区二区精品在线观看 | 亚洲视屏| 日韩精品在线视频 | 亚洲欧美一区二区在线观看 | jdav视频在线观看免费 | 一区二区三区av | 一区日韩 | 91精品国产综合久久久久久蜜臀 | 二区国产| 伊人精品在线 | 精品久久久久久久久久 | a成人| 亚洲日韩中文字幕 | 日日日操 | 亚洲一区二区三区在线播放 | 日韩免费一二三区 | 黄网免费看| 亚洲精品视频一区 | 岛国av免费在线观看 | 欧美一区2区三区3区公司 | 日本免费一区二区三区四区 |