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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

大神們幫幫菜鳥,adc0832讀取不了濕度和光照強度?液晶顯示為0,趕覺是主程序的問題,

[復制鏈接]
跳轉到指定樓層
樓主
ID:215752 發表于 2017-6-29 11:08 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include <reg52.h>                 //調用單片機頭文件
#define uchar unsigned char  //無符號字符型 宏定義        變量范圍0~255
#define uint  unsigned int         //無符號整型 宏定義        變量范圍0~65535

#include <intrins.h>

sbit SCL=P1^4;                //SCL(CLK)定義為P1口的第3位腳,連接ADC0832SCL腳
sbit DO=P1^5;                //DO定義為P1口的第4位腳,連接ADC0832DO腳
sbit CS=P1^3;                //CS定義為P1口的第4位腳,連接ADC0832CS腳

sbit beep = P3^3;   //蜂鳴器IO口定義

sbit dq   = P1^7;        //18b20 IO口的定義

uint temperature ;  //溫度的變量
uchar shidu;     //濕度等級
uchar s_high ,s_low;        //濕度報警參數

uint t_high ,t_low ;        //溫度報警參數


sbit dianji = P1^6;     //電機IO定義
sbit fengshan = P2^7;     //風扇IO定義
sbit relay = P2^0;     //繼電器IO定義

uint flag_250ms ;   //沒懂什么意思???????????
uchar key_can;                 //按鍵值的變量
uchar menu_1,menu_2;        //菜單設計的變量
uchar guangxian;     //光線
uchar qiang_gx;                            //設置光線的強的變量
uchar ruo_gx;                            //設置光線的弱的變量
uchar flag_en = 1,flag_sd,flag_wd,flag_shoudong;
bit sd_sd,sd_wd,sd_gx;  //手動模式 的變量


//這三個引腳參考資料
sbit rs=P1^0;         //1602數據/命令選擇引腳 H:數據              L:命令
sbit rw=P1^1;         //1602讀寫引腳                 H:數據寄存器          L:指令寄存器
sbit e =P1^2;         //1602使能引腳          下降沿觸發
uchar code table_num[]="0123456789abcdefg"; // 什么意思???????????

/********************************************************************
* 名稱 : delay_uint()
* 功能 : 小延時。
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void delay_uint(uint q)
{
        while(q--);//什么意思?
}

/********************************************************************
* 名稱 : write_com(uchar com)
* 功能 : 1602命令函數
* 輸入 : 輸入的命令值
* 輸出 : 無
***********************************************************************/
void write_com(uchar com)
{
        e=0;
        rs=0;
        rw=0;
        P0=com;
        delay_uint(3);
        e=1;
        delay_uint(25);
        e=0;
}

/********************************************************************
* 名稱 : write_data(uchar dat)
* 功能 : 1602寫數據函數
* 輸入 : 需要寫入1602的數據
* 輸出 : 無
***********************************************************************/
void write_data(uchar dat)
{
        e=0;
        rs=1;
        rw=0;
        P0=dat;
        delay_uint(3);
        e=1;
        delay_uint(25);
        e=0;       
}

/********************************************************************
* 名稱 : write_sfm2(uchar hang,uchar add,uchar date)
* 功能 : 顯示2位十進制數,如果要讓第一行,第五個字符開始顯示"23" ,調用該函數如下
                  write_sfm1(1,5,23)
* 輸入 : 行,列,需要輸入1602的數據
* 輸出 : 無
***********************************************************************/
void write_sfm2(uchar hang,uchar add,uint date)
{
        if(hang==1)   
        {   write_com(0x80+add);
                  write_data(0x30+date/10%10);
            write_data(0x30+date%10);
    }
        else
                write_com(0x80+0x40+add);
            write_data(0x30+date/10%10);
             write_data(0x30+date%10);       
}

/***********************lcd1602上顯示特定的字符************************/
void write_zifu(uchar hang,uchar add,uchar date)
{
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);
        write_data(date);       
}


/********************************************************************
* 名稱 : write_string(uchar hang,uchar add,uchar *p)
* 功能 : 改變液晶中某位的值,如果要讓第一行,第五個字符開始顯示"ab cd ef" ,調用該函數如下
                  write_string(1,5,"ab cd ef;")
* 輸入 : 行,列,需要輸入1602的數據
* 輸出 : 無
***********************************************************************/
void write_string(uchar hang,uchar add,uchar *p)
{
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);
                while(1)
                {
                        if(*p == '\0')  break;
                        write_data(*p++);
                    
                }       
}

