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

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1545|回復(fù): 1
收起左側(cè)

單片機(jī)節(jié)能路燈源程序

[復(fù)制鏈接]
ID:657980 發(fā)表于 2019-12-7 16:03 | 顯示全部樓層 |閱讀模式
/*時(shí)鐘顯示1602
獨(dú)立鍵盤(pán)(P1口)設(shè)置時(shí)鐘(K1設(shè)置時(shí)分秒星期年月日,K2加一,K3減一)        */


#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define AddWr 0x90   //寫(xiě)數(shù)據(jù)地址
#define AddRd 0x91   //讀數(shù)據(jù)地址
sbit Sda=P2^7;       //定義總線(xiàn)連接端口
sbit Scl=P2^6;        
//DS1302控制端口定義
sbit CE=P1^4;
sbit SDA=P1^5;
sbit SCLK=P1^6;

//LCD1602控制端口定義
sbit LCD_RS = P1^0;                                                        
sbit LCD_RW = P1^1;                                                                                                                                                           
sbit LCD_EN = P1^2;

//獨(dú)立按鍵定義
sbit K1=P3^7;                //功能鍵
sbit K2=P3^6;                //增大鍵
sbit K3=P3^5;                //減小鍵
sbit K5=P3^4;                //確定
sbit K6=P3^3;                //強(qiáng)制關(guān)閉
sbit K7=P3^2;                //恢復(fù)
sbit K4=P2^5;                //紅外
sbit jd=P2^3;
uchar K6FLAG=0,K7FLAG=0,gflag=0;
bit k=0;
//bit ADFlag;          //定義AD采樣標(biāo)志位
uchar  table[]={"0123456789a"};
//屏幕初始化圖標(biāo)
uchar  table1[]={" 2017-  -       "};
uchar  table2[]={"   :  :         "};

//星期LOGO
uchar code table3[]={"MON TUE WED THU FRI SAT SUN"};
uchar  table4[]={"DSL:00    DSH:08"};
//uchar TempData[]={"000"};
//uchar  table5[]={"shezhi:         "};
//初始化   年 月 日 星期 時(shí) 分 秒
char year_h,year_l,month_h,month_l,day_h,day_l,hour_h,hour_l,min_h,min_l,sec_h,sec_l,date=3;
uchar year=0x17,month=1,day=1,hour=0,min=0,sec=0;
int hourn=0;min1=0;sec1=0;  //設(shè)置鬧鐘
uchar dsh=8,dsl=0;
uchar K1num=0;
uchar flag=0;
//聲明延時(shí)函數(shù)毫秒級(jí)
void delay1ms(uint ms);

/*******************************************************************************************
*                               以下為DS1302驅(qū)動(dòng)程序                                       *
*******************************************************************************************/

/***********************************/
/*             延時(shí)程序                            */
/***********************************/

void delayus()
{
    ;                                                            
    ;                                                            
    ;
}

uchar DS1302_Read(uchar address)
{


         uchar i,temp=0x00;
        CE=0;
        SDA=1;
         SCLK=0;
         CE=1;

        for (i=0;i<8;i++)             //循環(huán)8次 寫(xiě)入地址數(shù)據(jù)
        {
                   SCLK=0;
                SDA=address&0x01;             //每次傳輸?shù)妥止?jié)
             address>>=1;                  //右移一位
             SCLK=1;
        }
        delay1ms(1);
        if(SDA)
                 temp|=0x80;                        //每次傳輸?shù)妥止?jié)
        SCLK=0;
        temp>>=1;
         for (i=0;i<7;i++)                 //循環(huán)8次 讀取數(shù)據(jù)
         {
                SCLK=0;
                if(SDA)
                         temp|=0x80;                        //每次傳輸?shù)妥止?jié)
                SCLK=1;
                temp>>=1;                        //右移一位
        }

        SCLK=1;
        CE=0;
        SDA=0;
        return temp;                        //返回
}

