找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 7430|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

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

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:215752 發(fā)表于 2017-6-29 11:08 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
#include <reg52.h>                 //調(diào)用單片機(jī)頭文件
#define uchar unsigned char  //無符號(hào)字符型 宏定義        變量范圍0~255
#define uint  unsigned int         //無符號(hào)整型 宏定義        變量范圍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;     //濕度等級(jí)
uchar s_high ,s_low;        //濕度報(bào)警參數(shù)

uint t_high ,t_low ;        //溫度報(bào)警參數(shù)


sbit dianji = P1^6;     //電機(jī)IO定義
sbit fengshan = P2^7;     //風(fēng)扇IO定義
sbit relay = P2^0;     //繼電器IO定義

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


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

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

/********************************************************************
* 名稱 : write_com(uchar com)
* 功能 : 1602命令函數(shù)
* 輸入 : 輸入的命令值
* 輸出 : 無
***********************************************************************/
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寫數(shù)據(jù)函數(shù)
* 輸入 : 需要寫入1602的數(shù)據(jù)
* 輸出 : 無
***********************************************************************/
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位十進(jìn)制數(shù),如果要讓第一行,第五個(gè)字符開始顯示"23" ,調(diào)用該函數(shù)如下
                  write_sfm1(1,5,23)
* 輸入 : 行,列,需要輸入1602的數(shù)據(jù)
* 輸出 : 無
***********************************************************************/
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)
* 功能 : 改變液晶中某位的值,如果要讓第一行,第五個(gè)字符開始顯示"ab cd ef" ,調(diào)用該函數(shù)如下
                  write_string(1,5,"ab cd ef;")
* 輸入 : 行,列,需要輸入1602的數(shù)據(jù)
* 輸出 : 無
***********************************************************************/
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延時(shí)函數(shù)*****************************/
void delay_1ms(uint q)
{
        uint i,j;
        for(i=0;i<q;i++)
                for(j=0;j<120;j++);
}

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

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

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

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

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


/***********讀數(shù)模轉(zhuǎn)換數(shù)據(jù)********************************************************/       
//請(qǐng)先了解ADC0832模數(shù)轉(zhuǎn)換的串行協(xié)議,再來讀本函數(shù),主要是對(duì)應(yīng)時(shí)序圖來理解,本函數(shù)是模擬0832的串行協(xié)議進(jìn)行的
                                                //  1  0  0 通道
                                                //  1  1  1 通道
uchar ad0832read(uchar channel)
{
        uchar i,value1,value2;               
                SCL=0;
                DO=1;
                CS=0;                //開始
                SCL=1;                //第一個(gè)上升沿       
               
                SCL=0;
                DO=1;
                SCL=1;          //第二個(gè)上升沿

                SCL=0;
                DO=channel;
                SCL=1;
                SCL=0;            //第三個(gè)上升沿
                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;//數(shù)據(jù)讀取完成,釋放總線
                if(value1==value2)       
        return value2;
                return 0;
            
       
}


/********************獨(dú)立按鍵程序*****************/
uchar key_can;         //按鍵值