/********************************************************************
* 名稱 : init_1602()
* 功能 : 初始化1602液晶
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void init_1602()
{
        write_com(0x38);
        write_com(0x38);
        write_com(0x0c);
        write_com(0x06);
        delay_uint(1000);
        write_string(1,0,"     Sd:  %         ");       
        write_string(2,0,"  W:    GX:  %      ");
        write_zifu(2,6,0xdf);          //顯示度       
}

/***********************1ms延時函數*****************************/
void delay_1ms(uint q)
{
        uint i,j;
        for(i=0;i<q;i++)
                for(j=0;j<120;j++);
}

/***********************18b20初始化函數*****************************/
void init_18b20()
{
        bit q;
        dq = 1;                                //把總線拿高
        delay_uint(1);            //15us
        dq = 0;                                //給復位脈沖
        delay_uint(80);                //750us
        dq = 1;                                //把總線拿高 等待
        delay_uint(10);                //110us
        q = dq;                                //讀取18b20初始化信號
        delay_uint(20);                //200us
        dq = 1;                                //把總線拿高 釋放總線
}

/*************寫18b20內的數據***************/
void write_18b20(uchar dat)
{
        uchar i;
        for(i=0;i<8;i++)
        {                                         //寫數據是低位開始
                dq = 0;                         //把總線拿低寫時間隙開始
                dq = dat & 0x01; //向18b20總線寫數據了
                delay_uint(5);         // 60us
                dq = 1;                         //釋放總線
                dat >>= 1;
        }       
}

/*************讀取18b20內的數據***************/
uchar read_18b20()
{
        uchar i,value;
        for(i=0;i<8;i++)
        {
                dq = 0;                         //把總線拿低讀時間隙開始
                value >>= 1;         //讀數據是低位開始
                dq = 1;                         //釋放總線
                if(dq == 1)                 //開始讀寫數據
                        value |= 0x80;
                delay_uint(5);         //60us        讀一個時間隙最少要保持60us的時間
        }
        return value;                 //返回數據
}

/*************讀取溫度的值 讀出來的是小數***************/
uint read_temp()
{
        uint value;
        uchar low;                           //在讀取溫度的時候如果中斷的太頻繁了,就應該把中斷給關了,否則會影響到18b20的時序
        EA = 0;
        init_18b20();                   //初始化18b20
        write_18b20(0xcc);           //跳過64位ROM
        write_18b20(0x44);           //啟動一次溫度轉換命令
        delay_uint(50);                   //500us

        init_18b20();                   //初始化18b20
       
        write_18b20(0xcc);           //跳過64位ROM
        write_18b20(0xbe);           //發出讀取暫存器命令
       
        low = read_18b20();           //讀溫度低字節
        value = read_18b20();  //讀溫度高字節
        EA = 1;
        value <<= 8;                   //把溫度的高位左移8位
        value |= low;                   //把讀出的溫度低位放到value的低八位中
        value *= 0.0625;               //轉換到溫度值
        return value;                   //返回讀出的溫度
}


/***********讀數模轉換數據********************************************************/       
//請先了解ADC0832模數轉換的串行協議,再來讀本函數,主要是對應時序圖來理解,本函數是模擬0832的串行協議進行的
                                                //  1  0  0 通道
                                                //  1  1  1 通道
uchar ad0832read(uchar channel)
{
        uchar i,value1,value2;               
                SCL=0;
                DO=1;
                CS=0;                //開始
                SCL=1;                //第一個上升沿       
               
                SCL=0;
                DO=1;
                SCL=1;          //第二個上升沿

                SCL=0;
                DO=channel;
                SCL=1;
                SCL=0;            //第三個上升沿
                DO=1;

                for(i=0;i<8;i++)        //從高位到低位
                {
                        SCL=1;
                        SCL=0;
                        if(DO)
                        {  
                                value1|=0x80>>i;
                        }
                                                                       
                }
               
               
                for(i=0;i<8;i++)        //從低位到        高位
                {
                        if(DO)
                        {  
                          value2|=0x80<<i;
                        }
                        SCL=1;
                        SCL=0;                                               
                }
                CS=1;
                SCL=1;
                DO=1;//數據讀取完成,釋放總線
                if(value1==value2)       
        return value2;
                return 0;
            
       
}


