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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

這是一個單片機盆栽自動澆水系統(tǒng)的主程序,有沒有大佬解釋一下,每條程序的意思!

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:715024 發(fā)表于 2020-5-22 13:57 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include<stc12.h>
#include <stdio.h>
#include "lcd.h"
#include <intrins.h>
#include"ds1302.h"
#include "EEPROM.h"

#define uint unsigned int
#define uchar unsigned char

#define EEPROMFLAG        0X5A
//IO定義
sbit KEY_up = P2^2;
sbit KEY_down = P2^3;
sbit KEY_set = P2^4;
sbit LED = P2^3;
sbit Relay = P1^4;

//ADC0832端口定義
sbit ADC_DO = P1^1;
sbit ADC_CLK = P1^0;
sbit ADC_CS = P1^2;
/*-------------函數(shù)聲明----------------*/
void SysInit();
void delay_ms(uint ms);
void BuzzerVoice(void);
void KeyHandle(void);                        //按鍵處理函數(shù)
void GetHumidity(void);
void HumidityHandle(void);
uchar ADC0832(uchar channel);
void ClearBuffer(void);
void Read_EEPROM(void);
void Writer_EEPROM(void);
/*-------------變量定義-----------------*/
char Buffer[20]= {0};
uchar SysState = 0,CurrentMode = 0,SysCount = 0;
uint CurrentHumidity = 0;                //當(dāng)前濕度值
uchar MaxHumidity = 80,MinHumidity = 20;                        //濕度最值
uchar Sec_Pre = 60;
uchar KeyState = 0;
uchar RelayFlag = 0;
void main(void)
{
    SysInit();
        
    while(1)
    {
        KeyHandle();
        GetHumidity();                //獲取濕度
                HumidityHandle();                //濕度處理
    }
}


//啟動界面
void Display_Startup(void)
{
    uint temp=0,i;
    LcdWriteStr(1,2," System loadig");
    for(i=1; i<=16; i++)
    {
        delay_ms(100);
        LcdWriteChar(2,i,'.');
    }
    LcdClear();
    delay_ms(500);
}

//主界面
void Display_main(void)
{
    Ds1302ReadTime();
    LcdClear();
        CurrentHumidity = 100 - (ADC0832(0)/255.0)*100;
        LcdWriteNum(1,5,CurrentHumidity,3);
    LcdWriteStr(1,1,"Hum:   %   CLOSE");
    sprintf(Buffer,"20%02d/%02d/%02d %02d:%02d",(int)TIME[6],(int)TIME[4],(int)TIME[3],(int)TIME[2],(int)TIME[1]);                //輸出時間
    LcdWriteStr(2,1,Buffer);
}



void SysInit()
{
        P1M0 = 0X10;
        P1M1 = 0X00;
        Relay = 0;
    LcdInit();
        Display_Startup();
        Read_EEPROM();
    Display_main();

}

void Delay100us()                //@11.0592MHz
{
    unsigned char i;

    i = 43;
    while (--i);
}


//獲取AD值
uchar ADC0832(uchar channel)
{
    uchar i,ADC_Data;

    ADC_CS=0;
    ADC_Data=0;
    ADC_DO=0;
    Delay100us();

    ADC_CLK=0;
    Delay100us();
    ADC_DO=1;  //第一個脈沖  啟動AD轉(zhuǎn)換器
    ADC_CLK=1;
    Delay100us();
    ADC_CLK=0;

    Delay100us();
    ADC_CLK=1; // 第二的脈沖 送出1
    ADC_DO=1;
    Delay100us();
    ADC_CLK=0;

    Delay100us();

    if(channel == 0)
    {
        ADC_DO=0;
    }
    else
    {
        ADC_DO=1;
    }

    ADC_CLK=1;   //第三個脈沖 送出0
    Delay100us();
    ADC_CLK=0;

    ADC_DO=0;   //D1口轉(zhuǎn)為高阻態(tài)
    ADC_DO=1;   //D0口脫離高阻態(tài) 為輸出做準(zhǔn)備

    for (i=0; i<8; i++) //讀出數(shù)據(jù)
    {
        ADC_CLK=1;
        Delay100us();
        ADC_CLK=0;
        Delay100us();
        ADC_Data=(ADC_Data<<1)|ADC_DO;
    }
    ADC_CS=1;
    return(ADC_Data);
}

