|
臨近畢業(yè),有朋友找我?guī)兔ψ鰝(gè)無線溫度變送器,想到大學(xué)四年就這么過去了,到最后其實(shí)沒學(xué)到什么真正的看家手段,有些遺憾,但是做點(diǎn)簡單的制作還是沒有問題的。于是就動(dòng)手,順便發(fā)個(gè)帖。
系統(tǒng)的功能是,利用pt100熱電阻采集溫度數(shù)據(jù),利用電阻電橋來獲取準(zhǔn)確的電壓值,利用AD轉(zhuǎn)換芯片tlc549進(jìn)行AD轉(zhuǎn)換,然后將采集的溫度數(shù)據(jù)通過ZigBee模塊發(fā)送到主機(jī)部分,利用LCD1602顯示,這里我是每分鐘對發(fā)送數(shù)據(jù)存儲(chǔ)一次,一個(gè)小時(shí)更新一次,也可以選擇片外存儲(chǔ)器,能夠容納更多的數(shù)據(jù)。
制作出來的實(shí)物圖如下:
IMG_20180612_180452.jpg (4.64 MB, 下載次數(shù): 76)
下載附件
無線溫度數(shù)據(jù)傳輸
2018-6-29 10:21 上傳
IMG_20180612_161207.jpg (4.88 MB, 下載次數(shù): 82)
下載附件
溫度測試
2018-6-29 10:22 上傳
IMG_20180612_164333.jpg (4.76 MB, 下載次數(shù): 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時(shí)鐘
- sbit DAT=P0^1; //tlc549數(shù)據(jù)
- uchar bdata ADCdata;
- sbit ADbit=ADCdata^0; //定義可為選址變量
- uchar n,AD_DATA;
- uchar temper[3]; //一次溫度存儲(chǔ)數(shù)組
- uchar Data_start[]={0xFE,0X08,0x91,0x90,0xBB,0x37};
- uchar Data_end[]={0xFF};
- /*·····················1毫秒延時(shí)函數(shù)···························*/
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- /************************讀取溫度電壓函數(shù)*********************************/
- 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轉(zhuǎn)換
- CLK=0;
- // Delay_MS(5);
- _nop_(); _nop_();_nop_();
- }
- return (ADCdata);
- }
- /*························串口發(fā)送初始化函數(shù)·····················*/
- void InitUART(void)
- {
- SCON=0x50; //串口工作方式1,8位UART,波特率可變
- TH2=0xFF;
- TL2=0xFD; //波特率:115200 晶振=11.0592MHz
- RCAP2H=0xFF;
- RCAP2L=0xFD; //16位自動(dòng)再裝入值
- TCLK=1;
- RCLK=1;
- C_T2=0;
- EXEN2=0; //波特率發(fā)生器工作方式
- /*****************/
- TR2=1 ; //定時(shí)器2開始
- ES=1;
- EA=1;
-
- }
- /****************串行口1發(fā)送****************/
- void UART_1SendOneByte(unsigned char c)
- {
- if(c=='\n') //如果遇到\n就換行
- {
- //發(fā)送CR(carriage return)
- SBUF=0x0D;
- while(!TI); //等待發(fā)送完成
- TI=0;
-
- //發(fā)送 LF(NL line feed,new line)
- SBUF=0x0A;
- while(!TI); //等待發(fā)送完成
- TI=0;
- }
- else
- {
- SBUF=c;
- while(!TI); //等待發(fā)送完成
- TI=0;
- }
- }
- /*·································溫度電壓值發(fā)送函數(shù)·························································*/
- 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;
- }
- /*································主函數(shù)··············································*/
- void main()
- {
- InitUART(); //串行口初始化
- while(1)
- {
-
- AD_DATA=TLC549ADC(); //讀取當(dāng)前電壓值A(chǔ)/D轉(zhuǎn)換數(shù)據(jù)
- send(); //數(shù)據(jù)發(fā)送
-
- for(n=10;n>0;n--) //10秒發(fā)送延時(shí)
- {
- delay(1000);
- }
- }
- }
- 下面是主機(jī)部分程序。
- #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: "; //當(dāng)前溫度顯示
- uchar code table1[]="P_temper: "; //上一時(shí)刻溫度顯示
- uchar temper[10],temper1[10]; //顯示溫度數(shù)據(jù)臨時(shí)存放
- uchar num1=0,flag=0,dat[70]; //計(jì)數(shù)值,按鍵標(biāo)志位,歷史數(shù)據(jù)存儲(chǔ)數(shù)組
- uint time,AD_value,flag2,rev; //每分鐘計(jì)數(shù)
- uint temp1=0,temp2=0,count1=0;
- uchar Receive_Buff1[12]; //接受數(shù)據(jù)緩存數(shù)組
- 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);
- }
- /*························串口發(fā)送初始化函數(shù)·····················*/
- void InitUART(void)
- {
- SCON=0x50; //串口工作方式1,8位UART,波特率可變
- TH2=0xFF;
- TL2=0xFD; //波特率:115200 晶振=11.0592MHz
- RCAP2H=0xFF;
- RCAP2L=0xFD; //16位自動(dòng)再裝入值
- TCLK=1;
- RCLK=1;
- C_T2=0;
- EXEN2=0; //波特率發(fā)生器工作方式
- /*****************/
- TR2=1 ; //定時(shí)器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;//把熱電阻上的電壓值轉(zhuǎn)為溫度值,加補(bǔ)償
- 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]
- }
- }
- /***************主函數(shù)*****************/
- void main()
- {
- init();
- init_play();//初始化顯示
- InitUART(); //串行口初始化
- init_count();//初始化定時(shí)器
- while(1)
- {
- key_scan();
-
- AD_to_temper();
- if(time>=6000)
- {
- beep=0;
- time=0;
- temp2++;
- dat[temp2]=temp1;
- if(temp2>70)temp2=0;
- }
- }
- }
- /************串行口1中斷處理函數(shù)*************/
- 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++;
- }
復(fù)制代碼
|
|