void key()         //獨(dú)立按鍵程序
{
        static uchar key_new;
        key_can = 20;                   //按鍵值還原
        P3 |= 0xf0;
        if((P3 & 0xf0) != 0xf0)                //按鍵按下
        {
                delay_1ms(1);                     //按鍵消抖動(dòng)
                if(((P3 & 0xf0) != 0xf0) && (key_new == 1))
                {                                                //確認(rèn)是按鍵按下
                        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;       
}


/****************按鍵顯示函數(shù)***************/
void key_with()
{
        if(menu_1 == 0)
        {
                if(key_can == 3)
                {
                        flag_en = 0;   //手動(dòng)取消報(bào)警
                        beep = 1;   //關(guān)閉蜂鳴器
                }
        }
        if(key_can == 1)           //設(shè)置鍵
        {
                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);         //設(shè)置光線的參數(shù)
                        write_com(0x80+6);              //將光標(biāo)移動(dòng)到
                        write_com(0x0f);                //顯示光標(biāo)并且閃爍       
                }       
                if(menu_1 == 3)                                 //初始化顯示
                {
                        write_string(1,0,"    Sd:         ");       
                        write_string(2,0," W:     GX:     ");       
                        write_com(0x80+6);              //將光標(biāo)移動(dòng)到
                        write_com(0x0f);                //顯示光標(biāo)并且閃爍       
                }       
                menu_2 = 1;       
        }
        if(key_can == 2)        //選擇鍵
        {
                if(menu_1 == 1)                  //設(shè)置
                {
                        menu_2 ++;
                        if(menu_2 > 4)
                                menu_2 = 1;
                }
                if(menu_1 == 2)                 //設(shè)置
                {
                        menu_2 ++;
                        if(menu_2 > 2)
                                menu_2 = 1;                               
                }
                if(menu_1 == 3)                 //設(shè)置
                {
                        menu_2 ++;
                        if(menu_2 > 3)
                                menu_2 = 1;                               
                }
        }
        if(menu_1 == 1)       
        {
                if(menu_2 == 1)                        //設(shè)置高溫報(bào)警
                {
                        if(key_can == 3)
                        {
                                t_high ++ ;                //設(shè)置高溫值加1        
                                if(t_high > 99)
                                        t_high = 99;
                        }
                        if(key_can == 4)
                        {
                                t_high -- ;                //設(shè)置高溫值減1        
                                if(t_high <= t_low)
                                        t_high = t_low + 1;
                        }
                        write_sfm2(1,4,t_high);           //顯示溫度
                        write_com(0x80+3);             //將光標(biāo)移動(dòng)到秒個(gè)位
                        write_com(0x0f);                    //顯示光標(biāo)并且閃爍       
                }       
                if(menu_2 == 2)                        //設(shè)置低溫報(bào)警
                {
                        if(key_can == 3)
                        {
                                t_low ++ ;                        //設(shè)置低溫值加1
                                if(t_low >= t_high)
                                        t_low = t_high - 1;
                        }
                        if(key_can == 4)                         //設(shè)置高溫值減1
                        {
                                t_low -- ;                       
                                if(t_low <= 1)
                                        t_low = 1;
                        }
                        write_sfm2(1,11,t_low);   //顯示wen度       
                        write_com(0x80+10);            //將光標(biāo)移動(dòng)到秒個(gè)位
                        write_com(0x0f);                    //顯示光標(biāo)并且閃爍       
                }
                if(menu_2 == 3)                        //設(shè)置高濕報(bào)警
                {
                        if(key_can == 3)
                        {
                                s_high ++ ;                //設(shè)置高濕值加1        
                                if(s_high > 99)
                                        s_high = 99;
                        }
                        if(key_can == 4)
                        {
                                s_high -- ;                //設(shè)置高濕值減1        
                                if(s_high <= s_low)
                                        s_high = s_low + 1;
                        }
                        write_sfm2(2,4,s_high);           //顯示濕度
                        write_com(0x80+0x40+3);             //將光標(biāo)移動(dòng)到秒個(gè)位
                        write_com(0x0f);                    //顯示光標(biāo)并且閃爍       
                }       
                if(menu_2 == 4)                        //設(shè)置低濕報(bào)警
                {
                        if(key_can == 3)
                        {
                                s_low ++ ;                        //設(shè)置低濕值加1
                                if(s_low >= s_high)
                                        s_low = s_high - 1;
                        }
                        if(key_can == 4)                         //設(shè)置低濕值減1
                        {
                                s_low -- ;                       
                                if(s_low <= 1)
                                        s_low = 1;
                        }
                        write_sfm2(2,11,s_low);           //顯示濕度
                        write_com(0x80+0x40+10);            //將光標(biāo)移動(dòng)到秒個(gè)位
                        write_com(0x0f);                    //顯示光標(biāo)并且閃爍       
                }
        }
////////////////////////設(shè)置光線///////////////////////////////
        if(menu_1 == 2)       
        {
                if(menu_2 == 1)                                                //設(shè)置強(qiáng)光報(bào)警
                {
                        if(key_can == 3)  //
                        {
                                 qiang_gx ++;                                   //加強(qiáng)光報(bào)警數(shù)據(jù)
                                if(qiang_gx >= 100)
                                        qiang_gx = 99;
                        }       
                        if(key_can == 4)  //
                        {
                                 qiang_gx --;                                   //減強(qiáng)光報(bào)警數(shù)據(jù)
                                if(qiang_gx <= ruo_gx)
                                        qiang_gx = ruo_gx;
                        }
                        write_sfm2(1,7,qiang_gx);
                        write_com(0x80+6);         //將光標(biāo)移動(dòng)到
                        write_com(0x0f);                //顯示光標(biāo)并且閃爍               
                }       
                if(menu_2 == 2)                                                    //設(shè)置弱光報(bào)警
                {
                        if(key_can == 3)  //
                        {
                                 ruo_gx ++;                                    //加弱光報(bào)警數(shù)據(jù)
                                if(ruo_gx >= qiang_gx)
                                        ruo_gx = qiang_gx;
       
                        }       
                        if(key_can == 4)  //
                        {
                                 ruo_gx --;                                   //減強(qiáng)光報(bào)警數(shù)據(jù)
                                if(ruo_gx <= 1)
                                        ruo_gx = 1;
                        }
                        write_sfm2(2,7,ruo_gx);
                        write_com(0x80+0x40+6);              //將光標(biāo)移動(dòng)到
                        write_com(0x0f);                //顯示光標(biāo)并且閃爍               
                }
        }
////////////////////////手動(dòng)模式///////////////////////////////
        if(menu_1 == 3)       
        {
                if(menu_2 == 1)                                                //設(shè)置
                {
                        if((key_can == 3) || (key_can == 4))  //
                        {
                                sd_sd = ~sd_sd;   //手動(dòng)打開和關(guān)閉水泵
                        }
                }       
                if(menu_2 == 2)                                                //設(shè)置
                {
                        if((key_can == 3) || (key_can == 4))  //
                        {
                                sd_wd = ~sd_wd;   //手動(dòng)打開和關(guān)閉風(fēng)扇
                        }
                }       
                if(menu_2 == 3)                                                //設(shè)置
                {
                        if((key_can == 3) || (key_can == 4))  //
                        {
                                sd_gx = ~sd_gx;   //手動(dòng)打開和關(guān)閉風(fēng)扇
                        }
                }       
                if(sd_sd == 1)          //手動(dòng)打開水泵
                {
                        write_string(1,7,"Open");       
                        dianji = 0;       //打開電機(jī)       
                }
                else
                {
                        write_string(1,7,"Off ");       
                        dianji = 1;       //關(guān)閉電機(jī)       
                }

                if(sd_wd == 1)          //手動(dòng)打開風(fēng)扇
                {
                        write_string(2,3,"Open");       
                        fengshan = 0;       //打開風(fēng)扇       
                }
                else
                {
                        write_string(2,3,"Off ");       
                        fengshan = 1;      //關(guān)閉風(fēng)扇       
                }

                if(sd_gx == 1)          //手動(dòng)打開繼電器補(bǔ)光
                {
                        write_string(2,11,"Open");       
                        relay = 0;       //打開       
                }
                else
                {
                        write_string(2,11,"Off ");       
                        relay = 1;       //關(guān)閉       
                }

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




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

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

        if(temperature <= t_low)
        {
                        flag_wd = 0;
                        fengshan = 1;       //關(guān)閉風(fēng)扇
        }
                  
/////////////////////////////////////
        if(guangxian >= qiang_gx)         //光線過高
        {
                        relay = 0;       //關(guān)閉繼電器補(bǔ)光       
        }

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



/***************主函數(shù)*****************/
void main()
{
        beep = 0;                                    //開機(jī)蜂鳴器叫一聲
        delay_1ms(100);
        P0 = P1 = P2 = P3 = 0xff;   //初始化IO口
                                   //讀取溫度值
        init_1602();                           //1602液晶初始化
        delay_1ms(750);       
        while(1)
        {
                key();                                        //獨(dú)立按鍵程序
                if(key_can != 0)
                {                          
                        key_with();                        //按鍵按下要執(zhí)行的程序
                }
       
        flag_250ms ++;
                if(flag_250ms >= 250)
                {               
                        flag_250ms = 0;          
                        clock_h_l();         //報(bào)警函數(shù)
                        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空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表