臨近畢業,有朋友找我幫忙做個無線溫度變送器,想到大學四年就這么過去了,到最后其實沒學到什么真正的看家手段,有些遺憾,但是做點簡單的制作還是沒有問題的。于是就動手,順便發個帖。
系統的功能是,利用pt100熱電阻采集溫度數據,利用電阻電橋來獲取準確的電壓值,利用AD轉換芯片tlc549進行AD轉換,然后將采集的溫度數據通過ZigBee模塊發送到主機部分,利用LCD1602顯示,這里我是每分鐘對發送數據存儲一次,一個小時更新一次,也可以選擇片外存儲器,能夠容納更多的數據。
制作出來的實物圖如下:
IMG_20180612_180452.jpg (4.64 MB, 下載次數: 76)
下載附件
無線溫度數據傳輸
2018-6-29 10:21 上傳
IMG_20180612_161207.jpg (4.88 MB, 下載次數: 82)
下載附件
溫度測試
2018-6-29 10:22 上傳
IMG_20180612_164333.jpg (4.76 MB, 下載次數: 75)
下載附件
整體外觀
2018-6-29 10:22 上傳
看溫度采集部分的程序。
- #include <STC89C5xRC.H>
- #include <intrins.h>
- #define uchar unsigned char //無符路字符型 宏定義 變量范圍0~255
- #define uint unsigned int //無符路整型 宏定義 變量范圍0~65535
- sbit CS=P0^0; //tlc549片選
- sbit CLK=P0^2; //tlc549時鐘
- sbit DAT=P0^1; //tlc549數據
- uchar bdata ADCdata;
- sbit ADbit=ADCdata^0; //定義可為選址變量
- uchar n,AD_DATA;
- uchar temper[3]; //一次溫度存儲數組
- uchar Data_start[]={0xFE,0X08,0x91,0x90,0xBB,0x37};
- uchar Data_end[]={0xFF};
- /*·····················1毫秒延時函數···························*/
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- /************************讀取溫度電壓函數*********************************/
- uchar TLC549ADC(void)
- {
- uchar i;
- CS=1;
- CLK=0;
- DAT=1;
- CS=0;
- for(i=0;i<8;i++)
- {
- CLK=1;
- // Delay_MS(5);
- _nop_(); _nop_();_nop_();
- _nop_();
- ADbit=DAT;
- ADCdata<<=1; //AD轉換
- CLK=0;
- // Delay_MS(5);
- _nop_(); _nop_();_nop_();
- }
- return (ADCdata);
- }
- /*························串口發送初始化函數·····················*/
- void InitUART(void)
- {
- SCON=0x50; //串口工作方式1,8位UART,波特率可變
- TH2=0xFF;
- TL2=0xFD; //波特率:115200 晶振=11.0592MHz
- RCAP2H=0xFF;
- RCAP2L=0xFD; //16位自動再裝入值
- TCLK=1;
- RCLK=1;
- C_T2=0;
- EXEN2=0; //波特率發生器工作方式
- /*****************/
- TR2=1 ; //定時器2開始
- ES=1;
- EA=1;
-
- }
- /****************串行口1發送****************/
- void UART_1SendOneByte(unsigned char c)
- {
- if(c=='\n') //如果遇到\n就換行
- {
- //發送CR(carriage return)
- SBUF=0x0D;
- while(!TI); //等待發送完成
- TI=0;
-
- //發送 LF(NL line feed,new line)
- SBUF=0x0A;
- while(!TI); //等待發送完成
- TI=0;
- }
- else
- {
- SBUF=c;
- while(!TI); //等待發送完成
- TI=0;
- }
- }
- /*·································溫度電壓值發送函數·························································*/
- void send()
- { uchar n;
- temper[0]=AD_DATA/100;
- temper[1]=AD_DATA%100/10;
- temper[2]=AD_DATA%100%10;
- ES=0;
- for(n=0;n<6;n++)
- {
- UART_1SendOneByte(Data_start[n]);
- }
- UART_1SendOneByte(temper[0]);
- UART_1SendOneByte(temper[1]);
- UART_1SendOneByte(temper[2]);
- UART_1SendOneByte('
- );
- UART_1SendOneByte(0xFF);
- ES=1;
- }
- /*································主函數··············································*/
- void main()
- {
- InitUART(); //串行口初始化
- while(1)
- {
-
- AD_DATA=TLC549ADC(); //讀取當前電壓值A/D轉換數據
- send(); //數據發送
-
- for(n=10;n>0;n--) //10秒發送延時
- {
- delay(1000);
- }
- }
- }
- 下面是主機部分程序。
- #include <STC89C5xRC.H>
- #include <intrins.h>
- #define uchar unsigned char //無符路字符型 宏定義 變量范圍0~255
- #define uint unsigned int //無符路整型 宏定義 變量范圍0~65535
- sbit E=P2^5;
- sbit RW=P2^6;
- sbit RS=P2^7;
- sbit key1=P1^1;
- sbit key2=P1^2;
- sbit beep=P1^3;
- uchar code table[] ="C_temper: "; //當前溫度顯示
- uchar code table1[]="P_temper: "; //上一時刻溫度顯示
- uchar temper[10],temper1[10]; //顯示溫度數據臨時存放
- uchar num1=0,flag=0,dat[70]; //計數值,按鍵標志位,歷史數據存儲數組
- uint time,AD_value,flag2,rev; //每分鐘計數
- uint temp1=0,temp2=0,count1=0;
- uchar Receive_Buff1[12]; //接受數據緩存數組
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void key_scan()
- {
- if(key1==0)
- {
- delay(1);
- if(key1==0)
- {
- num1++;
- flag=1;
- while(!key1);
- }
- }
- if(key2==0)
- {
- delay(1);
- if(key2==0)
- {
- num1=0;
- flag=0;
- while(!key2);
- }
- }
- if(num1>100)
- num1=0;
- }
- void wr_com(uchar com)
- {
- RS=0;
- RW=0;
- P0=com;
- delay(5);
- E=1;
- delay(5);
- E=0;
- }
- void wr_dat(uchar date)
- {
- RS=1;
- P0=date;
- delay(5);
- E=1;
- delay(5);
- E=0;
- }
- void init()
- {
- E=0;
- wr_com(0x38);
- wr_com(0x0c);
- wr_com(0x06);
- wr_com(0x01);
- }
- void display(unsigned char *p)//顯示//
- {
- while(*p!='\0')
- {
- wr_dat(*p);
- p++;
- delay(1);
- }
- }
- void init_play()//初始化顯示
- {
- wr_com(0x80);
- display(table);
- wr_com(0xc0);
- display(table1);
- }
- /*························串口發送初始化函數·····················*/
- void InitUART(void)
- {
- SCON=0x50; //串口工作方式1,8位UART,波特率可變
- TH2=0xFF;
- TL2=0xFD; //波特率:115200 晶振=11.0592MHz
- RCAP2H=0xFF;
- RCAP2L=0xFD; //16位自動再裝入值
- TCLK=1;
- RCLK=1;
- C_T2=0;
- EXEN2=0; //波特率發生器工作方式
- /*****************/
- TR2=1 ; //定時器2開始
- ES=1;
- EA=1;
- }
- void init_count()
- {
- TMOD=0x61;
- TCON|=0X01;
- TH0=(65536-9216)/256;
- TL0=(65536-9216)%256;
- EA=1;
- ET0=1;
- TR0=1;
- }
- void AD_to_temper()
- { uint i;
-
- temp1=AD_value*100/25.6+32;//把熱電阻上的電壓值轉為溫度值,加補償
- temper[0]=temp1/1000+0x30;
- temper[1]=(temp1/100)%10+0x30;
- temper[2]=(temp1%100)/10+0x30;
- temper[3]='.';
- temper[4]=(temp1%100)%10+0x30;
- temper[5]='C';
- if(flag==0)
- {
- temper1[0]=rev/1000+0x30;
- temper1[1]=(rev/100)%10+0x30;
- temper1[2]=(rev%100)/10+0x30;
- temper1[3]='.';
- temper1[4]=(rev%100)%10+0x30;
- temper1[5]='C';
- }
- if(flag==1)
- {
- temper1[0]=dat[num1-1]/1000+0x30;
- temper1[1]=(dat[num1-1]/100)%10+0x30;
- temper1[2]=(dat[num1-1]%100)/10+0x30;
- temper1[3]='.';
- temper1[4]=(dat[num1-1]%100)%10+0x30;
- temper1[5]='C';
- }
- for(i=0;i<6;i++)
- {
- wr_com(0xca+i);
- wr_dat(temper1[ i]); [ i]
- }
-
- for(i=0;i<6;i++)
- {
- wr_com(0x8a+i);
- wr_dat(temper[ i]); [ i]
- temper1[ i]=temper[ i];[ i][ i]
- }
- }
- /***************主函數*****************/
- void main()
- {
- init();
- init_play();//初始化顯示
- InitUART(); //串行口初始化
- init_count();//初始化定時器
- while(1)
- {
- key_scan();
-
- AD_to_temper();
- if(time>=6000)
- {
- beep=0;
- time=0;
- temp2++;
- dat[temp2]=temp1;
- if(temp2>70)temp2=0;
- }
- }
- }
- /************串行口1中斷處理函數*************/
- void UART_1Interrupt(void) interrupt 4
- {
- if(RI==1)
- {
- RI=0;
- ES=0;
- Receive_Buff1[count1++]=SBUF;
- if(flag2==2&&SBUF==0xFF)
- {
- count1=0;
- AD_value=Receive_Buff1[6]*100+Receive_Buff1[7]*10+Receive_Buff1[8];
- rev=temp1;
- }
- if(SBUF=='
- )
- {
- flag2=2;
- }
-
- ES=1;
- }
- }
- void timer0_isr(void) interrupt 1
- {
- TH0=(65536-9216)/256;
- TL0=(65536-9216)%256;
- time++;
- }
復制代碼
|