pt100+SHT11測溫仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
微信截圖_20180517100737.png (67.59 KB, 下載次數(shù): 53)
下載附件
2018-5-17 10:07 上傳
0.jpg (95.78 KB, 下載次數(shù): 32)
下載附件
2018-5-17 18:35 上傳
0.png (10.43 KB, 下載次數(shù): 27)
下載附件
2018-5-17 18:35 上傳
0.jpg (39.63 KB, 下載次數(shù): 30)
下載附件
2018-5-17 18:31 上傳
單片機源程序如下:
- #include<reg51.h>
- #include <intrins.h>
- #include <math.h> //Keil library
- #include <stdio.h> //Keil library
- #define unchar unsigned char
- #define unint unsigned int
- #define port P1 //LCD12864的8位數(shù)據(jù)口
- typedef union //定義共同類型
- { unsigned int i; //i表示測量得到的溫濕度數(shù)據(jù)(int 形式保存的數(shù)據(jù))
- unsigned char c;
- float f; //f表示測量得到的溫濕度數(shù)據(jù)(float 形式保存的數(shù)據(jù))
- } value;
- /******************************************12864函數(shù)聲明******************************************/
- void delay_12864(); //延時函數(shù)
- void check_busy(); //檢查是否“忙”
- void write_cmd(unchar cmd); //給LCD12864寫命令。
- void set_page(unchar page); //設(shè)置顯示的“頁”。
- void set_line(unchar line); //設(shè)置顯示的“行”。
- void set_column(unchar column); //設(shè)置顯示的“列”。
- void write_data(unchar dat); //寫數(shù)據(jù)。
- void set_onoff(unchar onoff); //開關(guān)屏幕函數(shù)。
- void select_screen(unchar screen); //選擇屏幕函數(shù)。
- void clear_screen(unchar screen); //清屏函數(shù)。
- void initial(); //初始化LCD 12864
- void hz_LCDDisp16(unchar page,unchar column, unchar code *hzk,unchar num); //顯示函數(shù)。
- void print_SHT11_temp(); //顯示輸出SHT11的溫度
- void print_SHT11_humi(); //顯示輸出SHT11的濕度
- void print_PT100_temp(); //顯示輸出PT100的溫度
- void delay(int z); //z為毫秒數(shù)延時
- /*******************************12864的端口定義、文字庫**********************************/
- //首先要選擇“讀,寫”是對與誰。以人來說,讀是LCD12864來讀取人的指令或數(shù)據(jù)。寫是給人寫。
- sbit rs=P2^0; //rs=1時,為讀寫數(shù)據(jù)。rs=0時,為讀寫指令。
- sbit rw=P2^1; //rw=1時,為讀數(shù)據(jù)(指令)。rw=0時,為寫數(shù)據(jù)(指令)。(以人來說。)
- sbit en=P2^2; //使能信號。
- sbit cs1=P2^3; //片選信號,0時選中左半屏。
- sbit cs2=P2^4; //片選信號,0時選中右半屏。
- char code hz_wen[]= //溫
- {
- 0x10,0x60,0x02,0x8C,0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,
- 0x04,0x04,0x7E,0x01,0x40,0x7E,0x42,0x42,0x7E,0x42,0x7E,0x42,0x42,0x7E,0x40,0x00
- }; //度
- char code hz_du[]=
- {
- 0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0x25,0x26,0x24,0xFC,0x24,0x24,0x24,0x04,0x00,
- 0x40,0x30,0x8F,0x80,0x84,0x4C,0x55,0x25,0x25,0x25,0x55,0x4C,0x80,0x80,0x80,0x00
- };
- char code hz_shi[]= //濕
- {
- 0x10,0x60,0x02,0x8C,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,
- 0x04,0x04,0x7E,0x01,0x44,0x48,0x50,0x7F,0x40,0x40,0x7F,0x50,0x48,0x44,0x40,0x00
- };
- char code maohao[]= //:
- {
- 0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00
- };
- char code dian[]= //.
- {
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00
- };
- char code wenduhao[]= //℃
- {
- 0x06,0x09,0x09,0xE6,0xF8,0x0C,0x04,0x02,0x02,0x02,0x02,0x02,0x04,0x1E,0x00,0x00,
- 0x00,0x00,0x00,0x07,0x1F,0x30,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x10,0x00,0x00
- };
- char code baifenhao[]= //%
- {
- 0xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00
- };
- char code fuhao[]= //- 負號
- {
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01
- };
- char code kongbai[]= //空白
- {
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
- };
- char code zero[]= //0
- {
- 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00
- };
- char code one[]= //1
- {
- 0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00
- };
- char code two[]= //2
- {
- 0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00
- };
- char code there[]= //3
- {
- 0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00
- };
- char code four[]= //4
- {
- 0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00
- };
- char code five[]= //5
- {
- 0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00
- };
- char code six[]= //6
- {
- 0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00
- };
- char code seven[]= //7
- {
- 0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00
- };
- char code eight[]= //8
- {
- 0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00
- };
- char code nine[]= //9
- {
- 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00
- };
- /******************************************PCF8591函數(shù)聲明******************************************/
- void delay_6us(); //6us延遲函數(shù)
- void pcf8591_start(); //啟動信號函數(shù)
- void pcf8591_stop(); //停止信號函數(shù)
- void pcf8591_ack(); //應答信號函數(shù)
- void pcf8591_noack(); //非應答信號函數(shù)
- void pcf8591_write(unchar cmd); //單片機給pcf8591發(fā)送指令數(shù)據(jù)。
- char pcf8591_read(); //單片機讀取pcf8591發(fā)來的數(shù)據(jù)
- void pcf8591_process(); //pcf8591把模擬量轉(zhuǎn)換成數(shù)字量并進行顯示
- /******************************************PCF8591定義**********************************************/
- sbit scl_pcf8591=P2^6;
- sbit sda_pcf8591=P2^7;
- unsigned char pt100_temp[4];
- /******************************************SHT11函數(shù)聲明******************************************/
- void sht11_delay(); //SHT11延遲函數(shù)
- void sht11_start(); //SHT11的啟動傳輸函數(shù)
- char sht11_read(unchar ack) ; //單片機讀取SHT11發(fā)來的數(shù)據(jù)
- char sht11_write(unchar cmd); //單片機給SHT11發(fā)送指令數(shù)據(jù)。
- void sht11_restart(); //SHT11“通信復位”
- char s_measure(unsigned char *p_value, unsigned char mode);//SHT11溫濕度測量
- void zhuanhuan_sth11(float *p_shidu ,float *p_wendu); //溫濕度值轉(zhuǎn)換及修正
- void sht11_process(); //SHT11數(shù)據(jù)處理及顯示
- /******************************************SHT11定義**********************************************/
- #define ACK 0 //結(jié)束數(shù)據(jù)傳輸;
- #define NoACK 1 //繼續(xù)通信
- //地址 命令 讀/寫
- #define ce_liang_wendu 0x03 //000 0001 1
- #define ce_liang_shidu 0x05 //000 0010 1
- #define RESET 0x1e //000 1111 0
- sbit sht11_scl=P3^0;
- sbit sht11_sda=P3^1;
- char temp_print[7]; //用于記錄溫度
- unsigned char humi_print[7]; //用于記錄濕度
- /******************************************SHT11程序部分******************************************/
- /*SHT11延遲函數(shù)*/
- void sht11_delay()
- {
- _nop_();
- _nop_();
- _nop_();
- }
- /*SHT11的啟動傳輸函數(shù)*/
- void sht11_start()
- {
- sht11_sda=1; sht11_scl=0; //預先準備好開始。
- sht11_delay();
- sht11_scl=1;
- sht11_delay();
- sht11_sda=0;
- sht11_delay();
- sht11_scl=0;
- sht11_delay();
- sht11_scl=1;
- sht11_delay();
- sht11_sda=1;
- sht11_delay();
- sht11_scl=0;
- }
- /*單片機讀取SHT11發(fā)來的數(shù)據(jù)*/
- char sht11_read(unchar ack)
- {
- unchar i=0,dat=0;
- sht11_sda=1; //釋放數(shù)據(jù)線
- for(i=0x80;i>0;i>>=1) //按位取數(shù)據(jù),從高位開始依次按位取。
- {
- sht11_scl=1;
- if(sht11_sda)
- dat=dat|i; //讀取1位的數(shù)據(jù)值。
- sht11_scl=0;
- }
- sht11_sda=ack; //若讀取完數(shù)據(jù),結(jié)束通信。
- sht11_scl=1; //sht11_sda=ack; sht11_scl=1; sht11_scl=0; 這三句是產(chǎn)生一個應答或非信號。
- sht11_delay();
- sht11_scl=0;
- sht11_delay();
- sht11_sda=1; //釋放數(shù)據(jù)線。
- return dat;
- }
- /*單片機給SHT11發(fā)送指令數(shù)據(jù)。*/
- char sht11_write(unchar cmd)
- {
- unchar i=0,error=0;
- for(i=0x80;i>0;i>>=1) //按位發(fā)數(shù)據(jù),從高位開始依次按位取。
- {
- if(i&cmd) //按位與,發(fā)送數(shù)據(jù)。
- sht11_sda=1;
- else sht11_sda=0;
- sht11_scl=1;
- sht11_delay();
- sht11_scl=0;
- }
- sht11_sda=0; // sht11_sda=0; sht11_scl=1; sht11_scl=0; 這三句是產(chǎn)生一個應答信號。
- sht11_scl=1;
- error=sht11_sda; //檢查通訊是否正常,為0是正常,1為錯誤。
- sht11_delay();
- sht11_scl=0;
- sht11_sda=1; //釋放數(shù)據(jù)線。
- return error;
- }
- /*SHT11“通信復位”*/
- void sht11_restart() //數(shù)據(jù)線保持高,時鐘線產(chǎn)生9個脈沖。SHT11通信復位。
- {
- unchar i;
- sht11_sda=1; //預先準備。
- sht11_scl=0;
- for(i=0;i<9;i++)
- {
- sht11_scl=1;
- sht11_scl=0;
- }
- sht11_start();//啟動傳輸。
- }
- /*SHT11溫濕度測量*/
- char s_measure(unsigned char *p_value, unsigned char mode)
- {
- unsigned int error=0;
- unsigned int i;
- sht11_start(); //啟動傳輸
- switch(mode) //選擇發(fā)送命令
- {
- case 0 : error+=sht11_write(ce_liang_wendu); break; //測量溫度
- case 1 : error+=sht11_write(ce_liang_shidu); break; //測量濕度
- default: break;
- }
- for (i=0;i<65535;i++) if(sht11_sda==0) break; //等待測量結(jié)束
- if(sht11_sda) error+=1; // 如果長時間數(shù)據(jù)線沒有拉低,說明測量錯誤
- *(p_value) =sht11_read(NoACK); //讀第一個字節(jié),高字節(jié) (MSB)
- *(p_value+1)=sht11_read(NoACK); //讀第二個字節(jié),低字節(jié) (LSB)
- *(p_value+1)=sht11_read(ACK);
- return error; // error=1 通訊錯誤
- }
- /*溫濕度值轉(zhuǎn)換及修正*/
- void zhuanhuan_sth11(float *p_shidu ,float *p_wendu)
- {
- //溫度轉(zhuǎn)換、修正的系數(shù)值、常量值。
- const float C1=-4.0;
- const float C2=+0.0405;
- const float C3=-0.0000028;
- const float T1=+0.01;
- const float T2=+0.00008;
- //定義一些溫濕度相關(guān)變量。
- float RH=*p_shidu; // 取出SHT11測量的12位濕度值
- float T=*p_wendu; // 取出SHT11測量的14位溫度值
- float RH_xiangdui; // 相對濕度
- float T_C; // 轉(zhuǎn)換后的溫度
- //溫濕度轉(zhuǎn)換、修正公式。
- T_C=T*0.01 - 40; //溫度轉(zhuǎn)換
- RH_xiangdui=C3*RH*RH + C2*RH + C1; //相對濕度修正
- //返回轉(zhuǎn)換、修正后的值。
- *p_wendu=T_C; //返回溫度結(jié)果
- *p_shidu=RH_xiangdui; //返回濕度結(jié)果
- }
- /*SHT11數(shù)據(jù)處理及顯示*/
- void sht11_process()
- {
- int temp;
- unint humi;
- value humi_val,temp_val; //定義兩個共同體,一個用于濕度,一個用于溫度
- unchar error,wendu=0,shidu=1; //用于檢驗是否出現(xiàn)錯誤
- error=0; //初始化error=0,即沒有錯誤
- error+=s_measure(( char*)&temp_val.i,wendu); //溫度測量
- error+=s_measure((unsigned char*)&humi_val.i,shidu); //濕度測量
- if(error!=0) //如果發(fā)生錯誤,系統(tǒng)復位
- sht11_restart();
- else
- {
- humi_val.f=(float)humi_val.i; //轉(zhuǎn)換為浮點數(shù)
- temp_val.f=(float)temp_val.i; //轉(zhuǎn)換為浮點數(shù)
- zhuanhuan_sth11(&humi_val.f,&temp_val.f); //修正相對濕度及溫度
- temp=temp_val.f*10;
- humi=humi_val.f*10;
-
- temp_print[0]=temp/1000; //溫度百位
- temp_print[1]=temp%1000/100; //溫度十位
- temp_print[2]=temp%1000%100/10; //溫度個位
- temp_print[3]=10; //小數(shù)點
- temp_print[4]=temp%10; //溫度小數(shù)點后第一位
- temp_print[5]=11; //顯示溫度符號℃
- print_SHT11_temp(); //輸出溫度
-
- humi_print[0]=humi/1000; //濕度百位
- humi_print[1]=humi%1000/100; //濕度十位
- humi_print[2]=humi%1000%100/10; //濕度個位
- humi_print[3]=10; //小數(shù)點
- humi_print[4]=humi%10; //濕度小數(shù)點后第一位
- humi_print[5]=11;
- if(humi_print[0]==1) //如果濕度到100則顯示99.9
- {
- humi_print[0]=0;
- humi_print[1]=9;
- humi_print[2]=9;
- humi_print[4]=9;
- }
- print_SHT11_humi(); //輸出濕度
- }
- delay(800); //等待足夠長的時間,以進行下一次轉(zhuǎn)換
- }
- /******************************************PCF8591程序部分******************************************/
- /*6us延遲函數(shù)*/
- void delay_6us()
- {
- _nop_();_nop_();_nop_();
- _nop_();_nop_();_nop_();
- }
- /*啟動信號函數(shù)*/
- void pcf8591_start()
- {
- sda_pcf8591=1;
- delay_6us();
- scl_pcf8591=1;
- delay_6us();
- sda_pcf8591=0; //這時候 啟動開始。
- delay_6us();
- scl_pcf8591=0;
- }
- /*停止信號函數(shù)*/
- void pcf8591_stop()
- {
- sda_pcf8591=0;
- delay_6us();
- scl_pcf8591=1;
- delay_6us();
- sda_pcf8591=1;
- delay_6us();
- }
- /*應答信號函數(shù)*/
- void pcf8591_ack()
- {
- sda_pcf8591=0;
- delay_6us();
- scl_pcf8591=1;
- delay_6us();
- scl_pcf8591=0;
- delay_6us();
- }
- /*非應答信號函數(shù)*/
- void pcf8591_noack()
- {
- sda_pcf8591=1;
- scl_pcf8591=1;
- delay_6us();
- scl_pcf8591=0;
- }
- /*單片機給pcf8591發(fā)送指令數(shù)據(jù)。*/
- void pcf8591_write(unchar cmd)
- {
- unchar i=0,error=0;
- for(i=0x80;i>0;i>>=1) //按位發(fā)數(shù)據(jù),從高位開始依次按位取。
- {
- if(i&cmd) //按位與,發(fā)送數(shù)據(jù)。
- sda_pcf8591=1;
- else sda_pcf8591=0;
- scl_pcf8591=1;
- delay_6us();
- scl_pcf8591=0;
- }
- sda_pcf8591=1; //釋放數(shù)據(jù)線。
- }
- /*單片機讀取pcf8591發(fā)來的數(shù)據(jù)*/
- char pcf8591_read()
- {
- unchar i=0,dat=0;
- sda_pcf8591=1; //釋放數(shù)據(jù)線
- for(i=0x80;i>0;i>>=1) //按位取數(shù)據(jù),從高位開始依次按位取。
- {
- scl_pcf8591=1;
- if(sda_pcf8591)
- dat=dat|i; //讀取1位的數(shù)據(jù)值。
- scl_pcf8591=0;
- }
- sda_pcf8591=1; //釋放數(shù)據(jù)線。
- return dat;
- }
- /*pcf8591把模擬量轉(zhuǎn)換成數(shù)字量并進行顯示*/
- void pcf8591_process()
- { unchar temp;
- value pcf8591_value;
- pcf8591_start();
- pcf8591_write(0x90); //上來必須先發(fā)地址,選擇是什么操作,這里進行寫操作
- pcf8591_ack();
- pcf8591_write(0x00); //輸出模擬量 0通道。
- pcf8591_ack();
-
- pcf8591_start(); //開始進行模數(shù)轉(zhuǎn)換
- pcf8591_write(0x91);
- pcf8591_ack();
- pcf8591_value.c=pcf8591_read();
- pcf8591_noack();
- pcf8591_stop();
-
- if(pcf8591_value.c>0xff)
- {
- pt100_temp[0]=1; //溫度百位
- pt100_temp[1]=0; //溫度十位
- pt100_temp[2]=0; //溫度個位
- pt100_temp[3]=11;
- print_PT100_temp();
- }
-
- if(pcf8591_value.c<=0xff)
- {
- pcf8591_value.f=(float)pcf8591_value.c;
- temp=pcf8591_value.f/2.55+0.5; //加0.5為了四舍五入
- pt100_temp[0]=temp/100; //溫度百位
- pt100_temp[1]=temp%100/10; //溫度十位
- pt100_temp[2]=temp%10; //溫度個位
- pt100_temp[3]=11;
- print_PT100_temp();
- }
- }
- /******************************************12864程序部分********************************************/
- /*延時函數(shù)*/
- void delay_12864()
- {
- unchar i,j;
- for(i=0;i>10;i++)
- for(j=0;j>256;j++);
- }
- /*檢查LCD12864是否“忙”*/
- void check_busy() //檢查LCD12864是否“忙” 數(shù)據(jù)線的最高位DB7為1時則“忙”。
- { //因為每次LCD12864讀指令或者數(shù)據(jù)時候,都要判斷“自己”是否“忙”。
- P1=0x00;
- rs=0; //選擇 指令。
- rw=1; //選擇 (人)讀。
- en=1; //這時LCD12864寫出來一個指令,告訴人,是否“忙”,這個指令從數(shù)據(jù)口出來,也就是給了P1。
- while(P1&0x80); //直到,數(shù)據(jù)線的最高位DB7為0時則“不忙”。
- en=0; //en由1——0,產(chǎn)生一個下降沿,才能鎖存數(shù)據(jù)。
- }
- /*給LCD12864寫命令。*/
- void write_cmd(unchar cmd) //給LCD12864寫命令。
- {
- check_busy(); //檢查“忙不忙”。
- rs=0; //選擇 指令。
- rw=0; //選擇 (人)寫。
- port=cmd; //指令賦給數(shù)據(jù)端。
- en=1; //使能信號。
- delay_12864(); //延時。
- en=0;
- }
- /*設(shè)置顯示的“頁”*/
- void set_page(unchar page) //設(shè)置顯示的“頁”。因為一頁有8行,一共有64行,所以LCD12864有8頁。
- {
- page=0xb8|page; //“頁”的首地址為0xb8。
- write_cmd(page); //把命令給LCD12864。
- }
- /*設(shè)置顯示的“行”*/
- void set_line(unchar line) //設(shè)置顯示的“行”。一般是從第0行開始。
- {
- line=0xc0|line; //第0行的地址為0xc0。
- write_cmd(line); //把命令給LCD12864。
- }
- /*設(shè)置顯示的“列”*/
- void set_column(unchar column) //設(shè)置顯示的“列”。
- {
- column=column&0x3f; //因為一個屏的“列”最多有64列,所以防止越出來。
- column=0x40|column; //“列”的首地址為0x40。
- write_cmd(column); //把命令給LCD12864。
- }
- /*單片機給12864寫數(shù)據(jù)*/
- void write_data(unchar dat) //寫數(shù)據(jù)。
- {
- check_busy(); //檢查“忙不忙”。
- rs=1; //選擇 數(shù)據(jù)。
- rw=0; //選擇 (人)寫。
- port=dat; //數(shù)據(jù)賦給數(shù)據(jù)端。
- en=1;
- delay_12864();
- en=0;
- }
- /*開關(guān)屏幕函數(shù)*/
- void set_onoff(unchar onoff) //開關(guān)屏幕函數(shù)。0x3f是開,0x3e是關(guān)。
- {
- onoff=0x3e|onoff; //選擇開或關(guān)。
- write_cmd(onoff); //把命令給LCD12864。
- }
- /*選擇屏幕函數(shù)*/
- void select_screen(unchar screen) //選擇屏幕函數(shù)。
- {
- switch(screen)
- {
- case 0:cs1=0;cs2=0;break; //選擇全屏。
- case 1:cs1=0;cs2=1;break; //選擇左半屏。
- case 2:cs1=1;cs2=0;break; //選擇右半屏。
- default:break;
- }
- }
- /*清屏函數(shù)*/
- void clear_screen(unchar screen) //清屏函數(shù)。
- {
- unchar p,c;
- select_screen(screen); //選屏幕。
- for(p=0;p<8;p++) //控制“頁”數(shù)。從第0頁開始。每頁每頁進行寫。
- {
- set_page(p);
- set_column(0);
- for(c=0;c<64;c++) //控制“列” 。從第0列開始。每頁最多可寫32個中文文字或64個ASCII字符
- {
- write_data(0x00); //寫入“0”(就是空白)。列地址自動加1。
- }
- }
- }
- /*初始化LCD 12864*/
- void initial() //初始化LCD 12864
- {
- check_busy();
- select_screen(0); //選擇全屏
- set_onoff(0); //關(guān)閉屏幕
- select_screen(0); //選擇全屏
- set_onoff(1); //開啟屏幕
- select_screen(0); //選擇全屏
- clear_screen(0); //清空屏幕
- set_line(0); //從第0行開始
- }
- /*12864顯示函數(shù)*/
- void hz_LCDDisp16(unchar page,unchar column, unchar code *hzk,unchar num) //顯示函數(shù)。
- {
- unchar j=0,i=0;
- for(j=0;j<2;j++)
- {
- write_cmd(0xb8+page+j);
- write_cmd(0x40+column);
- if(num==0)
- {
- for(i=0;i<16;i++)
- write_data(hzk[16*j+i]);
- }
- else
- for(i=0;i<8;i++)
- write_data(hzk[8*j+i]);
- }
- }
- /*12864顯示SHT11輸出的溫度*/
- void print_SHT11_temp() //顯示輸出溫度
- {
- unchar i,j;
- for(i=0;i<6;i++)
- {
- if(i==3)
- {
- j=0;
- }
- if(i<3)
- {
- cs1=0;
- cs2=1;
- if(temp_print[0]==0&&i==0)
- {
- hz_LCDDisp16(0,38,kongbai,1);
- j=8;
- i++;
- }
- if(temp_print[1]==0&&temp_print[0]==0)
- {
- hz_LCDDisp16(0,46,kongbai,1);
- j=16;
- i++;
- }
- if(temp_print[1]<0||temp_print[2]<0)
- {
- temp_print[1]=abs(temp_print[1]);
- temp_print[2]=abs(temp_print[2]);
- temp_print[4]=abs(temp_print[4]);
- hz_LCDDisp16(0,38,fuhao,1);
- }
- switch(temp_print[i])
- {
- case 0:hz_LCDDisp16(0,j+38,zero,1);break;
- case 1:hz_LCDDisp16(0,j+38,one,1);break;
- case 2:hz_LCDDisp16(0,j+38,two,1);break;
- case 3:hz_LCDDisp16(0,j+38,there,1);break;
- case 4:hz_LCDDisp16(0,j+38,four,1);break;
- case 5:hz_LCDDisp16(0,j+38,five,1);break;
- case 6:hz_LCDDisp16(0,j+38,six,1);break;
- case 7:hz_LCDDisp16(0,j+38,seven,1);break;
- case 8:hz_LCDDisp16(0,j+38,eight,1);break;
- case 9:hz_LCDDisp16(0,j+38,nine,1);break;
- case 10:hz_LCDDisp16(0,j+38,dian,1);break;
- }
- }
- else if(i>=3)
- { cs1=1;
- cs2=0;
- switch(temp_print[i])
- {
- case 0:hz_LCDDisp16(0,j,zero,1);break;
- case 1:hz_LCDDisp16(0,j,one,1);break;
- case 2:hz_LCDDisp16(0,j,two,1);break;
- case 3:hz_LCDDisp16(0,j,there,1);break;
- case 4:hz_LCDDisp16(0,j,four,1);break;
- case 5:hz_LCDDisp16(0,j,five,1);break;
- case 6:hz_LCDDisp16(0,j,six,1);break;
- case 7:hz_LCDDisp16(0,j,seven,1);break;
- case 8:hz_LCDDisp16(0,j,eight,1);break;
- case 9:hz_LCDDisp16(0,j,nine,1);break;
- case 10:hz_LCDDisp16(0,j,dian,1);break;
- case 11:hz_LCDDisp16(0,j,wenduhao,0);break;
- }
- }
- j+=8;
- }
- }
- /*12864顯示SHT11輸出的濕度*/
- void print_SHT11_humi()
- {
- unchar i,j;
- for(i=0;i<6;i++)
- {
- if(humi_print[0]==0&&i==0)
- {
- i++;
- j=8;
- }
- if(i==3)
- {
- j=0;
- }
- if(i<3)
- {
- cs1=0;
- cs2=1;
- if(humi_print[0]==0&&i==0)
- {
- hz_LCDDisp16(2,38,kongbai,1);
- j=8;
- i++;
- }
- if(humi_print[1]==0&&humi_print[0]==0)
- {
- hz_LCDDisp16(2,46,kongbai,1);
- j=16;
- i++;
- }
- switch(humi_print[i])
- {
- case 0:hz_LCDDisp16(2,j+38,zero,1);break;
- case 1:hz_LCDDisp16(2,j+38,one,1);break;
- case 2:hz_LCDDisp16(2,j+38,two,1);break;
- case 3:hz_LCDDisp16(2,j+38,there,1);break;
- case 4:hz_LCDDisp16(2,j+38,four,1);break;
- case 5:hz_LCDDisp16(2,j+38,five,1);break;
- case 6:hz_LCDDisp16(2,j+38,six,1);break;
- case 7:hz_LCDDisp16(2,j+38,seven,1);break;
- case 8:hz_LCDDisp16(2,j+38,eight,1);break;
- case 9:hz_LCDDisp16(2,j+38,nine,1);break;
- case 10:hz_LCDDisp16(2,j+38,dian,1);break;
- }
- }
- else if(i>=3)
- { cs1=1;
- cs2=0;
- switch(humi_print[i])
- {
- case 0:hz_LCDDisp16(2,j,zero,1);break;
- case 1:hz_LCDDisp16(2,j,one,1);break;
- case 2:hz_LCDDisp16(2,j,two,1);break;
- case 3:hz_LCDDisp16(2,j,there,1);break;
- case 4:hz_LCDDisp16(2,j,four,1);break;
- case 5:hz_LCDDisp16(2,j,five,1);break;
- case 6:hz_LCDDisp16(2,j,six,1);break;
- case 7:hz_LCDDisp16(2,j,seven,1);break;
- case 8:hz_LCDDisp16(2,j,eight,1);break;
- case 9:hz_LCDDisp16(2,j,nine,1);break;
- case 10:hz_LCDDisp16(2,j,dian,1);break;
- case 11:hz_LCDDisp16(2,j,baifenhao,1);break;
- }
- }
- j+=8;
- }
- }
- /*12864顯示PT100輸出的溫度*/
- void print_PT100_temp()
- {
- unchar i,j=0;
- for(i=0;i<4;i++)
- {
- if(i==3)
- {
- j=0;
- }
- if(i<3)
- {
- cs1=0;
- cs2=1;
- if(pt100_temp[0]==0&&i==0)
- {
- hz_LCDDisp16(6,38,kongbai,1);
- j=8;
- i++;
- }
- if(pt100_temp[1]==0&&pt100_temp[0]==0)
- {
- hz_LCDDisp16(6,46,kongbai,1);
- j=16;
- i++;
- }
- /*
- if(temp_print[1]<0||temp_print[2]<0)
- {
- temp_print[1]=abs(temp_print[1]);
- temp_print[2]=abs(temp_print[2]);
- temp_print[4]=abs(temp_print[4]);
- hz_LCDDisp16(0,38,fuhao,1);
- }
- */
- switch(pt100_temp[i])
- {
- case 0:hz_LCDDisp16(6,j+38,zero,1);break;
- case 1:hz_LCDDisp16(6,j+38,one,1);break;
- case 2:hz_LCDDisp16(6,j+38,two,1);break;
- case 3:hz_LCDDisp16(6,j+38,there,1);break;
- case 4:hz_LCDDisp16(6,j+38,four,1);break;
- case 5:hz_LCDDisp16(6,j+38,five,1);break;
- case 6:hz_LCDDisp16(6,j+38,six,1);break;
- case 7:hz_LCDDisp16(6,j+38,seven,1);break;
- case 8:hz_LCDDisp16(6,j+38,eight,1);break;
- case 9:hz_LCDDisp16(6,j+38,nine,1);break;
- }
- }
- else if(i>=3)
- { cs1=1;
- cs2=0;
- switch(pt100_temp[i])
- {
- case 0:hz_LCDDisp16(6,j,zero,1);break;
- case 1:hz_LCDDisp16(6,j,one,1);break;
- case 2:hz_LCDDisp16(6,j,two,1);break;
- case 3:hz_LCDDisp16(6,j,there,1);break;
- case 4:hz_LCDDisp16(6,j,four,1);break;
- case 5:hz_LCDDisp16(6,j,five,1);break;
- case 6:hz_LCDDisp16(6,j,six,1);break;
- case 7:hz_LCDDisp16(6,j,seven,1);break;
- case 8:hz_LCDDisp16(6,j,eight,1);break;
- case 9:hz_LCDDisp16(6,j,nine,1);break;
- case 11:hz_LCDDisp16(6,j,wenduhao,0);break;
- }
- }
- j+=8;
- }
- }
- /*z為毫秒數(shù)延遲*/
- void delay(int z) //z為毫秒數(shù)
- {
- int x,y;
- for(x=z;x>0;x--)
- for(y=125;y>0;y--);
- }
- /*************************************************************************************************/
- void main()
- {
-
-
- initial(); //初始化。
- clear_screen(0); //清屏。
- cs1=0; //選左半屏。
- cs2=1;
- hz_LCDDisp16(0,0,hz_wen,0); //顯示“溫”字。
- hz_LCDDisp16(0,15,hz_du,0); //顯示“度”字。
- hz_LCDDisp16(0,30,maohao,1); //顯示“:”。
- hz_LCDDisp16(2,0,hz_shi,0); //顯示“濕”字。
- hz_LCDDisp16(2,17,hz_du,0); //顯示“度”字。
- hz_LCDDisp16(2,31,maohao,1); //顯示“:”。
- hz_LCDDisp16(6,0,hz_wen,0); //顯示“溫”字。
- hz_LCDDisp16(6,15,hz_du,0); //顯示“度”字。
- hz_LCDDisp16(6,30,maohao,1); //顯示“:”。
- sht11_restart();
- while(1) //無限循環(huán)。
- {
- sht11_process();
- pcf8591_process();
- }
- }
-
復制代碼
所有資料51hei提供下載:
1111.zip
(131.22 KB, 下載次數(shù): 277)
2018-5-17 10:08 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|