void  DS1302_Write(uchar address,uchar dat)
{
         
    uchar i;
           CE=0;
         SCLK=0;
         CE=1;        

        for (i=0;i<8;i++)             //循環(huán)8次 寫(xiě)入地址數(shù)據(jù)
        {
                   SCLK=0;
        _nop_();
                SDA=address&0x01;             //每次傳輸?shù)妥止?jié)
             address>>=1;                  //右移一位
             SCLK=1;
        _nop_();
        }
        for (i=0;i<8;i++)             //循環(huán)8次 寫(xiě)入數(shù)據(jù)
        {
                   SCLK=0;
        _nop_();
                SDA=dat&0x01;             //每次傳輸?shù)妥止?jié)
             dat>>=1;                  //右移一位                DSCLK=1
                SCLK=1;
        _nop_();
        }
        CE=0;
        _nop_();
}


void DS1302_initW()                                        //初始化時(shí)間設(shè)置(寫(xiě))
{
        DS1302_Write(0x8e,0x00);                //寫(xiě)保護(hù)關(guān)
        DS1302_Write(0x80,sec);                        //秒
        DS1302_Write(0x82,min);                        //分
        DS1302_Write(0x84,hour);                //時(shí)
        DS1302_Write(0x86,day);                        //日
        DS1302_Write(0x88,month);                //月
        DS1302_Write(0x8a,date);                //周
        DS1302_Write(0x8c,year);                //年
        DS1302_Write(0x8e,0x80);                //寫(xiě)保護(hù)開(kāi)
}


void DS1302_initR()
{
        sec=DS1302_Read(0x81);                        //讀秒數(shù)據(jù)
        min=DS1302_Read(0x83);                        //讀分鐘數(shù)據(jù)
        hour=DS1302_Read(0x85);                        //讀小時(shí)數(shù)據(jù)
        date=DS1302_Read(0x8b);                        //讀星期數(shù)據(jù)
        day=DS1302_Read(0x87);                        //讀日數(shù)據(jù)
        month=DS1302_Read(0x89);                //讀月數(shù)據(jù)
        year=DS1302_Read(0x8d);                        //讀年數(shù)據(jù)
}

/*******************************************************************************************
*                               以上為DS1302驅(qū)動(dòng)程序                                       *
*******************************************************************************************/



/*******************************************************************************************
*                               以下為L(zhǎng)CD1602驅(qū)動(dòng)顯示程序                                  *
*******************************************************************************************/
void delay1ms(uint ms)                                //延時(shí)程序1ms
{
        uint i,j;
        for(i=ms;i>0;i--)
                for(j=110;j>0;j--);
}



void LCD_writecom(uchar com)                   //寫(xiě)命令
{
        LCD_RS=0;
        LCD_RW=0;
        LCD_EN=1;
        delay1ms(2);
        P0=com;
        LCD_EN=0;
        delay1ms(2);               
}

void LCD_writedat(uchar dat)                //寫(xiě)數(shù)據(jù)
{
        LCD_RS=1;
        LCD_RW=0;
        LCD_EN=1;
        delay1ms(2);
        P0=dat;
        LCD_EN=0;
        delay1ms(2);               
}


void init()
{
        LCD_EN=0;
        LCD_writecom(0x38);                //工作方式設(shè)置(8位數(shù)據(jù)接口;兩行顯示;5*7點(diǎn)陣字符)
        LCD_writecom(0x06);                //輸入方式設(shè)置(數(shù)據(jù)讀寫(xiě)操作后AC自動(dòng)加1;數(shù)據(jù)讀寫(xiě)操作后畫(huà)面不移動(dòng))
        LCD_writecom(0x0C);                //顯示開(kāi)關(guān)控制(開(kāi)顯示,關(guān)光標(biāo),關(guān)閃爍)
        LCD_writecom(0x01);                //清屏
}


void display1()                                                  //初始化屏幕 格式: 20  -  -  
{                                                                          //                                         :  :                                                        
        uchar num;
        init();
        LCD_writecom(0x80);
        for(num=0;num<12;num++)
        {
                LCD_writedat(table1[num]);
                delay1ms(2);        
        }
        LCD_writecom(0x80+0x40);
        for(num=0;num<15;num++)
        {
            
                LCD_writedat(table2[num]);
                delay1ms(2);
        
        }
        
}

