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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

DHT11溫濕度傳感器,1602顯示,溫度控制不同的電機轉速,可是調速程序加進去后有點...

[復制鏈接]
跳轉到指定樓層
樓主
ID:83523 發表于 2015-8-19 16:03 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar DHT11[5],RTflag=0;
uchar  FLAG;   //超時標志位
uchar a,b;
sbit dat=P1^5;//DHT11
sbit RS=P2^6;//1602顯示
sbit RW=P2^5;
sbit EN=P2^7;
sbit IN1 = P1^0;//電機
sbit IN2 = P1^1;
sbit IN3 = P1^2;
sbit IN4 = P1^3;       
sbit ENA = P1^4;
bit Run_Status;
unsigned char CYCLE;
unsigned char DUTY;
uchar table[5];
uint wd,sd;
/*void Delay(uint cnt)
{
        while(--cnt);
} */
void motor1()       
{
if(DHT11[2]>=20&&DHT11[2]<=24)
                        {       
                                TR0=1;
                                if(DUTY<CYCLE)       
                                DUTY=2;        //增加占空比
                                else                       
                                DUTY=0;
                                Run_Status=1;                               
                                IN1=1;                       
                                IN2=0;                       
                                ENA=0;                                               
                         }       
                        if(DHT11[2]>=25&&DHT11[2]<=29)
                        {       
                                TR0=1;
                                if(DUTY<CYCLE)       
                                DUTY=4;        //增加占空比
                                else                       
                                DUTY=0;
                                Run_Status=1;                               
                                IN1=1;                       
                                IN2=0;                       
                                ENA=0;                                               
                         }
                        if(DHT11[2]>=30&&DHT11[2]<=34)
                        {       
                                TR0=1;
                                if(DUTY<CYCLE)       
                                DUTY=6;        //增加占空比
                                else                       
                                DUTY=0;
                                Run_Status=1;                               
                                IN1=1;                       
                                IN2=0;                       
                                ENA=0;                                               
                         }
                        if(DHT11[2]>=35&&DHT11[2]<=40)
                        {       
                                TR0=1;
                                if(DUTY<CYCLE)       
                                DUTY=8;        //增加占空比
                                else                       
                                DUTY=0;
                                Run_Status=1;                               
                                IN1=1;                       
                                IN2=0;                       
                                ENA=0;                                               
                         }
                       
}
void motor2()//濕控
  {
  if(DHT11[0]+DHT11[1]<=70 )
  {
  IN3=1;IN4=0;
  }
  else
  {
  IN3=0;IN4=0;
  }
  }
  
void Delay_t(uint j)
{      uchar i;
            for(;j>0;j--)
          {        
                for(i=0;i<27;i++);       
          }
}
void  Delay_10us(void) //10us延時函數
{
        uchar i;
         i--;
         i--;
         i--;
         i--;
         i--;
         i--;
}

void delay(uint z)//1毫秒延時函數
{
   uint x,y;
   for(x=z;x>0;x--)
    for(y=110;y>0;y--);
}

void lcd_write_com(uchar com) //1602寫指令
{
   RS=0;
   RW=0;
   EN=1;
   P0=com;
   delay(1);
   EN=0;

}
void lcd_init()        //1602初始化
{

  lcd_write_com(0x38);
  delay(1);
  lcd_write_com(0x08);
  delay(1);
  lcd_write_com(0x01);//1602清屏
  delay(1);
  lcd_write_com(0x06);
  delay(1);
  lcd_write_com(0x0C);
  delay(1);

}
void lcd_write_data(uchar date)//1602寫數據
{
   RS=1;
   RW=0;
EN=1;
   P0=date;
   delay(1);
   EN=0;
}
void write_str(uchar x,uchar y,uchar *s)//在任意地址寫符號
{
          if(y==0)                                                                                  
          lcd_write_com(0x80+x);
          else
          lcd_write_com(0xc0+x);
        while(*s)
        {
           lcd_write_data(*s);
           s++;
        }
}
void write_shu(uchar x,uchar y,uchar num)//數據顯示函數
{
          
          uchar s,g;
          if(y==0)
          lcd_write_com(0x80+x);
          else
          lcd_write_com(0xc0+x);
          s=num/10;// 數據分離顯示
          lcd_write_data(0x30+s);
          g=num%10;//數據分離顯示
          lcd_write_data(0x30+g);
}