/********************獨立按鍵程序*****************/
uchar key_can;         //按鍵值

void key()         //獨立按鍵程序
{
        static uchar key_new;
        key_can = 20;                   //按鍵值還原
        P3 |= 0xf0;
        if((P3 & 0xf0) != 0xf0)                //按鍵按下
        {
                delay_1ms(1);                     //按鍵消抖動
                if(((P3 & 0xf0) != 0xf0) && (key_new == 1))
                {                                                //確認是按鍵按下
                        key_new = 0;
                        switch(P3 & 0xf0)
                        {
                                case 0xe0: key_can = 4; break;           //得到k1鍵值
                                case 0xd0: key_can = 3; break;           //得到k2鍵值
                                case 0xb0: key_can = 2; break;           //得到k3鍵值
                                case 0x70: key_can = 1; break;           //得到k4鍵值
                        }
                       
                                       
                }                       
        }
        else
                key_new = 1;       
}


/****************按鍵顯示函數***************/
void key_with()
{
        if(menu_1 == 0)
        {
                if(key_can == 3)
                {
                        flag_en = 0;   //手動取消報警
                        beep = 1;   //關閉蜂鳴器
                }
        }
        if(key_can == 1)           //設置鍵
        {
                menu_1 ++;
                if(menu_1 > 3)
                {
                        menu_1 = 0;
                        init_1602();  //lcd1602初始化                       
                }
                if(menu_1 == 1)                                 //初始化顯示
                {
                        write_string(1,0," WH:    WL:     ");
                        write_string(2,0," SH:  % SL:  %  ");
                        write_zifu(1,6,0xdf);          //顯示度               
                        write_zifu(1,13,0xdf);          //顯示度               
                        write_sfm2(1,4,t_high);          //顯示溫度
                        write_sfm2(1,11,t_low);          //顯示溫度
                        write_sfm2(2,4,s_high);   //顯示濕度       
                        write_sfm2(2,11,s_low);   //顯示濕度       
                }
                if(menu_1 == 2)                                 //初始化顯示
                {
                        write_string(1,0,"  H-gx:  %        ");       
                        write_string(2,0,"  L-gx:  %        ");       
                        write_sfm2(1,7,qiang_gx);
                        write_sfm2(2,7,ruo_gx);         //設置光線的參數
                        write_com(0x80+6);              //將光標移動到
                        write_com(0x0f);                //顯示光標并且閃爍       
                }       
                if(menu_1 == 3)                                 //初始化顯示
                {
                        write_string(1,0,"    Sd:         ");       
                        write_string(2,0," W:     GX:     ");       
                        write_com(0x80+6);              //將光標移動到
                        write_com(0x0f);                //顯示光標并且閃爍       
                }       
                menu_2 = 1;       
        }
        if(key_can == 2)        //選擇鍵
        {
                if(menu_1 == 1)                  //設置
                {
                        menu_2 ++;
                        if(menu_2 > 4)
                                menu_2 = 1;
                }
                if(menu_1 == 2)                 //設置
                {
                        menu_2 ++;
                        if(menu_2 > 2)
                                menu_2 = 1;                               
                }
                if(menu_1 == 3)                 //設置
                {
                        menu_2 ++;
                        if(menu_2 > 3)
                                menu_2 = 1;                               
                }
        }
        if(menu_1 == 1)       
        {
                if(menu_2 == 1)                        //設置高溫報警
                {
                        if(key_can == 3)
                        {
                                t_high ++ ;                //設置高溫值加1        
                                if(t_high > 99)
                                        t_high = 99;
                        }
                        if(key_can == 4)
                        {
                                t_high -- ;                //設置高溫值減1        
                                if(t_high <= t_low)
                                        t_high = t_low + 1;
                        }
                        write_sfm2(1,4,t_high);           //顯示溫度
                        write_com(0x80+3);             //將光標移動到秒個位
                        write_com(0x0f);                    //顯示光標并且閃爍       
                }       
                if(menu_2 == 2)                        //設置低溫報警
                {
                        if(key_can == 3)
                        {
                                t_low ++ ;                        //設置低溫值加1
                                if(t_low >= t_high)
                                        t_low = t_high - 1;
                        }
                        if(key_can == 4)                         //設置高溫值減1
                        {
                                t_low -- ;                       
                                if(t_low <= 1)
                                        t_low = 1;
                        }
                        write_sfm2(1,11,t_low);   //顯示wen度       
                        write_com(0x80+10);            //將光標移動到秒個位
                        write_com(0x0f);                    //顯示光標并且閃爍       
                }
                if(menu_2 == 3)                        //設置高濕報警
                {
                        if(key_can == 3)
                        {
                                s_high ++ ;                //設置高濕值加1        
                                if(s_high > 99)
                                        s_high = 99;
                        }
                        if(key_can == 4)
                        {
                                s_high -- ;                //設置高濕值減1        
                                if(s_high <= s_low)
                                        s_high = s_low + 1;
                        }
                        write_sfm2(2,4,s_high);           //顯示濕度
                        write_com(0x80+0x40+3);             //將光標移動到秒個位
                        write_com(0x0f);                    //顯示光標并且閃爍       
                }       
                if(menu_2 == 4)                        //設置低濕報警
                {
                        if(key_can == 3)
                        {
                                s_low ++ ;                        //設置低濕值加1
                                if(s_low >= s_high)
                                        s_low = s_high - 1;
                        }
                        if(key_can == 4)                         //設置低濕值減1
                        {
                                s_low -- ;                       
                                if(s_low <= 1)
                                        s_low = 1;
                        }
                        write_sfm2(2,11,s_low);           //顯示濕度
                        write_com(0x80+0x40+10);            //將光標移動到秒個位
                        write_com(0x0f);                    //顯示光標并且閃爍       
                }
        }
////////////////////////設置光線///////////////////////////////
        if(menu_1 == 2)       
        {
                if(menu_2 == 1)                                                //設置強光報警
                {
                        if(key_can == 3)  //
                        {
                                 qiang_gx ++;                                   //加強光報警數據
                                if(qiang_gx >= 100)
                                        qiang_gx = 99;
                        }       
                        if(key_can == 4)  //
                        {
                                 qiang_gx --;                                   //減強光報警數據
                                if(qiang_gx <= ruo_gx)
                                        qiang_gx = ruo_gx;
                        }
                        write_sfm2(1,7,qiang_gx);
                        write_com(0x80+6);         //將光標移動到
                        write_com(0x0f);                //顯示光標并且閃爍               
                }       
                if(menu_2 == 2)                                                    //設置弱光報警
                {
                        if(key_can == 3)  //
                        {
                                 ruo_gx ++;                                    //加弱光報警數據
                                if(ruo_gx >= qiang_gx)
                                        ruo_gx = qiang_gx;
       
                        }       
                        if(key_can == 4)  //
                        {
                                 ruo_gx --;                                   //減強光報警數據
                                if(ruo_gx <= 1)
                                        ruo_gx = 1;
                        }
                        write_sfm2(2,7,ruo_gx);
                        write_com(0x80+0x40+6);              //將光標移動到
                        write_com(0x0f);                //顯示光標并且閃爍               
                }
        }
////////////////////////手動模式///////////////////////////////
        if(menu_1 == 3)       
        {
                if(menu_2 == 1)                                                //設置
                {
                        if((key_can == 3) || (key_can == 4))  //
                        {
                                sd_sd = ~sd_sd;   //手動打開和關閉水泵
                        }
                }       
                if(menu_2 == 2)                                                //設置
                {
                        if((key_can == 3) || (key_can == 4))  //
                        {
                                sd_wd = ~sd_wd;   //手動打開和關閉風扇
                        }
                }       
                if(menu_2 == 3)                                                //設置
                {
                        if((key_can == 3) || (key_can == 4))  //
                        {
                                sd_gx = ~sd_gx;   //手動打開和關閉風扇
                        }
                }       
                if(sd_sd == 1)          //手動打開水泵
                {
                        write_string(1,7,"Open");       
                        dianji = 0;       //打開電機       
                }
                else
                {
                        write_string(1,7,"Off ");       
                        dianji = 1;       //關閉電機       
                }

                if(sd_wd == 1)          //手動打開風扇
                {
                        write_string(2,3,"Open");       
                        fengshan = 0;       //打開風扇       
                }
                else
                {
                        write_string(2,3,"Off ");       
                        fengshan = 1;      //關閉風扇       
                }

                if(sd_gx == 1)          //手動打開繼電器補光
                {
                        write_string(2,11,"Open");       
                        relay = 0;       //打開       
                }
                else
                {
                        write_string(2,11,"Off ");       
                        relay = 1;       //關閉       
                }

                if(menu_2 == 1)                                       
                {
                        write_com(0x80+6);         //將光標移動到
                        write_com(0x0f);                //顯示光標并且閃爍               
                }       
                if(menu_2 == 2)                               
                {
                        write_com(0x80+0x40+2);         //將光標移動到
                        write_com(0x0f);                //顯示光標并且閃爍               
                }       
                if(menu_2 == 3)                               
                {
                        write_com(0x80+0x40+10);         //將光標移動到
                        write_com(0x0f);                //顯示光標并且閃爍               
                }       
        }
        key_can = 0;
}




