LCD12864液晶顯示的SHT11溫溼度傳感器程序

2021-01-10 電子產品世界
注意:低版本的keil軟體不能編譯成功,因為無法處理浮點運算。

#include

#include

#define uint unsigned int

#define uchar unsigned char

#define noACK 0

#define ACK 1

#define STATUS_REG_W 0x06

#define STATUS_REG_R 0x07

#define MEASURE_TEMP 0x03

#define MEASURE_HUMI 0x05

#define RESET 0x1e

enum {TEMP,HUMI};

typedef union //定義共用同類型

{

unsigned int i;

float f;

} value;

sbit lcdrs=P2^0;

sbit lcdrw=P2^1;

sbit lcden=P2^2;

sbit SCK = P1^0;

sbit DATA = P1^1;

uchar table2[]="SHT11 溫溼度檢測";

uchar table3[]="溫度為: ℃";

uchar table4[]="溼度為:";

uchar table5[]=".";

uchar wendu[6];

uchar shidu[6];

void delay(int z)

{

int x,y;

for(x=z;x>0;x--)

for(y=125;y>0;y--);

}

void delay_50us(uint t)

{

uint j;

for(;t>0;t--)

for(j=19;j>0;j--);

}

void delay_50ms(uint t)

{

uint j;

for(;t>0;t--)

for(j=6245;j>0;j--);

}

void write_12864com(uchar com)

{

lcdrs=0;

lcdrw=0;

delay_50us(1);

P0=com;

lcden=1;

delay_50us(10);

lcden=0;

delay_50us(2);

}

void write_dat(uchar dat)

{

lcdrs=1;

lcdrw=0;

delay_50us(1);

P0=dat;

lcden=1;

delay_50us(10);

lcden=0;

delay_50us(2);

}

void init12864lcd(void)

{

delay_50ms(2);

write_12864com(0x30);

delay_50us(4);

write_12864com(0x30);

delay_50us(4);

write_12864com(0x0f);

delay_50us(4);

write_12864com(0x01);

delay_50us(240);

write_12864com(0x06);

delay_50us(10);

write_12864com(0x0c);

delay_50us(10);

}

void display1(void)

{

uchar i;

write_12864com(0x80);

for(i=0;i<18;i++)

{

write_dat(table2[i]);

delay_50us(1);

}

}

void display2(void)

{

uchar i;

write_12864com(0x90);

for(i=0;i<18;i++)

{

write_dat(table3[i]);

delay_50us(1);

}

}

void display3(void)

{

uchar i;

write_12864com(0x88);

for(i=0;i<8;i++)

{

write_dat(table4[i]);

delay_50us(1);

}

}

void displaywendu(void)

{

uchar i;

write_12864com(0x94);

for(i=0;i<3;i++)

{

write_dat(wendu[i]);

delay_50us(1);

}

for(i=0;i<1;i++)

{

write_dat(table5[i]);

delay_50us(1);

}

for(i=4;i<5;i++)

{

write_dat(wendu[i]);

delay_50us(1);

}

}

void displayshidu(void)

{

uchar i;

write_12864com(0x8C);

for(i=0;i<3;i++)

{

write_dat(shidu[i]);

delay_50us(1);

}

for(i=0;i<1;i++)

{

write_dat(table5[i]);

delay_50us(1);

}

for(i=4;i<5;i++)

{

write_dat(shidu[i]);

delay_50us(1);

}

}

//寫字節程序

char s_write_byte(unsigned char value)

{

unsigned char i,error=0;

for (i=0x80;i>0;i>>=1) //高位為1,循環右移

{

if (i&value) DATA=1; //和要發送的數相與,結果為發送的位

else DATA=0;

SCK=1;

_nop_();_nop_();_nop_(); //延時3us

SCK=0;

}

DATA=1; //釋放數據線

SCK=1;

error=DATA; //檢查應答信號,確認通訊正常

_nop_();_nop_();_nop_();

SCK=0;

DATA=1;

return error; //error=1 通訊錯誤

}

//讀字節程序

char s_read_byte(unsigned char ack)

{

unsigned char i,val=0;

DATA=1; //釋放數據線

for(i=0x80;i>0;i>>=1) //高位為1,循環右移

{

SCK=1;

if(DATA) val=(val|i); //讀一位數據線的值

SCK=0;

}

DATA=!ack; //如果是校驗,讀取完後結束通訊;

SCK=1;

_nop_();_nop_();_nop_(); //延時3us

SCK=0;

_nop_();_nop_();_nop_();

DATA=1; //釋放數據線

return val;

}

//啟動傳輸

void s_transstart(void)

