久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2282|回復: 1
打印 上一主題 下一主題
收起左側

請問下我在網上找到的代碼,使用89c52測dht11在lcd1602上顯示用的是12m晶振數據不刷新

[復制鏈接]
跳轉到指定樓層
樓主
ID:526834 發表于 2019-5-4 11:23 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
用的是stc89c51,傳感器是dht11,液晶屏是lcd1602,晶振是12m,經測試數據不刷新,在拔插一下data數據線(由傳感器輸入到單片機接收口),數據才會刷新,我想問問是什么原因。

#include <reg52.h>
#include <intrins.h>
typedef unsigned char unint8;
typedef unsigned char unint16;
unsigned char str1[]={"        "};
unsigned char str2[]={"        "};
unsigned char code dis1[] = {"TRH RH: "};
unsigned char code dis2[] = {"TRH  T: "};

sbit TRH = P2^7;//溫濕度傳感器DHT11數據接入
sbit LCD_RS = P1^0;
sbit LCD_RW = P1^1;
sbit LCD_EN = P1^2;
unint8 TH_data,TL_data,RH_data,RL_data,CK_data;
unint8 TH_temp,TL_temp,RH_temp,RL_temp,CK_temp;
unint8 com_data,untemp,temp;
unint8 respond;

void delayNOP()
{
         _nop_();
         _nop_();
         _nop_();
         _nop_();
}
// 毫秒級延時子程序
void delay_ms(unsigned char ms)
{      
          unsigned char i;
          while(ms--)
          {
                    for(i = 0; i< 150; i++)
                    {
                              _nop_();
                              _nop_();
                              _nop_();
                              _nop_();
                    }
          }
}
//5us級延時程序
void delay_us()
{
          unint8 i;
          i--;
          i--;
          i--;
          i--;
          i--;
          i--;
}
// 測試LCD忙碌狀態
//lcd_busy()為1時,忙,等待。lcd_busy()為0時,閑,可寫指令與數據。
bit lcd_busy()
{      
         bit result;
         LCD_RS = 0;
         LCD_RW = 1;
         LCD_EN = 1;
         delayNOP();
         result = (bit)(P0&0x80);
         LCD_EN = 0;
         return(result);
}
// 寫入指令數據到LCD
void lcd_wcmd(unsigned char cmd)
{      
         while(lcd_busy());
         LCD_RS = 0;
         LCD_RW = 0;
         LCD_EN = 0;
         _nop_();
         _nop_();
         P0 = cmd;
         delayNOP();
         LCD_EN = 1;
         delayNOP();
         LCD_EN = 0;
}
//寫顯示數據到LCD                                               
//RS=高電平,RW=低電平,E=高脈沖,D0-D7=數據。                           
void lcd_wdata(unsigned char dat)
{                          
         while(lcd_busy());
          LCD_RS = 1;
         LCD_RW = 0;
         LCD_EN = 0;
         P0 = dat;
         delayNOP();
         LCD_EN = 1;
         delayNOP();
         LCD_EN = 0;
}
//LCD初始化設定
void lcd_init()
{
        delay_ms(15);                  
        lcd_wcmd(0x38);      //16*2顯示,5*7點陣,8位數據
        delay_ms(5);
        lcd_wcmd(0x38);        
        delay_ms(5);
        lcd_wcmd(0x38);        
        delay_ms(5);
        lcd_wcmd(0x0c);      //顯示開,關光標
        delay_ms(5);
        lcd_wcmd(0x06);      //移動光標
        delay_ms(5);
        //lcd_wcmd(0x01);      //清除LCD的顯示內容,如果屏幕過暗,可將這倆句刪除
        //delay_ms(5);
}
//設定LCD顯示位置
void lcd_dis_pos(unsigned char pos)
{      
          lcd_wcmd(pos | 0x80); //數據指針=80+地址變量
}
//收發信號檢測,數據讀取
char receive()
{   
          unint8 i;
          com_data=0;
          for(i=0;i<=7;i++)   
         {
                    respond=2;
                    while((!TRH)&&respond++);
                    delay_us();
                    delay_us();
                    delay_us();
                    if(TRH)
                    {
                              temp=1;
                              respond=2;
                              while((TRH)&&respond++);
                    }
                    else
                              temp=0;
                    com_data<<=1;
                    com_data|=temp;   
          }
          return(com_data);
}
//濕度讀取子程序
//溫度高8位== TL_data
//溫度低8位== TH_data
//濕度高8位== RH_data
//濕度低8位== RH_data
//校驗 8位 == CK_data
//調用的程序有 delay();, Delay_5us();,RECEIVE();
void read_TRH()
{
         //主機拉低18ms
         TRH=0;
         delay_ms(18);
         TRH=1;
         //DATA總線由上拉電阻拉高 主機延時20us
         delay_us();
         delay_us();
         delay_us();
         delay_us();
         //delay_us();
         //delay_us();delay_us();delay_us();delay_us();
         //主機設為輸入 判斷從機響應信號
         TRH=1;
         //判斷DHT11是否有低電平響應信號 如不響應則跳出,響應則向下運行   
         if(!TRH)   
         {
                respond=2;
                //判斷DHT11發出 80us 的低電平響應信號是否結束
                while((!TRH)&& respond++);
                respond=2;
                //判斷從機是否發出 80us 的高電平,如發出則進入數據接收狀態
                while(TRH && respond++);
                //數據接收狀態  
                RH_temp = receive();
                RL_temp = receive();
                TH_temp = receive();
                TL_temp = receive();
                CK_temp = receive();
                TRH=1;     
                //數據校驗
                untemp=(RH_temp+RL_temp+TH_temp+TL_temp);
                if(untemp==CK_temp)
                {
                         RH_data = RH_temp;
                         RL_data = RL_temp;
                         TH_data = TH_temp;
                         TL_data = TL_temp;
                         CK_data = CK_temp;
                }
        }
         //濕度整數部分
         str1[0] = (char)(0X30+RH_data/10);
         str1[1] = (char)(0X30+RH_data%10);
         str1[2] =  0x2e; //小數點
         //濕度小數部分
         str1[3] = (char)(0X30+RL_data/10);
         str1[5] = 0X25; //"%"
         str1[6] = 0X52; //"R"
         str1[7] = 0X48; //"H"
         //溫度整數部分
         str2[0] = (char)(0X30+TH_data/10);
         str2[1] = (char)(0X30+TH_data%10);
         str2[2] =  0x2e; //小數點
         //溫度小數部分
         str2[3] = (char)(0X30+TL_data/10);
         str2[5] = 0X27;  //"'"
         str2[6] = 0X43;  //"C"
}