//獲取濕度
void GetHumidity(void)
{
    if(SysState == 0)
    {
        Ds1302ReadTime();
        if(Sec_Pre != TIME[0])
        {
            CurrentHumidity = 100 - (ADC0832(0)/255.0)*100;
            LcdWriteNum(1,5,CurrentHumidity,3);
            Sec_Pre = TIME[0];
            sprintf(Buffer,"20%02d/%02d/%02d %02d:%02d",(int)TIME[6],(int)TIME[4],(int)TIME[3],(int)TIME[2],(int)TIME[1]);                //輸出時間
            LcdWriteStr(2,1,Buffer);
        }
    }
}

void HumidityHandle(void)
{
    if(SysState == 0)
    {

                if(CurrentHumidity <= MinHumidity)
                {
                        if(RelayFlag != 1)
                        {
                                RelayFlag = 1;
                                Relay = 1;
                                LcdWriteStr(1,12,"OPEN ");
                        }
                }
                else if(CurrentHumidity >= MaxHumidity)
                {
                        if(RelayFlag != 0)
                        {
                                RelayFlag = 0;
                                Relay = 0;
                                LcdWriteStr(1,12,"CLOSE ");
                        }
                }
    }
}

//按鍵掃描
void KEY_Scan()
{
    static uchar KeyFlag = 0;
    if((KEY_up == 0 || KEY_down == 0 || KEY_set == 0)&& KeyFlag == 0)
    {
        delay_ms(10);
        if(KEY_up == 0)        KeyState = 1;
        else if(KEY_down == 0) KeyState = 2;
        else if(KEY_set == 0) KeyState = 3;

        if(KeyState != 0)
        {
            KeyFlag = 1;
        }
    }
    if(KeyFlag == 1)
    {
        if(KEY_up == 1 && KEY_down == 1 && KEY_set == 1)
            KeyFlag = 0;
    }
}

void Set_Handle()
{
    if(SysState  == 0)
    {
        SysState = 1;
        SysCount = 0;
        CurrentMode = 1;
        LcdClear();
        LcdWriteStr(2,1,"  Set Timer");
        LcdWriteStr(1,1,"->Set Humidity");
    }
    else
    {
        SysCount++;
        if(CurrentMode == 1)                //設(shè)置濃度
        {
            if(SysCount == 1)                //最大濃度
            {
                SysState = 2;
                                LcdClear();
                LcdWriteStr(1,1,"Max:");
                LcdWriteStr(2,1,"Min:");
                LcdWriteNum(1,5,MaxHumidity,3);
                LcdWriteNum(2,5,MinHumidity,3);
                                LcdWriteCom(0x80+4);        //定位光標(biāo)
                LcdWriteCom(0x0f);                //光標(biāo)閃爍
            } else if(SysCount == 2)                //最小濃度
            {
                LcdWriteCom(0xC0+4);        //定位光標(biāo)
            }
            else
            {
                                Writer_EEPROM();                //寫入數(shù)據(jù)
                                LcdWriteCom(0x0c);  //開顯示不顯示光標(biāo)
                SysState = 0;
                Display_main();
            }
        }
        else                //設(shè)置時間
        {
            if(SysCount == 1)
            {
                SysState = 2;
                LcdClear();
                LcdWriteStr(1,5,"Set Timer");
                Ds1302ReadTime();
                ClearBuffer();
                sprintf(Buffer,"20%02d/%02d/%02d %02d:%02d",(int)TIME[6],(int)TIME[4],(int)TIME[3],(int)TIME[2],(int)TIME[1]);                //輸出時間
                LcdWriteStr(2,1,Buffer);
                Buffer[0] = TIME[6];                 //年
                Buffer[1] = TIME[4];                 //月
                Buffer[2] = TIME[5];                 //日
                Buffer[3] = TIME[2];                 //時
                Buffer[4] = TIME[1];                 //分
                                LcdWriteCom(0xC0+2);        //定位光標(biāo)
                LcdWriteCom(0x0f);                //光標(biāo)閃爍
            }
                        else if(SysCount == 2)
                        {
                                LcdWriteCom(0xC0+5);        //定位光標(biāo)
                        }
                        else if(SysCount == 3)
                        {
                                LcdWriteCom(0xC0+8);        //定位光標(biāo)
                        }
                        else if(SysCount == 4)
                        {
                                LcdWriteCom(0xC0+11);        //定位光標(biāo)
                        }
                        else if(SysCount == 5)
                        {
                                LcdWriteCom(0xC0+14);        //定位光標(biāo)
                        }
                        else
                        {
                                TIME[6] = Buffer[0];                 //年
                                TIME[4] = Buffer[1];                 //月
                                TIME[5] = Buffer[2];                 //日
                                TIME[2] = Buffer[3];                 //時
                                TIME[1] = Buffer[4];                 //分
                                TIME[0] = 0;                                //秒
                                Ds1302WriteTime();
                                LcdWriteCom(0x0c);  //開顯示不顯示光標(biāo)
                                SysState = 0;
                Display_main();
                        }
        }
    }
}