void display2(uchar date)
{
        uchar num;
        LCD_writecom(0x80+12);
        if(date==1)                                                                 //星期一
        {
                for(num=0;num<3;num++)
                {
                        LCD_writedat(table3[num]);
                        delay1ms(2);        
                }
        }
        if(date==2)                                                           //星期二
        {
                for(num=4;num<7;num++)
                {
                        LCD_writedat(table3[num]);
                        delay1ms(2);        
                }
        }
        if(date==3)                                                           //星期三
        {
                for(num=8;num<11;num++)
                {
                        LCD_writedat(table3[num]);
                        delay1ms(2);        
                }
        }
        if(date==4)                                                           //星期四
        {
                for(num=12;num<15;num++)
                {
                        LCD_writedat(table3[num]);
                        delay1ms(2);        
                }
        }                                                                           //星期五
        if(date==5)
        {
                for(num=16;num<19;num++)
                {
                        LCD_writedat(table3[num]);
                        delay1ms(2);        
                }
        }
        if(date==6)                                                                //星期六
        {
                for(num=20;num<23;num++)
                {
                        LCD_writedat(table3[num]);
                        delay1ms(2);        
                }
        }                                                                                //星期日
        if(date==7)
        {
                for(num=24;num<27;num++)
                {
                        LCD_writedat(table3[num]);
                        delay1ms(2);        
                }
        }
}

void write_sfm(uchar add,char date)                  //時(shí)分秒寫(xiě)入顯示
{
        char shi,ge;
        shi=date/16;
        ge=date%16;
        LCD_writecom(0x80+0x40+add);
        LCD_writedat(0x30+shi);
        LCD_writedat(0x30+ge);
}


void write_nyrx(uchar add,char date)           //年月日星期寫(xiě)入顯示
{
        char shi,ge;
        shi=date/16;
        ge=date%16;
        LCD_writecom(0x80+add);
        LCD_writedat(0x30+shi);
        LCD_writedat(0x30+ge);
}

/*******************************************************************************************
*                               以上為L(zhǎng)CD1602驅(qū)動(dòng)顯示程序                                  *
*******************************************************************************************/





void display3()                                                                 //時(shí)間顯示程序
{
        if(k==0)                                                                   //時(shí)間顯示停止控制標(biāo)志        
        {
            DS1302_initR();
                write_sfm(7,sec);
                write_sfm(4,min);
                write_sfm(1,hour);
                write_nyrx(3,year);
                write_nyrx(6,month);
                write_nyrx(9,day);
                display2(date);

        }
}