//主函數
//TH,TL,RH,RL分別代表溫濕度的整數和小數部分
void main()
{
          unsigned char i,n=0x40,m;
          lcd_init();
          delay_us();
          while(1)
          {
                    read_TRH();
                    //寫字符
                     for(i=0;i<=7;i++)
                    {
                            lcd_dis_pos(i);    //顯示字符
                            lcd_wdata(dis1[i]);
                            lcd_dis_pos(n+i);    //顯示字符
                            lcd_wdata(dis2[i]);
                    }
                   //寫濕度數據
                   m=0x08;
                   for(i=0;i<=7;i++)     
                   {
                           lcd_dis_pos(m);
                           lcd_wdata(str1[i]);
                           m++;
                  }
                  //寫溫度數據
                  m=0x48;
                  for(i=0;i<=7;i++)     
                  {
                           lcd_dis_pos(m);
                           lcd_wdata(str2[i]);
                           m++;
                   }
                   //延時
                   delay_ms(1000) ;
        }     
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:863910 發表于 2021-3-25 22:52 | 只看該作者
為什么6個i--是5US呢
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久色网| 国产做a爱免费视频 | 日韩在线| 国产1页 | 欧美日韩精品在线免费观看 | 精品1区2区 | 久久精品中文字幕 | 久久专区| 欧美精品日韩精品 | 在线免费视频一区 | 国产福利视频网站 | 国产www在线| 久久伊人影院 | 国产一区二区高清在线 | 欧美涩| 午夜视频在线观看视频 | 久久久久久国产 | 国产成人精品a视频一区www | 午夜免费视频 | 国产aa | 亚洲欧美精品在线观看 | 美女张开腿露出尿口 | 国产乱xxav | 亚洲黄色高清视频 | 美美女高清毛片视频免费观看 | 日日骚网| 久久精品国产a三级三级三级 | 日韩有码一区 | 久久精品国产v日韩v亚洲 | 久久在线视频 | 国产精品久久久久免费 | 国产精品成人品 | 国产三级日本三级 | 欧美一级视频免费看 | 亚洲一区二区三区乱码aⅴ 四虎在线视频 | 毛片免费在线 | 欧美一级做a爰片免费视频 国产美女特级嫩嫩嫩bbb片 | 久久久激情视频 | 国产精品毛片 | 在线看片国产 | 黄色片免费看 |