//濕度設(shè)置
void Humidity_Set(void)
{
        if(SysCount == 1)
        {
                if(KeyState == 1)
                {
                        if(MaxHumidity < 100)
                                MaxHumidity++;
                }
                else
                {
                        if(MaxHumidity-1 > MinHumidity)
                                MaxHumidity--;
                }
                LcdWriteNum(1,5,MaxHumidity,3);
                LcdWriteCom(0x80+4);        //定位光標(biāo)
        }
        else
        {
                if(KeyState == 1)
                {
                        if(MinHumidity <= MaxHumidity-1)
                                MinHumidity++;
                }
                else
                {
                        if(MinHumidity > 0)
                                MinHumidity--;
                }
                LcdWriteNum(2,5,MinHumidity,3);
                LcdWriteCom(0xC0+4);        //定位光標(biāo)
        }
}

//時間處理
void Timer_Handle(void)
{
        if(SysCount == 1)                //年
        {
                if(KeyState == 1)
                        Buffer[0]++;
                else
                {
                        if(Buffer[0] > 0)
                                Buffer[0]--;
                }
                LcdWriteNum(2,3,Buffer[0],2);
                LcdWriteCom(0xC0+2);        //定位光標(biāo)
        }
        else if(SysCount == 2)                //月
        {
                if(KeyState == 1)
                {
                        if(Buffer[1] < 12)
                                Buffer[1]++;
                }
                else
                {
                        if(Buffer[1] > 1)
                                Buffer[1]--;
                }
                LcdWriteNum(2,6,Buffer[1],2);
                LcdWriteCom(0xC0+5);        //定位光標(biāo)
        }
        else if(SysCount == 3)                //日
        {
                if(KeyState == 1)
                {
                        if(Buffer[2] < 31)
                                Buffer[2]++;
                }
                else
                {
                        if(Buffer[2] > 1)
                                Buffer[2]--;
                }
                LcdWriteNum(2,9,Buffer[2],2);
                LcdWriteCom(0xC0+8);        //定位光標(biāo)
        }
        else if(SysCount == 4)                //時
        {
                if(KeyState == 1)
                {
                        if(Buffer[3] < 24)
                                Buffer[3]++;
                }
                else
                {
                        if(Buffer[3] > 0)
                                Buffer[3]--;
                }
                LcdWriteNum(2,12,Buffer[3],2);
                LcdWriteCom(0xC0+11);        //定位光標(biāo)
        }
        else if(SysCount == 5)                //分
        {
                if(KeyState == 1)
                {
                        if(Buffer[4] < 59)
                                Buffer[4]++;
                }
                else
                {
                        if(Buffer[4] > 0)
                                Buffer[4]--;
                }
                LcdWriteNum(2,15,Buffer[4],2);
                LcdWriteCom(0xC0+14);        //定位光標(biāo)
        }
}

void Up_Handle(void)
{
    if(SysState == 1)
    {
        CurrentMode = 1;
        LcdWriteStr(2,1,"  Set Timer");
        LcdWriteStr(1,1,"->Set Humidity");
    }
    else if(SysState == 2)
    {
        LcdWriteCom(0x0c);  //開顯示不顯示光標(biāo)
        if(CurrentMode == 1)                //濕度設(shè)置
        {
                        Humidity_Set();
        }
        else                                 //時間設(shè)置
        {
                        Timer_Handle();
        }
        LcdWriteCom(0x0f);                //光標(biāo)閃爍
    }
}

