新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機電子時鐘完整版

        51單片機電子時鐘完整版

        作者: 時間:2012-08-02 來源:網絡 收藏

        /******************************ds1820程序***************************************/
        void delay_18B20(unsigned int i)//延時1微秒
        {
        while(i--);
        }
        void ds1820rst() //ds1820復位
        {
        unsigned char x=0;
        DQ = 1; //DQ復位
        delay_18B20(4); //延時
        DQ = 0; //DQ拉低
        delay_18B20(100); //精確延時大于480us
        DQ = 1; //拉高
        delay_18B20(40);
        }
        uchar ds1820rd() //讀數據
        {
        unsigned char i=0;
        unsigned char dat = 0;
        for (i=8;i>0;i--)
        {
        DQ = 0; //給脈沖信號
        dat>>=1;
        DQ = 1; //給脈沖信號
        if(DQ)
        dat|=0x80;
        delay_18B20(10);
        }
        return(dat);
        }
        void ds1820wr(uchar wdata) //寫數據
        {
        unsigned char i=0;
        for (i=8; i>0; i--)
        {
        DQ = 0;
        DQ = wdata0x01;
        delay_18B20(10);
        DQ = 1;
        wdata>>=1;
        }
        }
        read_temp() //讀取溫度值并轉換
        {
        uchar a,b;
        ds1820rst();
        ds1820wr(0xcc); //跳過讀序列號
        ds1820wr(0x44); //啟動溫度轉換
        ds1820rst();
        ds1820wr(0xcc); //跳過讀序列號
        ds1820wr(0xbe);//讀取溫度
        a=ds1820rd();
        b=ds1820rd();
        tvalue=b;
        tvalue=8;
        tvalue=tvalue|a;
        if(tvalue0x0fff)
        tflag=0;
        else
        {
        tvalue=~tvalue+1;
        tflag=1;
        }
        tvalue=tvalue*(0.625);//溫度值擴大10倍,精確到1位小數
        return(tvalue);
        }
        /*******************************************************************/
        void ds1820disp() //溫度值顯示
        {
        uchar flagdat;
        disdata[0]=tvalue/1000+0x30; //百位數
        disdata[1]=tvalue%1000/100+0x30; //十位數
        disdata[2]=tvalue%100/10+0x30; //個位數
        disdata[3]=tvalue%10+0x30; //小數位
        if(tflag==0)
        flagdat=0x20; //正溫度不顯示符號
        else
        flagdat=0x2d; //負溫度顯示負號:-
        if(disdata[0]==0x30)
        {
        disdata[0]=0x20; //如果百位為0,不顯示
        if(disdata[1]==0x30)
        {
        disdata[1]=0x20; //如果百位為0,十位為0也不顯示
        }
        }
        write_add(0x80+0x40+8);
        write_date(flagdat); //顯示符號位
        write_add(0x80+0x40+9);
        write_date(disdata[0]); //顯示百位
        write_add(0x80+0x40+10);
        write_date(disdata[1]); //顯示十位
        write_add(0x80+0x40+11);
        write_date(disdata[2]); //顯示個位
        write_add(0x80+0x40+12);
        write_date(0x2e); //顯示小數點
        write_add(0x80+0x40+13);
        write_date(disdata[3]); //顯示小數位
        write_add(0x80+0x40+14);
        write_date(0xdf); //顯示"。"
        write_add(0x80+0x40+15);
        write_date(0x63); //顯示"c"
        }
        void init_info(void)
        {
        write_add(0x80+0x00+0);
        for(i=0;i14;i++)
        {
        write_date(stuinfo1[i]);
        delay(5);
        }
        write_add(0x80+0x40+0);
        for(i=0;i14;i++)
        {
        write_date(stuinfo2[i]);
        delay(5);
        }
        }
        void Speak1() //鬧鈴
        {
        alarm = 0;
        smiao = Read1302(r_Sec);
        sfen = Read1302(r_Min);
        sshi = Read1302(r_Hou);
        snian = Read1302(r_Yea);
        syue = Read1302(r_Mou);
        sri = Read1302(r_Day);
        sxi = Read1302(r_xi);
        writefuhao();
        writesfm(0,sshi);
        writesfm(3,sfen);
        writesfm(6,smiao);
        writenyr(0,snian);
        writenyr(3,syue);
        writenyr(6,sri);
        writexi(sxi);
        delay(500);
        alarm = 1;
        delay(500);
        }
        void Speak2()
        {
        alarm=0;
        delay(2000);
        alarm=1;
        }
        void Normal() //正常顯示時間功能
        {
        smiao = Read1302(r_Sec);
        sfen = Read1302(r_Min);
        sshi = Read1302(r_Hou);
        snian = Read1302(r_Yea);
        syue = Read1302(r_Mou);
        sri = Read1302(r_Day);
        sxi = Read1302(r_xi); //讀取時間數據
        if((nshi==sshi)(nfen==sfen)) //鬧鐘鈴響
        {
        for(i=0;i10;i++)
        {
        Speak1();
        }
        while((k1==1)||(k2==1)||(k3==1)||(k4==1)) //按下任意鍵,鬧鐘停止鬧鈴
        {
        alarm=1;
        }
        }
        //關閉蜂鳴器
        if((sshi==0||sshi==1||sshi==2||sshi==3||sshi==4||sshi==5||sshi==6||sshi==7
        ||sshi==8||sshi==9||sshi==10||sshi==11||sshi==12||sshi==13||sshi==14||sshi==15||sshi==16
        ||sshi==1||sshi==18||sshi==19||sshi==20||sshi==21||sshi==22||sshi==23)(sfen==0)(smiao==0))
        {
        Speak2(); //整點報時
        }
        alarm=1; //關閉蜂鳴器
        writefuhao();
        writesfm(0,sshi);
        writesfm(3,sfen);
        writesfm(6,smiao);
        writenyr(0,snian);
        writenyr(3,syue);
        writenyr(6,sri);
        writexi(sxi);
        }
        void StopWatch () reentrant //秒表功能
        {
        haomiao=0;
        miao=0;
        fen=0;
        shi=0;
        write_add(0x01); //清屏
        write_add(0x0c);
        write_add(0x80+0x00+0);
        for(i=0;i9;i++)
        {
        write_date(miaobiao[i]);
        delay(5);
        }
        write_add(0x80+0x40+0);
        for(i=0;i11;i++)
        {
        write_date(time2[i]);
        delay(5);
        }
        while(!k4);
        while(k4!=0)
        {
        if(k1==0)
        {
        delay(10); //消抖
        if(k1==0)
        StopWatch();
        }

        haomiao++;
        if(haomiao==100)
        {
        haomiao=0;
        miao++;
        if(miao==60)
        {
        miao=0;
        fen++;
        if(fen==60)
        {
        fen=0;
        shi++;
        if(shi==24)
        {
        shi=0;
        }
        writesfm(0,shi);
        }
        writesfm(3,fen);
        }
        writesfm(6,miao);
        }
        writesfm(9,haomiao);
        }
        /*TR0 = 0;
        menu=3;*/
        }
        void key() //鬧鐘時的按鍵功能
        {
        if(k1==0)
        {
        delay(10);
        if(k1==0)
        {
        n++;
        while(!k1);
        if(n==1)
        {
        write_add(0x0f);
        write_add(0x80+0x40+4); //寫shi
        }
        if(n==2)
        {
        write_add(0x0f);
        write_add(0x80+0x40+7); //寫fen
        }
        if(n==3)
        {
        n=0;
        nfen=fen;
        nshi=shi; //確認
        write_add(0x0c); //光標不閃爍
        }
        }
        }
        if(k2==0)
        {
        delay(10);
        if(k2==0)
        {
        while(!k2);
        if(n==1)
        {
        shi++;
        if(shi==24)
        shi=0;
        writesfm(4,shi);
        }
        if(n==2)
        {
        fen++;
        if(fen==60)
        fen=0;
        writesfm(7,fen);
        }
        }
        }
        if(k3==0)
        {
        delay(10);
        if(k3==0)
        {
        while(!k3);
        if(n==1)
        {
        shi--;
        if(shi==-1)
        shi=23;
        writesfm(4,shi);
        }

        51單片機相關文章:51單片機教程


        單片機相關文章:單片機教程


        單片機相關文章:單片機視頻教程


        單片機相關文章:單片機工作原理




        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 富川| 荣成市| 玉树县| 洮南市| 新绛县| 慈利县| 连城县| 监利县| 苍山县| 蓬溪县| 潞西市| 利川市| 崇左市| 尤溪县| 泸定县| 武穴市| 海淀区| 贞丰县| 琼海市| 张家川| 永州市| 阿荣旗| 富顺县| 彩票| 太康县| 洛川县| 镇江市| 晋宁县| 广宗县| 开原市| 广丰县| 蓬安县| 都匀市| 刚察县| 阜新| 铁岭县| 五峰| 共和县| 防城港市| 蒙山县| 阿鲁科尔沁旗|