{

DATA=1; SCK=0; //準備

_nop_();

SCK=1;

_nop_();

DATA=0;

_nop_();

SCK=0;

_nop_();_nop_();_nop_();

SCK=1;

_nop_();

DATA=1;

_nop_();

SCK=0;

}

//連接復位

void s_connectionreset(void)

{

unsigned char i;

DATA=1; SCK=0; //準備

for(i=0;i<9;i++) //DATA保持高,SCK時鐘觸發9次,發送啟動傳輸,通迅即復位

{

SCK=1;

SCK=0;

}

s_transstart(); //啟動傳輸

}

//軟復位程序

char s_softreset(void)

{

unsigned char error=0;

s_connectionreset(); //啟動連接復位

error+=s_write_byte(RESET); //發送復位命令

return error; //error=1 通訊錯誤

}

//溫溼度測量

char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)

{

unsigned error=0;

unsigned int i;

s_transstart(); //啟動傳輸

switch(mode) //選擇發送命令

{

case TEMP : error+=s_write_byte(MEASURE_TEMP); break; //測量溫度

case HUMI : error+=s_write_byte(MEASURE_HUMI); break; //測量溼度

default : break;

}

for (i=0;i<65535;i++) if(DATA==0) break; //等待測量結束

if(DATA) error+=1; // 如果長時間數據線沒有拉低,說明測量錯誤

*(p_value) =s_read_byte(ACK); //讀第一個字節,高字節 (MSB)

*(p_value+1)=s_read_byte(ACK); //讀第二個字節,低字節 (LSB)

*p_checksum =s_read_byte(noACK); //read CRC校驗碼

return error; // error=1 通訊錯誤

}

//溫溼度值標度變換及溫度補償

void calc_sth10(float *p_humidity ,float *p_temperature)

{

const float C1=-4.0; // 12位溼度精度 修正公式

const float C2=+0.0405; // 12位溼度精度修正公式

const float C3=-0.0000028; // 12位溼度精度修正公式

const float T1=+0.01; // 14位溫度精度 5V條件 修正公式

const float T2=+0.00008; // 14位溫度精度 5V條件 修正公式

float rh=*p_humidity; // rh: 12位 溼度

float t=*p_temperature; // t: 14位溫度

float rh_lin; // rh_lin: 溼度 linear值

float rh_true; // rh_true: 溼度 ture值

float t_C; // t_C : 溫度 ℃

t_C=t*0.01 - 40; //補償溫度

rh_lin=C3*rh*rh + C2*rh + C1; //相對溼度非線性補償

rh_true=(t_C-25)*(T1+T2*rh)+rh_lin; //相對溼度對於溫度依賴性補償

if(rh_true>100)rh_true=100; //溼度最大修正

if(rh_true<0.1)rh_true=0.1; //溼度最小修正

*p_temperature=t_C; //返回溫度結果

*p_humidity=rh_true; //返回溼度結果

}

void main(void)

{

unsigned int temp,humi;

value humi_val,temp_val; //定義兩個共同體,一個用於溼度,一個用於溫度

unsigned char error; //用於檢驗是否出現錯誤

unsigned char checksum; //CRC

init12864lcd();

display1();

display2();

display3();

s_connectionreset(); //啟動連接復位

while(1)

{

error=0; //初始化error=0,即沒有錯誤

error+=s_measure((unsigned char*)&temp_val.i,&checksum,TEMP); //溫度測量

error+=s_measure((unsigned char*)&humi_val.i,&checksum,HUMI); //溼度測量

if(error!=0) s_connectionreset(); ////如果發生錯誤,系統復位

else

{

humi_val.f=(float)humi_val.i; //轉換為浮點數

temp_val.f=(float)temp_val.i; //轉換為浮點數

calc_sth10(&humi_val.f,&temp_val.f); //修正相對溼度及溫度

temp=temp_val.f*10;

humi=humi_val.f*10;

wendu[0]=temp/1000+0; //溫度百位

wendu[1]=temp00/100+0; //溫度十位

wendu[2]=temp0/10+0; //溫度個位

wendu[3]=0x2E; //小數點

wendu[4]=temp+0; //溫度小數點後第一位

displaywendu();

shidu[0]=humi/1000+0; //溼度百位

shidu[1]=humi00/100+0; //溼度十位

shidu[2]=humi0/10+0; //溼度個位

shidu[3]=0x2E; //小數點

shidu[4]=humi+0; //溼度小數點後第一位

displayshidu();

}

delay(800); //等待足夠長的時間,以現行下一次轉換

}

}