void keyscan()                                                           //鍵盤(pán)掃描
{
    char K5FLAG=0;
        display3();
        if(K5==0)
        {
         delay1ms(5);
         if(K5==0)
         {
          K5FLAG=1;
         }
        }
        if(K1num>0&& K5FLAG==1)
        {
                LCD_writecom(0x0c);
                gflag=0;
                K1num=0;
                K5FLAG=0;                                          //K1按鍵計(jì)數(shù)清零
                k=0;                                                  //時(shí)間繼續(xù)走
                write_sfm(7,sec);
                write_sfm(4,min);
                write_sfm(1,hour);
                write_nyrx(3,year);
                write_nyrx(6,month);
                write_nyrx(9,day);               
                display2(date);
                DS1302_initW();                                        //將設(shè)置的時(shí)間日期等寫(xiě)入DS1302中
                DS1302_Write(0x8e,0x80);                //寫(xiě)保護(hù)開(kāi)
        }
        if(K1==0)
        {
                delay1ms(5);
                if(K1==0)
                {
                        K1num++;
                        gflag++;                                          
                        while(!K1);                                                 //K1按鍵計(jì)數(shù)
                        k=1;
                        DS1302_Write(0x8e,0x00);                //寫(xiě)保護(hù)關(guān)

                        switch(K1num)
                        {
                                case 1:LCD_writecom(0x80+0x40+8);
                                                        LCD_writecom(0x0f);
                                                        k=1;                                          //時(shí)間暫停顯示
                                                        break;
                                case 2:LCD_writecom(0x80+0x40+5);
                                                        
                                                        break;
                                case 3:LCD_writecom(0x80+0x40+2);
                                                        
                                                        break;
                                case 4:LCD_writecom(0x80+14);
                                                        
                                                        break;
                                case 5:LCD_writecom(0x80+10);
                                                        
                                                        break;
                                case 6:LCD_writecom(0x80+7);
                                                        
                                                        break;
                                case 7:LCD_writecom(0x80+4);
                                                        
                                                        break;
                                case 8:LCD_writecom(0x01);
                                                        
                                                        break;
                                case 10:LCD_writecom(0x0c);
                                                        K1num=0;                                          //K1按鍵計(jì)數(shù)清零
                                                        k=0;                                                  //時(shí)間繼續(xù)走
                                                        
                                                      write_sfm(7,sec);
                                                        write_sfm(4,min);
                                                        write_sfm(1,hour);
                                                        write_nyrx(3,year);
                                                        write_nyrx(6,month);
                                                        write_nyrx(9,day);

                                                        display2(date);

                                                        DS1302_initW();                                        //將設(shè)置的時(shí)間日期等寫(xiě)入DS1302中
                                                        DS1302_Write(0x8e,0x80);                //寫(xiě)保護(hù)開(kāi)
                                                        break;
                        }
               
                }
        }
        if(K1num!=0)                                                        //如果K1按下進(jìn)行以下操作
        {
                if(K2==0)                                                        //K1按下進(jìn)行K2按鍵檢測(cè)
                {
                        delay1ms(5);
                        if(K2==0)
                        {
                                while(!K2);
                                switch(K1num)
                                {                                                                                                        //秒++
                                        case 1:                DS1302_initW();                                         
                                                                sec_h=sec/16;
                                                                sec_l=sec%16;
                                                                sec_l++;
                                                                if(sec_l==10)
                                                                {        
                                                                        sec_l=0;
                                                                        sec_h++;
                                                                }
                                                                if(sec_h==6)
                                                                        sec_h=0;
                                                                sec=sec_h*16+sec_l;
                                                                write_sfm(7,sec);
                                                                LCD_writecom(0x80+0x40+8);
                                          
                                                                break;

                                        case 2:                min_h=min/16;                                                 //分++
                                                                min_l=min%16;
                                                                min_l++;
                                                                if(min_l==10)
                                                                {        
                                                                        min_l=0;
                                                                        min_h++;
                                                                }
                                                                if(min_h==6)
                                                                        min_h=0;
                                                                min=min_h*16+min_l;
                                                                write_sfm(4,min);
                                                                LCD_writecom(0x80+0x40+5);
                                                                break;
                                                               
                                        case 3:                hour_h=hour/16;
                                                                hour_l=hour%16;                                                  //時(shí)++
                                                        
                                                                if(hour_h==2)
                                                                {
                                                                        if(hour_l>3)
                                                                        {
                                                                                
                                                                                hour_h=0;
                                                                                hour_l=0;
                                                                        }
                                                                }
                                                                hour_l++;
                                                                if(hour_l==10)
                                                                {
                                                                        hour_l=0;
                                                                        hour_h++;
                                                                }
                                                                if((hour_h==2)&&(hour_l>3))
                                                                {
                                                                        hour_h=0;
                                                                        hour_l=0;
                                                                }
                                                                hour=hour_h*16+hour_l;
                                                                write_sfm(1,hour);
                                                                LCD_writecom(0x80+0x40+2);
                                                                break;
                                                               
                                        case 4:                date++;
                                                                if(date==8)
                                                                        date=1;
                                                                display2(date);
                                                                LCD_writecom(0x80+14);
                                                                break;
                                                               
                                        case 5:                day_h=day/16;
                                                                day_l=day%16;
                                                        
                                                                if(day_h==3)
                                                                {
                                                                        if(day_l>1)
                                                                        {
                                                                                
                                                                                day_h=0;
                                                                                day_l=1;
                                                                        }
                                                                }
                                                                day_l++;
                                                                if(day_l==10)
                                                                {
                                                                        day_l=0;
                                                                        day_h++;
                                                                }
                                                                if((day_h==3)&&(day_l>1))
                                                                {
                                                                        day_h=0;
                                                                        day_l=1;
                                                                }
                                                                day=day_h*16+day_l;
                                                                write_nyrx(9,day);
                                                                LCD_writecom(0x80+10);
                                                                break;
                                                               
                                        case 6:                month_h=month/16;                                                  //月++
                                                                month_l=month%16;                                                  
                                                        
                                                                if(month_h==1)
                                                                {
                                                                        if(month_l>2)
                                                                        {
                                                                                
                                                                                month_h=0;
                                                                                month_l=1;
                                                                        }
                                                                }
                                                                month_l++;
                                                                if(month_l==10)
                                                                {
                                                                        month_l=0;
                                                                        month_h++;
                                                                }
                                                                if((month_h==1)&&(month_l>2))
                                                                {
                                                                        month_h=0;
                                                                        month_l=1;
                                                                }
                                                                month=month_h*16+month_l;
                                                                write_nyrx(6,month);
                                                                LCD_writecom(0x80+7);
                                                                break;
                                                               
                                        case 7:                year_h=year/16;
                                                                year_l=year%16;
                                                                year_l++;
                                                                if(year_l==10)
                                                                {        
                                                                        year_l=0;
                                                                        year_h++;
                                                                }
                                                                if(year_h==6)
                                                                        year_h=0;
                                                                year=year_h*16+year_l;
                                                                write_nyrx(3,year);
                                                                LCD_writecom(0x80+4);
                                                                break;

                                        case 10:        LCD_writecom(0x0c);
                                                                K1num=0;
                                                                k=0;
                                                              display2(date);
                                                                display3();  
                                                                DS1302_Write(0x8e,0x80);                //寫(xiě)保護(hù)開(kāi)
                                                                break;                        
                                }
                        }
                }
                if(K3==0)                                                //K1按下進(jìn)行K3按鍵檢測(cè)
                {
                        delay1ms(5);
                        if(K3==0)
                        {
                                while(!K3);
                                switch(K1num)
                                {
                                        case 1:                sec_h=sec/16;
                                                                sec_l=sec%16;
                                                                sec_l--;
                                                                if(sec_l==-1)
                                                                {        
                                                                        sec_l=9;
                                                                        sec_h--;
                                                                }
                                                                if(sec_h==-1)
                                                                        sec_h=5;
                                                                sec=sec_h*16+sec_l;
                                                                write_sfm(7,sec);
                                                                LCD_writecom(0x80+0x40+8);
                                          
                                                                break;

                                        case 2:                min_h=min/16;
                                                                min_l=min%16;
                                                                min_l--;
                                                                if(min_l==-1)
                                                                {        
                                                                        min_l=9;
                                                                        min_h--;
                                                                }
                                                                if(min_h==-1)
                                                                        min_h=5;
                                                                min=min_h*16+min_l;
                                                                write_sfm(4,min);
                                                                LCD_writecom(0x80+0x40+5);
                                                                break;
                                                               
                                        case 3:                hour_h=hour/16;
                                                                hour_l=hour%16;
                                                                hour_l--;
                                                                if(hour_l==-1)
                                                                {        
                                                                        hour_l=9;
                                                                        hour_h--;
                                                                }
                                                                if(hour_h==-1)
                                                                {        
                                                                        hour_h=2;
                                                                        hour_l=3;
                                                                }
                                                                hour=hour_h*16+hour_l;
                                                                write_sfm(1,hour);
                                                                LCD_writecom(0x80+0x40+2);
                                                                break;
                                                               
                                        case 4:                date--;
                                                                if(date==0)
                                                                        date=7;
                                                                display2(date);
                                                                LCD_writecom(0x80+14);
                                                                break;
                                                               
                                        case 5:                day_l--;
                                                                if(day_l==-1)
                                                                {        
                                                                        day_l=9;
                                                                        day_h--;
                                                                }
                                                                if(day_h==-1)
                                                                {        
                                                                        day_h=3;
                                                                        day_l=1;
                                                                }
                                                                if((day_h==0)&&(day_l==0))
                                                                {
                                                                        day_h=3;
                                                                        day_l=1;
                                                                }
                                                                day=day_h*16+day_l;
                                                                write_nyrx(9,day);
                                                                LCD_writecom(0x80+10);
                                                                break;
                                                               
                                        case 6:                month_l--;
                                                                if(month_l==-1)
                                                                {        
                                                                        month_l=9;
                                                                        month_h--;
                                                                }
                                                                if(month_h==-1)
                                                                {        
                                                                        month_h=1;
                                                                        month_l=2;
                                                                }
                                                                if((month_h==0)&&(month_l==0))
                                                                {
                                                                        month_h=1;
                                                                        month_l=2;
                                                                }
                                                                month=month_h*16+month_l;
                                                                write_nyrx(6,month);
                                                                LCD_writecom(0x80+7);
                                                                break;
                                                               
                                        case 7:                year_h=year/16;
                                                                year_l=year%16;
                                                                year_l--;
                                                                if(year_l==-1)
                                                                {        
                                                                        year_l=9;
                                                                        year_h--;
                                                                }
                                                                if(year_h==-1)
                                                                        year_h=5;
                                                               
                                                                year=year_h*16+year_l;
                                                                write_nyrx(3,year);
                                                                LCD_writecom(0x80+4);
                                                                break;

                                        case 10:        LCD_writecom(0x0c);
                                                                K1num=0;
                                                                k=0;
                                                                DS1302_initW();
                                                              display2(date);
                                                                display3();  
                                                                DS1302_Write(0x8e,0x80);                //寫(xiě)保護(hù)開(kāi)
                                                                break;                        
                                }
                        }
                }               
        }
                                       
}

