51hei截圖20200107195355.png (50.03 KB, 下載次數: 44)
下載附件
2020-1-7 19:54 上傳
51hei截圖20200107195251.png (87.15 KB, 下載次數: 34)
下載附件
2020-1-7 19:54 上傳
單片機源程序如下:
- #include <reg51.h>
- #include <word.h>
- #include <NumDisplay.h>
- #include <12864.h>
- sbit ds=P3^7; //18b20信號線
- unsigned char data disdata[5];
- unsigned int temp; //定義整形的溫度數據
- float f_temp; //定義浮點型的溫度數據
- unsigned char tflag;//溫度正負標志
- void dsreset(void) //DS18B20初始化函數
- {
- unsigned int i;
- ds=0;
- i=103;
- while(i>0)i--;
- ds=1;
- i=4;
- while(i>0)i--;
- }
- bit tempreadbit(void) //讀1位數據函數
- {
- unsigned int i;
- bit dat;
- ds=0;
- i++;
- ds=1;
- i++;i++;
- dat=ds;
- i=8;while(i>0)i--;
- return(dat);
- }
- unsigned char tempread(void)
- {
- unsigned char i,j,dat;
- dat=0;
- for(i=1;i<=8;i++)
- {
- j=tempreadbit();
- dat=(j<<7)|(dat>>1); //讀出的數據最低位在最前面,這樣剛好一個字節在dat里
- }
- return(dat);
- }
- void tempwritebyte(unsigned char dat)
- {
- unsigned int i;
- unsigned char j;
- bit testb;
- for(j=1;j<=8;j++)
- {
- testb=dat&0x01;
- dat=dat>>1;
- if(testb) //寫1
- {
- ds=0;
- i++;i++;
- ds=1;
- i=8;while(i>0)i--;
- }
- else
- {
- ds=0;
- i=8;while(i>0)i--;
- ds=1;
- i++;i++;
- }
- }
- }
- void tempchange(void) //DS18B20開始獲取溫度并轉換
- {
- dsreset();
- delay(1);
- tempwritebyte(0xcc);//寫跳過讀ROM指令
- tempwritebyte(0x44);//寫溫度轉換指令
- }
- /*DS18B20溫度測量*/
- unsigned int get_temp()
- {
- unsigned char a,b;
- dsreset();
- delay(1);
- tempwritebyte(0xcc);
- tempwritebyte(0xbe);
- a=tempread();//讀低8位
- b=tempread();//讀高8位
- temp=b;
- temp<<=8;//兩個字節組合為1個字
- temp=temp|a;
- if(temp<0x0fff)
- tflag=0;
- else
- {
- temp=~temp+1;
- tflag=1;
- }
- f_temp=temp*0.0625; //溫度在寄存器中位12位,分辨率為0.0625
- temp=f_temp*10+0.5; //乘以10表示小數點后面只取一位,加入0.5是四舍五入
- f_temp=f_temp+0.05;
- return temp;//temp是整型
- }
-
- void dis_temp(unsigned int tvalue)
- {
- disdata[0]=tvalue/1000+0x30;//百位數 加上0x30就是要顯示數字字符
- disdata[1]=tvalue%1000/100+0x30;//十位數
- disdata[2]=tvalue%100/10+0x30;//個位數
- disdata[3]=tvalue%10+0x30;//小數位
-
- if(tflag==0)
- vShowOneChar(0,40,uca_zheng);
- else
- vShowOneChar(0,40,uca_fu);
- trans(0,disdata[0],48);
- trans(0,disdata[1],56);
- trans(0,disdata[2],64);
- vShowOneChar(0,72,uca_dian); //小數點
- trans(0,disdata[3],80);
- }
復制代碼 上面DS18B20的結果能在12864上面正常顯示,但是下面DHT11的值一直不顯示
- #include <reg51.h>
- #include <word.h>
- #include <NumDisplay.h>
- #include <12864.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit Data = P3^6;//定義數據線
- unsigned char data dis1[4]; //用于顯示的接收數據數組
- uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
-
- /*------------------------------------------------
- DHT11延時函數
- ------------------------------------------------*/
- void DHT11_delay_us(uchar n)
- {
- while(--n);
- }
-
- void DHT11_delay_ms(uint z)
- {
- uint i,j;
- for(i=z;i>0;i--)
- for(j=110;j>0;j--);
- }
- /*------------------------------------------------
- DHT11開始信號
- ------------------------------------------------*/
- void DHT11_start()
- {
- Data=1;
- DHT11_delay_us(2);
- Data=0;
- DHT11_delay_ms(20); //延時18ms以上
- Data=1;
- DHT11_delay_us(30);
- }
- /*------------------------------------------------
- 接收八位二進制
- ------------------------------------------------*/
- uchar DHT11_rec_byte() //接收一個字節
- {
- uchar i,dat=0;
- for(i=0;i<8;i++) //從高到低依次接收8位數據
- {
- while(!Data); ////等待50us低電平過去
- DHT11_delay_us(8); //延時60us,如果還為高則數據為1,否則為0
- dat<<=1; //移位使正確接收8位數據,數據為0時直接移位
- if(Data==1) //數據為1時,使dat加1來接收數據1
- dat+=1;
- while(Data); //等待數據線拉低
- }
- return dat;
- }
- /*------------------------------------------------
- 接收40bit數據
- ------------------------------------------------*/
- void DHT11_receive() //接收40位的數據
- {
- DHT11_start();
-
- if(Data==0)
- {
-
- while(Data==0); //等待拉高
-
- DHT11_delay_us(40); //拉高后延時80us
- R_H=DHT11_rec_byte(); //接收濕度高八位
- R_L=DHT11_rec_byte(); //接收濕度低八位
- T_H=DHT11_rec_byte(); //接收溫度高八位
- T_L=DHT11_rec_byte(); //接收溫度低八位
- revise=DHT11_rec_byte(); //接收校正位
-
- DHT11_delay_us(25); //結束
-
- if((R_H+R_L+T_H+T_L)==revise) //校正
- {
- RH=R_H;
- RL=R_L;
- TH=T_H;
- TL=T_L;
- }
- }
- }
- void display()
- {
-
- dis1[0]=RH/10%10+0x30;
- dis1[1]=RH%10+0x30;
- //dis1[2]=TH/10%10+0x30;
- //dis1[3]=TH%10+0x30;
- trans(2,dis1[0],48);
- trans(2,dis1[1],56);
- vShowOneChar(2,64,uca_bfh); //小數點
- }
復制代碼- //這是12864的代碼
- #include <reg51.h>
- #define LCDLCDDisp_Off 0x3e
- #define LCDLCDDisp_On 0x3f
- #define Page_Add 0xb8//頁地址
- #define LCDCol_Add 0x40//列地址
- #define Start_Line 0xC0//行地址
- /*****液晶顯示器的端口定義*****/
- #define data_ora P0 /*液晶數據總線*/
- sbit CS1=P2^4 ; /*片選1*/
- sbit CS2=P2^3 ; /*片選2*/
- sbit RESET=P2^3 ; /*復位信號*/
- sbit LCDDi=P2^2 ; /*數據/指令 選擇*/
- sbit LCDRW=P2^1 ; /*讀/寫 選擇*/
- sbit LCDEnable=P2^0 ; /*讀/寫 使能*/
- /****************************************************************************
- 函數功能:延時程序
- 入口參數:t
- 出口參數:
- ****************************************************************************/
- void delay(unsigned int t)
- {
- unsigned int i,j;
- for(i=0;i<t;i++);
- for(j=0;j<10;j++);
- }
- /****************************************************************************
- 狀態檢查,LCD是否忙
- *****************************************************************************/
- void CheckState()
- {
- unsigned char dat,DATA;//狀態信息(判斷是否忙)
- LCDDi=0; // 數據\指令選擇,D/I(RS)="L" ,表示 DB7∽DB0 為顯示指令數據
- LCDRW=1; //R/W="H" ,E="H"數據被讀到DB7∽DB0
- do
- {
- DATA=0x00;
- LCDEnable=1; //EN下降源
- delay(2);//延時
- dat=DATA;
- LCDEnable=0;
- dat=0x80 & dat; //僅當第7位為0時才可操作(判別busy信號)
- }
- while(!(dat==0x00));
- }
- /*****************************************************************************
- 函數功能:寫命令到LCD程序,RS(DI)=L,RW=L,EN=H,即來一個脈沖寫一次
- 入口參數:cmdcode
- 出口參數:
- *****************************************************************************/
- void write_com(unsigned char cmdcode)
- {
- CheckState();//檢測LCD是否忙
- LCDDi=0;
- LCDRW=0;
- P0=cmdcode;
- delay(2);
- LCDEnable=1;
- delay(2);
- LCDEnable=0;
- }
- /*****************************************************************************
- 函數功能:LCD初始化程序
- 入口參數:
- 出口參數:
- *****************************************************************************/
- void init_lcd()
- {
- delay(100);
- CS1=1;//剛開始關閉兩屏
- CS2=1;
- delay(100);
- write_com(LCDLCDDisp_Off); //寫初始化命令
- write_com(Page_Add+0);
- write_com(Start_Line+0);
- write_com(LCDCol_Add+0);
- write_com(LCDLCDDisp_On);
- }
- /*****************************************************************************
- 函數功能:寫數據到LCD程序,RS(DI)=H,RW=L,EN=H,即來一個脈沖寫一次
- 入口參數:LCDDispdata
- 出口參數:
- *****************************************************************************/
- void write_data(unsigned char LCDDispdata)
- {
- CheckState();//檢測LCD是否忙
- LCDDi=1;
- LCDRW=0;
- P0=LCDDispdata;
- delay(2);
- LCDEnable=1;
- delay(2);
- LCDEnable=0;
- }
- /*****************************************************************************
- 函數功能:清除LCD內存程序
- 入口參數:pag,col,hzk
- 出口參數:
- *****************************************************************************/
- void Clr_Scr()
- {
- unsigned char j,k;
- CS1=0; //左、右屏均開顯示
- CS2=0;
- write_com(Page_Add+0);
- write_com(LCDCol_Add+0);
- for(k=0;k<8;k++)//控制頁數0-7,共8頁
- {
- write_com(Page_Add+k); //每頁每頁進行寫
- for(j=0;j<64;j++) //每頁最多可寫32個中文文字或64個ASCII字符
- {
- write_com(LCDCol_Add+j);
- write_data(0x00);//控制列數0-63,共64列,寫點內容,列地址自動加1
- }
- }
- }
- //顯示自定義行
- //在8×128的格子里顯示自定義長度的一行
- void vShowCustomRow(unsigned char ucPage,unsigned char ucLine,unsigned char ucWidth,unsigned char *ucaRow)
- {
- unsigned char ucCount; //取值范圍:ucPage:0~7;ucLine:0~127;
- if(ucLine<64) //ucWidth:0~127;ucLine+ucWidth<1128。
- {
- CS1=0; //左半屏
- CS2=1;
- write_com(Page_Add+ucPage);
- write_com(LCDCol_Add+ucLine);
- if((ucLine+ucWidth)<=64)
- {
- for(ucCount=0;ucCount<ucWidth;ucCount++)
- write_data(*(ucaRow+ucCount));
- }
- }
- else
- {
- CS1=1;
- CS2=0;
- write_com(Page_Add+ucPage);
- write_com(LCDCol_Add+ucLine-64);
- for(ucCount=0;ucCount<ucWidth;ucCount++)
- write_data(*(ucaRow+ucCount));
- }
- }
- //漢字顯示函數
- //此函數將16×16漢字顯示在8×128的格子里。
- void vShowOneChin(unsigned char ucPage,unsigned char ucLine,unsigned char *ucaChinMap)
- {
- vShowCustomRow(ucPage,ucLine,16,ucaChinMap);
- vShowCustomRow(ucPage+1,ucLine,16,ucaChinMap+16);
- }
- //字符顯示函數
- //此函數將8×16字符顯示在8×128的格子里。
- void vShowOneChar(unsigned char ucPage,unsigned char ucLine,unsigned char *ucaCharMap)
- {
- vShowCustomRow(ucPage,ucLine,8,ucaCharMap);
- vShowCustomRow(ucPage+1,ucLine,8,ucaCharMap+8);
- }
復制代碼- #include <reg51.h>
- #include <12864.h>
- #include <word.h>
- //根據輸入的tem在12864的第1行的pos位置顯示相應的0~9
- void trans(unsigned char hang,unsigned char tem,unsigned int pos)
- {
- switch(tem)
- {
- case '0':vShowOneChar(hang,pos,uca_0);break;
- case '1':vShowOneChar(hang,pos,uca_1);break;
- case '2':vShowOneChar(hang,pos,uca_2);break;
- case '3':vShowOneChar(hang,pos,uca_3);break;
- case '4':vShowOneChar(hang,pos,uca_4);break;
- case '5':vShowOneChar(hang,pos,uca_5);break;
- case '6':vShowOneChar(hang,pos,uca_6);break;
- case '7':vShowOneChar(hang,pos,uca_7);break;
- case '8':vShowOneChar(hang,pos,uca_8);break;
- case '9':vShowOneChar(hang,pos,uca_9);break;
- default: vShowOneChin(hang,pos,uca_du);break;
- }
- }
復制代碼 全部資料51hei下載地址:
溫濕度測量.rar
(117.93 KB, 下載次數: 11)
2020-1-7 19:55 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|