新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 通過(guò)51單片機(jī)實(shí)現(xiàn)電子時(shí)鐘功能并通過(guò)LCD1602顯示

        通過(guò)51單片機(jī)實(shí)現(xiàn)電子時(shí)鐘功能并通過(guò)LCD1602顯示

        作者: 時(shí)間:2016-11-26 來(lái)源:網(wǎng)絡(luò) 收藏
        char read_add(uchar address)//指定地址讀一個(gè)字節(jié)
        {
        uchar date;
        start();
        write_byte(0xa0);
        respons();
        write_byte(address);
        respons();
        start();
        write_byte(0xa1);
        respons();
        date=read_byte();
        stop();
        return date;
        }
        sbit s1=P3^0; //定義按鍵--功能鍵
        sbit s2=P3^1; //定義按鍵--增加鍵
        sbit s3=P3^2; //定義按鍵--減小鍵
        sbit rs=P2^4; //定義1602液晶RS端
        sbit lcden=P2^6;//定義1602液晶LCDEN端
        sbit rw=P2^5;
        sbit beep=P2^3; //定義蜂鳴器端
        uchar count,s1num;
        char miao,shi,fen;
        uchar code table[]=" 2011-11-12 ";//定義初始上電時(shí)液晶默認(rèn)顯示狀態(tài)
        void delay(uint z) //延時(shí)函數(shù)
        {
        uint x,y;
        for(x=z;x>0;x--)
        for(y=110;y>0;y--);
        }
        void di()//蜂鳴器發(fā)聲函數(shù)
        {
        beep=0;
        delay(100);
        beep=1;
        }
        void write_com(uchar com)//液晶寫命令函數(shù)
        {
        rs=0;
        rw=0;
        lcden=0;
        P0=com;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
        }
        void write_date(uchar date)//液晶寫數(shù)據(jù)函數(shù)
        {
        rs=1;
        rw=0;
        lcden=0;
        P0=date;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
        }
        void write_sfm(uchar add,uchar date)//寫時(shí)分秒函數(shù)
        {
        uchar shi,ge;
        shi=date/10;//分解一個(gè)2位數(shù)的十位和個(gè)位
        ge=date;
        write_com(0x80+0x40+add);//設(shè)置顯示位置
        write_date(0x30+shi);//送去液晶顯示十位
        write_date(0x30+ge); //送去液晶顯示個(gè)位
        }
        void init()//初始化函數(shù)
        {
        uchar num;
        lcden=0;
        fen=0; //初始化種變量值
        miao=0;
        shi=0;
        count=0;
        s1num=0;
        init_24c02();
        write_com(0x38);//初始化1602液晶
        write_com(0x0c);
        write_com(0x06);
        write_com(0x01);
        write_com(0x80);//設(shè)置顯示初始坐標(biāo)
        for(num=0;num<15;num++)//顯示年月日星期
        {
        write_date(table[num]);
        delay(5);
        }
        write_com(0x80+0x40+6);//寫出時(shí)間顯示部分的兩個(gè)冒號(hào)
        write_date(:);
        delay(5);
        write_com(0x80+0x40+9);
        write_date(:);
        delay(5);
        miao=read_add(1);//首次上電從AT24C02中讀取出存儲(chǔ)的數(shù)據(jù)
        fen=read_add(2);
        shi=read_add(3);
        write_sfm(10,miao);//分別送去液晶顯示
        write_sfm(7,fen);
        write_sfm(4,shi);
        TMOD=0x01;//設(shè)置定時(shí)器0工作模式1
        TH0=(65536-50000)/256;//定時(shí)器裝初值
        TL0=(65536-50000)%6;
        EA=1; //開總中斷
        ET0=1; //開定時(shí)器0中斷
        TR0=1; //啟動(dòng)定時(shí)器0
        }
        void keyscan()//按鍵掃描函數(shù)
        {
        if(s1==0)
        {
        delay(5);
        if(s1==0)//確認(rèn)功能鍵被按下
        { s1num++;//功能鍵按下次數(shù)記錄
        while(!s1);//釋放確認(rèn)
        di();//每當(dāng)有按鍵釋放蜂鳴器發(fā)出滴聲
        if(s1num==1)//第一次被按下時(shí)
        {
        TR0=0; //關(guān)閉定時(shí)器
        write_com(0x80+0x40+10);//光標(biāo)定位到秒位置
        write_com(0x0f); //光標(biāo)開始閃爍
        }
        if(s1num==2)//第二次按下光標(biāo)閃爍定位到分鐘位置
        {
        write_com(0x80+0x40+7);
        }
        if(s1num==3)//第三次按下光標(biāo)閃爍定位到小時(shí)位置
        {
        write_com(0x80+0x40+4);
        }
        if(s1num==4)//第四次按下
        {
        s1num=0;//記錄按鍵數(shù)清零
        write_com(0x0c);//取消光標(biāo)閃爍
        TR0=1; //啟動(dòng)定時(shí)器使時(shí)鐘開始走
        }
        }
        }
        if(s1num!=0)//只有功能鍵被按下后,增加和減小鍵才有效
        {
        if(s2==0)
        {
        delay(5);
        if(s2==0)//增加鍵確認(rèn)被按下
        {
        while(!s2);//按鍵釋放
        di();//每當(dāng)有按鍵釋放蜂鳴器發(fā)出滴聲
        if(s1num==1)//若功能鍵第一次按下
        {
        miao++; //則調(diào)整秒加1
        if(miao==60)//若滿60后將清零
        miao=0;
        write_sfm(10,miao);//每調(diào)節(jié)一次送液晶顯示一下
        write_com(0x80+0x40+10);//顯示位置重新回到調(diào)節(jié)處
        write_add(1,miao); //數(shù)據(jù)改變立即存入24C02
        }
        if(s1num==2)//若功能鍵第二次按下
        {
        fen++;//則調(diào)整分鐘加1
        if(fen==60)//若滿60后將清零
        fen=0;
        write_sfm(7,fen);//每調(diào)節(jié)一次送液晶顯示一下
        write_com(0x80+0x40+7);//顯示位置重新回到調(diào)節(jié)處
        write_add(2,fen);//數(shù)據(jù)改變立即存入24C02
        }
        if(s1num==3)//若功能鍵第三次按下
        {
        shi++;//則調(diào)整小時(shí)加1
        if(shi==24)//若滿24后將清零
        shi=0;
        write_sfm(4,shi);;//每調(diào)節(jié)一次送液晶顯示一下
        write_com(0x80+0x40+4);//顯示位置重新回到調(diào)節(jié)處
        write_add(3,shi);//數(shù)據(jù)改變立即存入24C02
        }
        }
        }
        if(s3==0)
        {
        delay(5);
        if(s3==0)//確認(rèn)減小鍵被按下
        {
        while(!s3);//按鍵釋放
        di();//每當(dāng)有按鍵釋放蜂鳴器發(fā)出滴聲
        if(s1num==1)//若功能鍵第一次按下
        {
        miao--;//則調(diào)整秒減1
        if(miao==-1)//若減到負(fù)數(shù)則將其重新設(shè)置為59
        miao=59;
        write_sfm(10,miao);//每調(diào)節(jié)一次送液晶顯示一下
        write_com(0x80+0x40+10);//顯示位置重新回到調(diào)節(jié)處
        write_add(1,miao);//數(shù)據(jù)改變立即存入24C02
        }
        if(s1num==2)//若功能鍵第二次按下
        {
        fen--;//則調(diào)整分鐘減1
        if(fen==-1)//若減到負(fù)數(shù)則將其重新設(shè)置為59
        fen=59;
        write_sfm(7,fen);//每調(diào)節(jié)一次送液晶顯示一下
        write_com(0x80+0x40+7);//顯示位置重新回到調(diào)節(jié)處
        write_add(2,fen);//數(shù)據(jù)改變立即存入24C02
        }
        if(s1num==3)//若功能鍵第二次按下
        {
        shi--;//則調(diào)整小時(shí)減1
        if(shi==-1)//若減到負(fù)數(shù)則將其重新設(shè)置為23
        shi=23;
        write_sfm(4,shi);//每調(diào)節(jié)一次送液晶顯示一下
        write_com(0x80+0x40+4);//顯示位置重新回到調(diào)節(jié)處
        write_add(3,shi);//數(shù)據(jù)改變立即存入24C02
        }
        }
        }
        }
        }
        void main()//主函數(shù)
        {
        init();//首先初始化各數(shù)據(jù)
        while(1)//進(jìn)入主程序大循環(huán)
        {
        keyscan();//不停的檢測(cè)按鍵是否被按下
        }
        }
        void timer0() interrupt 1//定時(shí)器0中斷服務(wù)程序
        {
        TH0=(65536-50000)/256;//再次裝定時(shí)器初值
        TL0=(65536-50000)%6;
        count++; //中斷次數(shù)累加
        if(count==20) //20次50毫秒為1秒
        {
        count=0;
        miao++;
        if(miao==60)//秒加到60則進(jìn)位分鐘
        {
        miao=0;//同時(shí)秒數(shù)清零
        fen++;
        if(fen==60)//分鐘加到60則進(jìn)位小時(shí)
        {
        fen=0;//同時(shí)分鐘數(shù)清零
        shi++;
        if(shi==24)//小時(shí)加到24則小時(shí)清零
        {
        shi=0;
        }
        write_sfm(4,shi);//小時(shí)若變化則重新寫入
        write_add(3,shi);//數(shù)據(jù)改變立即存入24C02
        }
        write_sfm(7,fen);//分鐘若變化則重新寫入
        write_add(2,fen);//數(shù)據(jù)改變立即存入24C02
        }
        write_sfm(10,miao);//秒若變化則重新寫入
        write_add(1,miao);//數(shù)據(jù)改變立即存入24C02
        }
        }

        上一頁(yè) 1 2 下一頁(yè)

        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 会泽县| 湘西| 永安市| 封丘县| 定襄县| 小金县| 东港市| 肥城市| 台南市| 乐亭县| 清河县| 枞阳县| 吉林省| 弋阳县| 界首市| 龙游县| 桦南县| 额敏县| 镇雄县| 宁国市| 茌平县| 勃利县| 琼中| 诸暨市| 尖扎县| 宁波市| 河间市| 自治县| 衡南县| 涞源县| 舞钢市| 中阳县| 巨野县| 康定县| 博湖县| 怀安县| 教育| 彰化市| 达日县| 台中县| 皋兰县|