///////////////////////以下為AD采集程序////////////////////////
/*------------------------------------------------
                    延時(shí)程序
------------------------------------------------*/
void mDelay(unsigned char j)
{
  unsigned int i;
  for(;j>0;j--)
     {
          for(i=0;i<125;i++)
             {;}
          }
  }
/*------------------------------------------------
                    初始化定時(shí)器1
------------------------------------------------*/
void Init_Timer1(void)
{
TMOD |= 0x10;                             
TH1=0xff;                              /* Init value */
TL1=0x00;
//PT1=1;                   /* 優(yōu)先級(jí)    */
EA=1;                      /* interupt enable */
ET1=1;                     /* enable timer1 interrupt */
TR1=1;  
}
/*------------------------------------------------
                    啟動(dòng)IIC總線(xiàn)
------------------------------------------------*/
  void Start(void)
  {
   Sda=1;
   _nop_();
   Scl=1;
   _nop_();
   Sda=0;
   _nop_();
   Scl=0;
  }


/*------------------------------------------------
                    停止IIC總線(xiàn)
------------------------------------------------*/
  void Stop(void)
  {
   Sda=0;
   _nop_();
   Scl=1;
   _nop_();
   Sda=1;
   _nop_();
   Scl=0;
   }


/*------------------------------------------------
                   應(yīng)答IIC總線(xiàn)
------------------------------------------------*/
   void Ack(void)
   {
    Sda=0;
        _nop_();
        Scl=1;
        _nop_();
        Scl=0;
        _nop_();
        }