uchar  write_byte1() //讀一個字節
{
           uchar i,comdata,temp1;
       for(i=0;i<8;i++)          
            {
                       FLAG=2;       
                   while((!dat)&&FLAG++);//判斷數據位是1還是0
                        Delay_10us();
                    Delay_10us();
                        Delay_10us();
                          temp1=0;
             if(dat)temp1=1;       
                    FLAG=2;
                 while((dat)&&FLAG++);  
                     
                    if(FLAG==1)break;                                                                         
                   comdata<<=1;
                      comdata|=temp1;
             }
                 return (comdata);  
}
void DHT11_5() //dht11讀5個字節
{
          uchar i,temp;
          //主機拉低18MS
       dat=0;
           Delay_t(180);
           dat=1;
//總線由上拉電阻拉高,主機延時20us
           Delay_10us();
           Delay_10us();
           Delay_10us();
           Delay_10us();
           dat=1;          
           if(!dat)                           
           {
                FLAG=2;          
                                 
                while((!dat)&&FLAG++);
                        FLAG=2;
                       
                while((dat)&&FLAG++);
                        for(i=0;i<5;i++)
                        {
                                DHT11[i]=write_byte1();       
                        }                 
                        dat=1;       
                 
                        temp=(DHT11[0]+DHT11[1]+DHT11[2]+DHT11[3]);
                        if(temp==DHT11[4])        //數據校驗位
                        {                       
                                RTflag=1;                  
                        }
                        if(RTflag==1) //如果RTflag=1說明讀到的數據正確
                   {                         
                                RTflag=0;                                  
                                write_str(0,0,"measurement ");//第一行顯示濕度
                                write_shu(12,0,DHT11[0]);
                                write_str(14,0,"RH");
                                write_str(0,1,"Temperature ");//第二行顯示溫度       
                            write_shu(12,1,DHT11[2]);
                            write_str(14,1,"^C");                               
                   }

                }
}

void timerinit()
{
TMOD |=0x01;        //定時器設置1MS
        TH0=(65536-1000)/256;
        TL0=(65536-1000)%256;//定時1ms
        IE= 0x82;                  //′打開中斷       
       
        Run_Status=0;
        IN1=1;
        IN2=1;
    ENA=0;
       

        CYCLE=10;         //ÖüÆú10ms周期10ms
        DUTY=0;         //占空比=0
}

void main()
{
  lcd_init();  //1602初始化
  delay(1000); //等待DHT11傳感器數據穩定開始激活DHT11
        timerinit();
       
  while(1)
  {
   delay(1000);//等待DHT11傳感器數據穩定開始激活DHT11
   write_byte1();//讀一個字節
   DHT11_5(); //讀數據
  delay(1000); //延時等待
  motor1();
        motor2();
       
}
}
void Timer0(void) interrupt 1 using 1
{
        static unsigned char Cnt;

        TH0=(65536-1000)/256;
        TL0=(65536-1000)%256;//定時1mS
       
        if(DUTY==0)                                {Cnt=0;        TR0=0;Run_Status=0;}        //占空比為0時停止中斷
        else if(DUTY==CYCLE)        Cnt=CYCLE;
        else                                        Cnt++;
        if(Cnt==DUTY)                //高電平時間到
        {
                 ENA = 0;                  
        }
        if(Cnt == CYCLE)        //低電平時間到
        {
                ENA = 1;        
            Cnt=0;
        }
}



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:83523 發表于 2015-8-19 16:04 | 只看該作者
問題就是當溫度變化時1602顯示有點慢,電機轉速控制好像不太靈敏,,,,,求大俠幫忙看看
回復

使用道具 舉報

板凳
ID:84652 發表于 2015-8-19 19:03 | 只看該作者
顯示慢然后電機又不太靈敏……關鍵是顯示慢,會不會是DHT11反應慢呢?
回復

使用道具 舉報

地板
ID:83523 發表于 2015-8-19 21:12 | 只看該作者
王朗的誘惑 發表于 2015-8-19 19:03
顯示慢然后電機又不太靈敏……關鍵是顯示慢,會不會是DHT11反應慢呢?

不知道改一下延時是不是會有效果?
回復

使用道具 舉報

5#
ID:84652 發表于 2015-8-20 10:31 | 只看該作者
本帖最后由 王朗的誘惑 于 2015-8-20 10:33 編輯
aaxing 發表于 2015-8-19 21:12
不知道改一下延時是不是會有效果?

應該會的吧……while里的延時太影響速度了。DHT11兩次連讀間隔80ms就夠了。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线观看免费国产 | av在线免费网站 | 国产资源在线视频 | 日韩精品在线播放 | 黄色一级大片在线免费看产 | 国产日韩欧美在线 | 日韩中文字幕在线免费 | 欧美八区| 一区二区三区av | 精品一区二区三区在线播放 | 91大神xh98xh系列全部 | 乱一性一乱一交一视频a∨ 色爱av | 亚洲第一视频网站 | 久久九精品 | 成人在线精品 | 国产精品久久久久久亚洲调教 | 欧美视频一区 | 欧美日韩中文字幕 | 国产亚洲精品美女久久久久久久久久 | 人人看人人干 | 四虎伊人 | 免费在线成人 | 亚洲精品一区二区二区 | 国产精品欧美一区二区三区不卡 | 黄色大片在线视频 | 国内久久 | 一区二区三区四区在线视频 | 日韩免费av一区二区 | 欧美寡妇偷汉性猛交 | 成人亚洲精品 | 黄网站色大毛片 | 国产高清区 | 精品视频久久久久久 | 成人影院一区二区三区 | 伊人久久精品一区二区三区 | 人人种亚洲 | 精品亚洲国产成av人片传媒 | 午夜视频在线播放 | 国产一区二区欧美 | av一级久久 | 国产亚洲精品精品国产亚洲综合 |