入門51單片機(jī)一個(gè)多月,參加一個(gè)比賽熬夜寫(xiě)出了OLED+DHT11程序。
單片機(jī)源程序如下:
- #include "REG51.h"
- #include "oled.h"
- #include<intrins.h>
- typedef unsigned char BYTE;
- typedef unsigned int WORD;
- #define uint unsigned int
- #define uchar unsigned char
- sbit io=P1^2;//dht11data端接單片機(jī)的P1^0口//
- sbit IN1 = P1^0;
- sbit IN2 = P1^1; //輸入電機(jī)接口
- sbit K1 = P3^0;
- sbit K2 = P3^1; //按鍵接口
- uchar data_byte;
- uchar RH,RL,TH,TL;
- int count1,a;
- void DelayUs2x(unsigned char t)
- {
- while(--t);
- }
- void DelayMs(unsigned char t)
- {
- while(t--)
- {
- //大致延時(shí)1mS
- DelayUs2x(245);
- DelayUs2x(245);
- }
- }
- void delay(uchar ms) //延時(shí)模塊//
- {
- uchar i;
- while(ms--)
- for(i=0;i<100;i++);
- }
- void delay1()//一個(gè)for循環(huán)大概需要8個(gè)多機(jī)器周期一個(gè)機(jī)器周期為1us晶振為12MHz也就是說(shuō)本函數(shù)延時(shí)8us多此延時(shí)函數(shù)必須德稍微精確一點(diǎn)
- {
- uchar i;
- for(i=0;i<1;i++);
- }
- //電機(jī)的程序
- void ZHUAN(){
-
- IN2=0;
- }
- void speed(int cnt,int sd)
- {
- if(cnt<sd)
- {
- IN1=1;
- }
- else
- {
- IN1=0;
- }
-
- }
- void turn(int cnt,int sd)
- {
- ZHUAN();
- speed(cnt,sd);
- }
- void start()//開(kāi)始信號(hào)
- {
- io=1;
- delay1();
- io=0;
- delay(25);// 主機(jī)把總線拉低必須大于18ms保證DHT11能檢測(cè)到起始信號(hào)
- io=1; //發(fā)送開(kāi)始信號(hào)結(jié)束后拉高電平延時(shí)20-40us
- delay1();//以下三個(gè)延時(shí)函數(shù)差不多為24us符合要求
- delay1();
- delay1();
- }
- uchar receive_byte()//接收一個(gè)字節(jié)//
- {
- uchar i,temp;
- for(i=0;i<8;i++)//接收8bit的數(shù)據(jù)
- {
- while(!io);//等待50us的低電平開(kāi)始信號(hào)結(jié)束
- delay1();//開(kāi)始信號(hào)結(jié)束之后延時(shí)26us-28us以下三個(gè)延時(shí)函數(shù)
- delay1();
- delay1();
- temp=0;//時(shí)間為26us-28us表示接收的為數(shù)據(jù)'0'
- if(io==1)
- temp=1; //如果26us-28us之后還為高電平則表示接收的數(shù)據(jù)為'1'
- while(io);//等待數(shù)據(jù)信號(hào)高電平'0'為26us-28us'1'為70us
- data_byte<<=1;//接收的數(shù)據(jù)為高位在前右移
- data_byte|=temp;
- }
- return data_byte;
- }
- void receive()//接收數(shù)據(jù)//
- {
- uchar T_H,T_L,R_H,R_L,check,num_check,i;
- start();//開(kāi)始信號(hào)//
- io=1; //主機(jī)設(shè)為輸入判斷從機(jī)DHT11響應(yīng)信號(hào)
- if(!io)//判斷從機(jī)是否有低電平響應(yīng)信號(hào)//
- {
- while(!io);//判斷從機(jī)發(fā)出 80us 的低電平響應(yīng)信號(hào)是否結(jié)束//
- while(io);//判斷從機(jī)發(fā)出 80us 的高電平是否結(jié)束如結(jié)束則主機(jī)進(jìn)入數(shù)據(jù)接收狀態(tài)
- R_H=receive_byte();//濕度高位
- R_L=receive_byte();//濕度低位
- T_H=receive_byte();//溫度高位
- T_L=receive_byte();//溫度低位
- check=receive_byte();//校驗(yàn)位
- io=0; //當(dāng)最后一bit數(shù)據(jù)接完畢后從機(jī)拉低電平50us//
- for(i=0;i<7;i++)//差不多50us的延時(shí)
- delay1();
- io=1;//總線由上拉電阻拉高進(jìn)入空閑狀態(tài)
- num_check=R_H+R_L+T_H+T_L;
- if(num_check==check)//判斷讀到的四個(gè)數(shù)據(jù)之和是否與校驗(yàn)位相同
- {
- RH=R_H;
- RL=R_L;
- TH=T_H;
- TL=T_L;
- check=num_check;
- }
- }
- }
- int main(void)
- {
- TMOD=0x01;
- EA=1;
- TH0=(65536-1000)/256;
- TL0=(65536-1000)%256;
- ET0=1;
- TR0=1;
-
- a = 100;
- OLED_Init(); //初始化OLED
- OLED_Clear() ;
- OLED_ShowCHinese(36,0,0);
- OLED_ShowCHinese(54,0,1);
- OLED_ShowCHinese(72,0,2);
- OLED_ShowCHinese(0,2,3);
- OLED_ShowCHinese(18,2,5);
- OLED_ShowCHinese(0,4,4);
- OLED_ShowCHinese(18,4,5);
- OLED_ShowString(37,4,":",16);
- OLED_ShowString(37,2,":",16);
- while(1)
- {
- turn(count1,a);
- if(K1==0)
- {
- DelayMs(100);
- if(K1==0)// 去抖動(dòng)
- {
- if(a>=0)
- a=a-10;
- }
- }
- if(K2==0)
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
OLED_DHT11.zip
(97.73 KB, 下載次數(shù): 462)
2018-4-6 02:00 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|