/*------------------------------------------------
                 非應(yīng)答IIC總線(xiàn)
------------------------------------------------*/
        void NoAck(void)
        {
         Sda=1;
         _nop_();
         Scl=1;
         _nop_();
         Scl=0;
         _nop_();
         }


/*------------------------------------------------
              發(fā)送一個(gè)字節(jié)
------------------------------------------------*/
         void Send(unsigned char Data)
         {
          unsigned char BitCounter=8;
          unsigned char temp;

          do
            {
                 temp=Data;
                 Scl=0;
                 _nop_();
                 if((temp&0x80)==0x80)
                    Sda=1;
                 else
                    Sda=0;

                        Scl=1;
                        temp=Data<<1;
                        Data=temp;
                        BitCounter--;
                  }
          while(BitCounter);
              Scl=0;
          }


/*------------------------------------------------
               讀入一個(gè)字節(jié)并返回
------------------------------------------------*/
          unsigned char Read(void)
          {
           unsigned char temp=0;
           unsigned char temp1=0;
           unsigned char BitCounter=8;

           Sda=1;
           do
             {
                  Scl=0;
          _nop_();
                  Scl=1;
                  _nop_();
                  if(Sda)
                     temp=temp|0x01;
                  else
                     temp=temp&0xfe;

                  if(BitCounter-1)
                     {
                          temp1=temp<<1;
                          temp=temp1;
                          }
                          BitCounter--;
                         }
                while(BitCounter);
                return(temp);
          }

/*------------------------------------------------
                    寫(xiě)入DA數(shù)模轉(zhuǎn)換值
------------------------------------------------*/
          void DAC(unsigned char Data)
          {
                   Start();
                   Send(AddWr); //寫(xiě)入芯片地址
                   Ack();
                   Send(0x40);  //寫(xiě)入控制位,使能DAC輸出
                   Ack();
                   Send(Data);  //寫(xiě)數(shù)據(jù)
                   Ack();
                   Stop();
                 
           }