相關焦點

  • 溫溼度傳感器DHT11驅動程序
    一、驅動程序介紹   驅動程序一般指的是設備驅動程序(Device Driver),是一種可以使計算機和設備通信的特殊程序。相當於硬體的接口,作業系統只有通過這個接口,才能控制硬體設備的工作,假如某設備的驅動程序未能正確安裝,便不能正常工作。
  • 如何挑選一款稱心如意的溫溼度傳感器?
    溫溼度傳感器指把空氣中的溫溼度值通過檢測裝置,測量的溫溼度值按一定規律變換成電信號或其他所需形式的信號輸出,用來滿足用戶需求。市場上的溫溼度傳感器一般是測量溫度值和相對溼度值。那麼好用的溫溼度傳感器千千萬萬,如何才能挑到你心儀的溫溼度傳感器呢? 一、選擇溫溼度傳感器的注意事項 1、根據自己的領域確定溫溼度傳感器測量範圍。
  • 掌控全家溫溼度:小米溫溼度傳感器體驗
    然而,小米智能家居之中其實還有一個小配件系列,這一系列之中沒有大型的設備,有的僅僅是一些小小的傳感器。如今,堪稱小米智能配件系列產品中最小的傳感器來到了小編的手上——小米溫溼度傳感器。接下來我們就來看看這款小設備有什麼能耐吧。
  • 基於SHT75溫溼度傳感器的設計與應用
    本系統就是基於SHT75溫溼度傳感器,利用工業乙太網技術,實現對工業現場的溫溼度的遠程監測。溫溼度測量的系統設計  在工業現場中使用溫溼度傳感器,為了達到遠程監測的目的,就少不了與工業乙太網或其它工業現場總線網絡相連,本系統就利用工業乙太網技術,由傳感器SHT75採集工業現場的溫溼度,經過CPU處理,通過工業乙太網進行通信,實現上位機對現場環境溫溼度的數據採集、監測。
  • 溫溼度傳感器在農業上的運用
    打開APP 溫溼度傳感器在農業上的運用 工程師之餘 發表於 2018-09-29 10:17:13 溫度傳感器在大棚中有著非常重要的作用
  • 基於arduino的dht11溫溼度傳感器的使用
    DHT11溫溼度傳感器簡介   DHT11是一款有已校準數位訊號輸出的溫溼度傳感器。 其精度溼度+-5%RH, 溫度+-2℃,量程溼度20-90%RH, 溫度0~50℃。   DHT11數字溫溼度傳感器是一款含有已校準數位訊號輸出的溫溼度複合傳感器,它應用專用的數字模塊採集技術和溫溼度傳感技術,確保產品具有極高的可靠性和卓越的長期穩定性。傳感器包括一個電阻式感溼元件和一個NTC測溫元件,並與一個高性能8位單片機相連接。因此該產品具有品質卓越、超快響應、抗幹擾能力強、性價比極高等優點。每個DHT11傳感器都在極為精確的溼度校驗室中進行校準。
  • 小米溫溼度傳感器竟是FR-4主板,溫溼度傳感器構造一二三
    ,雷軍的米家智能家居也是發展迅速,包括小米新推出的智能溫溼度傳感器,但是當我看到它的傳感器之時,驚訝至極。 外觀來看,小米溫溼度傳感器造型小巧,設計也是明顯的小米風格,可以隨意吸附在牆面、桌椅之上。通過這枚傳感器,用戶可以隨時隨地查看室內溫溼度情況及歷史曲線,其溫度檢測精度達0.3℃,相對溼度檢測精度達3%。
  • 紡織行業如何選擇溫溼度傳感器?
    溫溼度傳感器的作用是什麼? 溫溼度傳感器多以溫溼度一體式的探頭作為測溫元件,將溫度和溼度信號採集出來,按一定規律變換成電信號或其他所需形式的信號輸出,用來滿足用戶需求。 通過安裝溫溼度傳感器能夠有效保障車間內的溫溼度,繼而穩定紡織材料質量。
  • 小米溫溼度傳感器拆解
    外觀來看,小米溫溼度傳感器造型小巧,設計也是明顯的小米風格,可以隨意吸附在牆面、桌椅之上。通過這枚傳感器,用戶可以隨時隨地查看室內溫溼度情況及歷史曲線,其溫度檢測精度達0.3℃,相對溼度檢測精度達3%。小米溫溼度傳感器還支持異常提醒,當溫溼度偏離舒適範圍時,APP會及時收到信息推送。
  • 關於溫溼度傳感器在實驗室環境調控中的應用
    化學實驗室中試劑、儀器的儲存和各項化學實驗的進行,也都會不同程度受到溫溼度的影響。因此,在實驗室投入使用後,實時對環境溫溼度監測就十分有必要。 實驗室溫溼度控制要求 環境條件溫溼度的控制方面考慮的要素就是保證實驗操作的環境溫溼度是能夠滿足實驗程序各個過程的需要。下面我們將從各項工作對環境溫溼度的需求、溫溼度傳感器的選擇以及如何根據設備制定監測方案等幾個方面進行展開。
  • 溫溼度傳感器的四種數據傳輸方式
    導讀 過去幾十年以來,傳感器行業發生了天翻地覆的變化,科技和物聯網的進步導致我們傳遞數據的方式也變的更加多種多樣,各類傳感器不僅能夠實時監測數據,還可以根據相應的使用場景選擇不同的數據傳輸方式上傳至雲平臺
  • 大榕樹溫溼度監控系統介紹
    機房的溫溼度作為計算機設備正常運行的必要條件,我們必須在機房的合理位置安裝溫溼度變送器,以實現對溫度、溼度進行24小時實時監測,接下來了解下大榕樹機房動力環境監控系統與溫溼度變送器是如何實現監控的。(1)溫溼度監控系統界面(2)監控內容對於機房內各種昂貴的電子設備,其正常運行對環境溫溼度有較高的要求。
  • 溫溼度傳感器等在智能家居環境監測中的應用
    在物聯網時代,傳感器的重要性是不言而喻,各類傳感器在不同領域都有著極為重要的應用。如在智能家居領域,現代人們追求高品質舒適生活,對於所處環境要求進一步提升,以環境監測為主的智能家居設備廣受追捧。這時候,PM2.5傳感器、溫溼度傳感器便得到了廣泛應用。
  • 溫溼度傳感器發展現狀及前景分析
    溫溼度傳感器發展早期由於技術的限制,傳感器不能同時實現測量溫度和溼度兩個功能,所以為了測溫度和溼度兩個重要參數,不得不同時來使用溫度傳感器和溼度傳感器。幾年前,國外溫溼度傳感器就已經達到巔峰水平了,然而我國卻因為科技的制約,只能進口溫溼度傳感器來彌補溫溼度監控系統中的不足。但是進口設備擁有很多的局限性,且性價比也並不高。
  • 有溫度,有溼度,有尺度,青萍溫溼度傳感器M版
    像最近北方乾燥,當溼度一低於40%就開啟了加溼器,而中午漸熱,達到25℃就打開了電風扇。是的,這麼舒適愜意的生活,簡直是科技之光,懶人之福!而支持對電風扇和加溼器達成聯動的就是我今天要給大家安利的這款青萍溫溼度傳感器M版啦。青萍溫溼度傳感器M版其實一開始我家裡用的就是超市買的那種最為質樸的溫溼度計。
  • 【成員新品】綠米Aqara人體傳感器、溫溼度傳感器正式開售
    識別圖中二維碼,在線報名綠米近日發布新品——Aqara人體傳感器和溫溼度傳感器。
  • 溫溼度傳感器推進「智能大棚」的建設
    導讀 溫溼度傳感器(LNHJ-WS),是一款無線智能溫溼度監控器,主要用於監測環境裡的溫溼度變化值。
  • 智能溫溼度傳感器到底好在哪裡呢
    ,機房、工業、農業、倉儲等都離不開溫溼度管理,特別是在實時記錄溫溼度變化的工作中廣泛,溫溼度傳感器可以根據所記錄的數據,對各個不同的領域進行科學有效的分析、管理。  隨著傳感器技術的日漸成熟及社會的發展,信息技術、工業、農業等行業對智能化水平的需求也不斷提高,為了提升這些行業使用過程中的智能化,工業級溫溼度傳感器也越來越被廣泛用於各個行業,各行各業對於工業溫溼度傳感器的使用也越來越規模化。  溫溼度傳感器(LNHJ-WS),是一款無線智能溫溼度監控器,主要用於監測環境裡的溫溼度變化值。
  • 小米溫溼度傳感器拆解:簡單得不可思議
    上月,小米帶來了一個全新的智能硬體產品小米溫溼度傳感器。外觀來看,小米溫溼度傳感器造型小巧,設計也是明顯的小米風格,可以隨意吸附在牆面、桌椅之上。
  • 高精度無線溫溼度傳感器應用在那些方面
    高精度無線溫溼度傳感器應用在那些方面 金鴿科技 發表於 2020-05-28 16:28:23 無線溫溼度傳感器的概述: 無線溫溼度傳感器的特點及應用領域,溫溼度傳感器是一款可以將採集到的溫溼度數據