/****************報警函數***************/
void clock_h_l()
{
//        static uchar value,value1,value2,value3,value4,value5,value6;
        if(shidu <= s_low)
        {
                        dianji = 0;       //打開電機
                        flag_sd = 1;
        }
       
        if(shidu >= s_high)
        {
                        dianji = 1;       //關閉電機
                        flag_sd = 0;
        }

/////////////////////////////////////
        if(temperature >= t_high)         //溫度過高
        {
                        if(temperature < 85)
                        {
                                flag_wd = 1;
                                fengshan = 0;       //打開風扇
                        }
        }

        if(temperature <= t_low)
        {
                        flag_wd = 0;
                        fengshan = 1;       //關閉風扇
        }
                  
/////////////////////////////////////
        if(guangxian >= qiang_gx)         //光線過高
        {
                        relay = 0;       //關閉繼電器補光       
        }

        if(guangxian <= ruo_gx)
        {
                relay = 1;       //打開繼電器補光  
        }
                  
        if((shidu <= s_low) || (temperature >= t_high) || (guangxian>= qiang_gx))
        {
                        if(flag_en == 1)
                                beep = ~beep;           //蜂鳴器報警
        }
        else
        {
                beep = 1;
                flag_en = 1;
        }
        }



/***************主函數*****************/
void main()
{
        beep = 0;                                    //開機蜂鳴器叫一聲
        delay_1ms(100);
        P0 = P1 = P2 = P3 = 0xff;   //初始化IO口
                                   //讀取溫度值
        init_1602();                           //1602液晶初始化
        delay_1ms(750);       
        while(1)
        {
                key();                                        //獨立按鍵程序
                if(key_can != 0)
                {                          
                        key_with();                        //按鍵按下要執行的程序
                }
       
        flag_250ms ++;
                if(flag_250ms >= 250)
                {               
                        flag_250ms = 0;          
                        clock_h_l();         //報警函數
                        temperature = read_temp();  //讀取溫度值
                        shidu = ad0832read(0);        //讀出濕度
                        shidu = ad0832read(0) * 99/ 255;
                        guangxian = ad0832read(1);            
                        guangxian = ad0832read(1) * 99.0 / 255;
                        if(menu_1 == 0)
                        {
                                write_sfm2(1,8,shidu);   //顯示濕度       
                                write_sfm2(2,4,temperature);           //顯示溫度
                                write_sfm2(2,11,guangxian);          //顯示光線       
                        }
                }
                delay_1ms(1);
        }
}









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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美视频一区二区三区 | 日本不卡免费新一二三区 | 国产精品一区久久久久 | 91视频大全 | 欧美日产国产成人免费图片 | 一级aaaa毛片 | 国产黄色电影 | 久在线 | 不卡的av在线 | 91视频.com| 日本三级网站在线 | 亚洲一区二区三区四区五区午夜 | 成人毛片视频免费 | 成人免费在线网 | 国产精品成人一区二区三区夜夜夜 | 亚洲国产精品一区二区第一页 | 日韩精品一区二区三区 | 欧美日韩在线一区二区三区 | 欧美日韩综合精品 | 天天玩天天干天天操 | 九九久久国产精品 | 欧美一区二区三区久久精品 | 久久日韩粉嫩一区二区三区 | 日日夜夜免费精品视频 | 久久中文字幕一区 | 亚洲成人毛片 | 亚洲精品国产综合区久久久久久久 | 91久久久精品国产一区二区蜜臀 | 久草视频观看 | 精品香蕉一区二区三区 | 日韩一区三区 | 91久久国产综合久久91精品网站 | 在线视频一区二区三区 | 精品国产免费人成在线观看 | 久久av网 | 国产精品免费视频一区 | 中文字幕高清 | 精品视频免费在线 | 婷婷综合 | 国产一区二区 | av电影一区 |