/*------------------------------------------------
                 讀取AD模數(shù)轉(zhuǎn)換的值,有返回值
------------------------------------------------*/
          unsigned char ReadADC(unsigned char Chl)
          {
       unsigned char Data=0;
                   Start();        //寫(xiě)入芯片地址
                   Send(AddWr);
                   Ack();
                    Send(0x40|Chl);//寫(xiě)入選擇的通道,本程序只用單端輸入,差分部分需要自行添加
                                  //Chl的值分別為0、1、2、3,分別代表1-4通道
                   Ack();
                   Start();
                   Send(AddRd);    //讀入地址
                   Ack();
                   Data=Read();    //讀數(shù)據(jù)
                   Scl=0;
                   NoAck();
                   Stop();
                   return Data;   //返回值
          }




//////////////////////以上為AD采集程序/////////////////////////
void main()
{
          uchar n,K5FLAG;
        unsigned char bai,shi,ge;                   //DA數(shù)模輸出變量
    unsigned char ADtemp;                //定義中間變量
        unsigned char flag=0;
        display1();                                         //初始化屏幕顯示
        DS1302_initW();                                 //初始化時(shí)間日期
        DS1302_initR();                                 //讀取時(shí)間日期
        jd=1;
        while(1)
        {
                if(K6==0)                                  //按鍵按下強(qiáng)制關(guān)閉
                {
                delay1ms(5);
                if(K6==0)
                {
                K6FLAG=1;
                LCD_writecom(0x01);
                }
                }
                if(K7==0)                                                //按鍵7按下恢復(fù)系統(tǒng)
                {
                delay1ms(5);
                if(K7==0)
                {
                K6FLAG=0;
                display1();                                         //初始化屏幕顯示
                }
                }                                                
                if(K1num==10)                                    //第一個(gè)按鍵第10次按下系統(tǒng)恢復(fù)顯示主界面
                {
                LCD_writecom(0x0c);
                gflag=0;
                K1num=0;
                K5FLAG=0;                                          //K1按鍵計(jì)數(shù)清零
                k=0;                                                  //時(shí)間繼續(xù)走
                display1();        
                write_sfm(7,sec);
                write_sfm(4,min);
                write_sfm(1,hour);
                write_nyrx(3,year);
                write_nyrx(6,month);
                write_nyrx(9,day);               
                display2(date);
                DS1302_initW();                                        //將設(shè)置的時(shí)間日期等寫(xiě)入DS1302中
                DS1302_Write(0x8e,0x80);                //寫(xiě)保護(hù)開(kāi)
                }
               if(K1num==8||K1num==9)                          //第一個(gè)按鍵按下第8次用于調(diào)整定時(shí)的下限值,第9次按下用于調(diào)整定時(shí)的上限值,定時(shí)范圍在0點(diǎn)到8點(diǎn)
                {
                  
                        if(K1==0)
                        {
                         delay1ms(100);
                         if(K1==0)
                         {
                         K1num++;
                         }
                         }
                   if(K5==0)                           //確認(rèn)鍵按下,定時(shí)時(shí)間調(diào)整完成
              {
         delay1ms(5);
         if(K5==0)
         {
          K5FLAG=1;
         }
        }
        if(K1num>0&& K5FLAG==1)
        {
                LCD_writecom(0x0c);
                gflag=0;
                K1num=0;
                K5FLAG=0;                                          //K1按鍵計(jì)數(shù)清零
                k=0;                                                  //時(shí)間繼續(xù)走
        LCD_writecom(0x80);
                display1();        
                write_sfm(7,sec);
                write_sfm(4,min);
                write_sfm(1,hour);
                write_nyrx(3,year);
                write_nyrx(6,month);
                write_nyrx(9,day);               
                display2(date);
                DS1302_initW();                                        //將設(shè)置的時(shí)間日期等寫(xiě)入DS1302中
                DS1302_Write(0x8e,0x80);                //寫(xiě)保護(hù)開(kāi)
        }
        else{
         table4[4]=table[dsl/10];
                        table4[5]=table[dsl%10];
                    table4[14]=table[dsh/10];
                        table4[15]=table[dsh%10];
                        LCD_writecom(0x80);
                        for(n=0;n<16;n++)
                        {
                        LCD_writedat(table4[n]);
                        delay1ms(2);        
                        }
                        LCD_writecom(0x80+0x40);
                        if(K1num==9)
                        {
                        LCD_writedat('D');
                        LCD_writedat('S');
                        LCD_writedat('H');
                        for(n=3;n<16;n++)
                        {
                        
                        LCD_writedat(' ');
                        delay1ms(2);
                        
                                }
                                }
                                        if(K1num==8)
                        {
                        LCD_writedat('D');
                        LCD_writedat('S');
                        LCD_writedat('L');
                        for(n=3;n<16;n++)
                        {
                        
                        LCD_writedat(' ');
                        delay1ms(2);
                        
                                }
                                }
        }
                        
                                                        if(K1num==8)
                                                        {
                                                        
                                                        if(K2==0)
                                                        {
                                                        delay1ms(100);
                                                        if(K2==0)
                                                        {
                                                        if(dsl<(dsh-1))
                                                        {
                                                        dsl++;
                                                        }
                                                        }
                                                        }
                                                        if(K3==0)
                                                        {
                                                        delay1ms(100);
                                                        if(K3==0)
                                                        {
                                                        if(dsl>0)
                                                        {
                                                        dsl--;
                                                        }
                                                        }
                                                        }               
                                                        }
                                                                if(K1num==8)
                                                        {
                                                        
                                                        if(K2==0)
                                                        {
                                                        delay1ms(100);
                                                        if(K2==0)
                                                        {
                                                        if(dsl<(dsh-1))
                                                        {
                                                        dsl++;
                                                        }
                                                        }
                                                        }
                                                        if(K3==0)
                                                        {
                                                        delay1ms(100);
                                                        if(K3==0)
                                                        {
                                                        if(dsl>0)
                                                        {
                                                        dsl--;
                                                        }
                                                        }
                                                        }               
                                                        }

                                                                        if(K1num==9)
                                                        {
                                                        
                                                        if(K2==0)
                                                        {
                                                        delay1ms(100);
                                                        if(K2==0)
                                                        {
                                                        if(dsh<8)
                                                        {
                                                        dsl++;
                                                        }
                                                        }
                                                        }
                                                        if(K3==0)
                                                        {
                                                        delay1ms(100);
                                                        if(K3==0)
                                                        {
                                                        if(dsh>dsl)
                                                        {
                                                        dsh--;
                                                        }
                                                        }
                                                        }               
                                                        }
        
                  

                }
                else
                {
                if(K6FLAG==0)
                {
                if(gflag==0)
                {
           // display1();               
            ADtemp=255-ReadADC(2);
                bai=ADtemp/100;//處理0通道電壓顯示
                  shi=ADtemp%100/10;
                ge=ADtemp%10;
            LCD_writecom(0x80+0x40+11);
                LCD_writedat(table[bai]);
                LCD_writecom(0x80+0x40+12);
                LCD_writedat(table[shi]);
                LCD_writecom(0x80+0x40+13);
            LCD_writedat(table[ge]);
                keyscan();
                //設(shè)定時(shí)間0點(diǎn)到7點(diǎn)之間路燈關(guān)閉,當(dāng)紅外傳感器檢測(cè)到有人路過(guò)時(shí)自動(dòng)打開(kāi)路燈,10s后關(guān)閉


                if(dsh>=((((hour/16)*10)+(hour%16)))&&((((hour/16)*10)+(hour%16)))>=dsl)//在設(shè)置的時(shí)間段以紅外檢測(cè)的結(jié)果作為開(kāi)燈的依據(jù)
        
            {
                jd=1;
                if(K4==1)
                {
                jd=0;
                LCD_writecom(0x80+0x40+15);
            LCD_writedat('h');
        //        mDelay(50);

                 }
                 else
                 {
                         LCD_writecom(0x80+0x40+15);
            LCD_writedat('l');
                 jd=1;
//                mDelay(50);
                 }
                }
        //        }
            else
                {
                //在其他時(shí)間段根據(jù)光敏電阻的光照值來(lái)打開(kāi)路燈,即在傍晚時(shí)自動(dòng)打開(kāi)路燈
                        
                if(ADtemp<100)
                {jd=0;}
                else
                {jd=1;}
                }
                }
                else
                {
                keyscan();               
            }
                if(gflag>10)        
                {
                gflag=0;
                }
                }

                }


        }                                                                 
}



回復(fù)

使用道具 舉報(bào)

ID:1 發(fā)表于 2019-12-7 19:24 | 顯示全部樓層
本帖需要重新編輯補(bǔ)全電路原理圖,源碼,詳細(xì)說(shuō)明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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