void Dec_Handle(void)
{
    if(SysState == 1)
    {
        CurrentMode = 2;
        LcdWriteStr(1,1,"  Set Humidity");
        LcdWriteStr(2,1,"->Set Timer");
    }
        else if(SysState == 2)
        {
                LcdWriteCom(0x0c);  //開顯示不顯示光標(biāo)
                if(CurrentMode == 1)                //濕度設(shè)置
        {
                        Humidity_Set();
                }
                else
                {
                        Timer_Handle();
                }
                LcdWriteCom(0x0f);                //光標(biāo)閃爍
        }
}

//按鍵處理
void KeyHandle(void)
{
    KEY_Scan();
    if(KeyState != 0)
    {
        switch(KeyState)
        {
        case 1:                        //增加按鍵
            Up_Handle();
            break;
        case 2:                        //減少按鍵
            Dec_Handle();
            break;
        case 3:                        //設(shè)置按鍵
            Set_Handle();
            break;
        }
        KeyState = 0;
    }
}

void ClearBuffer(void)
{
    uchar i;
    for(i=0; i<20; i++)
        Buffer[ i] = 0;
}

//寫入EEPROM
void Writer_EEPROM(void)
{
        IapEraseSector(0);
        IapProgramByte(0,EEPROMFLAG);
        IapProgramByte(1,MaxHumidity);
        IapProgramByte(2,MinHumidity);
}

//讀取EEPROM
void Read_EEPROM(void)
{
        uchar temp;
        temp = IapReadByte(0);
        if(temp != EEPROMFLAG)                //第一次寫入數(shù)據(jù)
        {
                MaxHumidity = 80;
                MinHumidity = 20;
                Writer_EEPROM();
        }
        else
        {
                MaxHumidity = IapReadByte(1);
                MinHumidity = IapReadByte(2);
        }
}
void delay_ms(uint ms)                //@11.0592MHz
{
    unsigned char i, j;

    while(ms--)
    {
        _nop_();
        i = 11;
        j = 120;
        do
        {
            while (--j);
        } while (--i);
    }
}

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

使用道具 舉報

沙發(fā)
ID:584814 發(fā)表于 2020-5-23 09:22 | 只看該作者
這么短的程序不值得逐條解釋要弄個萬行起步的才得勁
回復(fù)

使用道具 舉報

板凳
ID:715024 發(fā)表于 2020-5-23 14:26 | 只看該作者
man1234567 發(fā)表于 2020-5-23 09:22
這么短的程序不值得逐條解釋要弄個萬行起步的才得勁

拜托能不能幫我解釋一下,大佬~
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 成人不卡视频 | 日韩在线一区二区三区 | 一区二区精品 | 亚洲激精日韩激精欧美精品 | 国产亚洲精品一区二区三区 | 亚洲视频二区 | 岛国毛片在线观看 | 国产黄色在线观看 | av中文字幕在线播放 | 成人免费视频7777777 | 久久久久国产一区二区三区四区 | 日韩中文字幕 | 亚洲欧美另类在线 | 91精品国产综合久久国产大片 | 国产传媒在线播放 | 精产国产伦理一二三区 | 毛片免费视频 | 精品久久九 | 羞羞视频在线观看网站 | 日本三级网址 | 国产精品自拍视频网站 | 日韩久久久一区二区 | a免费视频 | 99re热精品视频国产免费 | 国产乱码精品一区二区三区五月婷 | 中文字幕第一页在线 | 午夜爽爽男女免费观看hd | 久久久高清 | 中文在线一区 | 国产激情视频 | 剑来高清在线观看 | 97精品视频在线观看 | 久草影视在线 | 黑人巨大精品欧美一区二区免费 | 黄色毛片黄色毛片 | 欧美日韩一本 | 9191在线播放 | 国产综合久久久久久鬼色 | 一级a爱片久久毛片 | 国产亚洲一区二区三区 | 在线观看中文字幕 |