新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于單片機定時器的可調時鐘程序

        基于單片機定時器的可調時鐘程序

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

        此時間沒有用到ds1302等芯片,而是用自帶的制作的,并且整時間。請大家多多指教
        #includereg52.h
        #include intrins.h
        #define uchar unsigned char
        #define uint unsigned int

        uint schedule[6];
        uint count,b; //計數:以秒為單位
        uint number[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //對應數碼管的0-9
        uint a[4]={0xfe,0xfd,0xfb,0xf7}; //對應的四個數碼管
        uint minute[2],second[2] ;
        sbit P30=P3^0; //P3口作為鍵盤控制端
        sbit P31=P3^1;
        sbit P36=P3^6;
        sbit P35=P3^5;
        sbit P34=P3^4;
        sbit P33=P3^3;
        sbit P32=P3^2;
        sbit P37=P3^7;
        void assign();
        void show();

        void delay(unsigned n);
        void main()
        {
        uint i ;
        EA=1;//總中斷打開
        IT0=1;//外部中斷打開
        EX0=1; //
        count=43200;
        TMOD=0x10;
        P30=0;
        P31=1;
        P32=1;
        P33=1;
        P34=0;
        P35=1;
        P36=1;
        P37=1;
        while(1)
        {
        for(i=0;i=19;i++)//每循環一次用時50ms.
        {
        TR1=1;//選擇計數器1
        TH1= 0x3c;
        TL1=0xb0;//賦初值
        show(); //顯示函數
        TF1=0; //恢復標志

        本文引用地址:http://www.104case.com/article/170969.htm

        }
        count++;


        }

        }
        void assign() //給小時,分鐘,秒賦值
        {

        if(count>=46800) //滿了13個小時轉化為1點鐘
        count=count-43200;
        if(count>=36000) //計算小時 前一位 減少算法
        schedule[0]=minute[0]=1;
        else
        schedule[0]=minute[0]=0;
        schedule[1]=minute[1]=count/3600%10;//計算小時的后一位
        schedule[2]=second[0]= count%3600/600; //計算分鐘的前一位
        schedule[3]=second[1]= count%3600/60%10;//計算分鐘的后一位

        }
        void show() //顯示函數
        {
        uint i;

        while(1)
        {

        assign();
        for(i=0;i4;i++)
        {
        P1=a[i]; //亮那個數碼管
        P2=number[schedule[i]]; //亮一個什么樣的數字
        if(i==1 )
        P2=P2-0x80; //亮小數點便于好看
        delay(50);//延時函數,便于亮的清晰



        }
        if(TF1==1) //已經有50ms
        break;
        }
        }
        void delay(unsigned n) //延時
        {
        uint i;
        for(i=1;i=n;i++)
        {

        if(TF1==1) //已經有50ms
        break;
        if(P31==0) //調表
        {

        for(b=0;b3000;b++) //放抖動:按的時間太短
        {

        }
        if(P31==1)
        goto back5;



        if(P31==0)
        {
        while(1)
        {

        show();
        TF1=0; //恢復標志
        if(P32==0) //加一分鐘
        {
        for(b=0;b3000;b++)
        {}
        if(P32==1)
        goto back1;
        count=count+60;
        if(P32==0)

        {
        while(1)
        {
        show();
        TF1=0; //恢復標志
        if(P32==1)
        break;
        }
        }

        }
        back1: show();
        if(P33==0) //減一分鐘
        {
        for(b=0;b3000;b++)
        {}
        if(P33==1)
        goto back2;
        count=count-60;

        if(P33==0)
        {
        while(1)
        {
        show();TF1=0; //恢復標志
        if(P33==1)
        break;
        }
        }

        }

        back2:show();
        if(P36==0) //加一個小時
        {
        for(b=0;b3000;b++)
        {}
        if(P36==1)
        goto back3;
        count=count+3600;

        if(P36==0)
        {
        while(1)
        {
        show(); TF1=0; //恢復標志
        if(P36==1)
        break;
        }
        }

        }

        back3:show();
        if(P37==0) //減一個小時
        {
        for(b=0;b3000;b++)
        {}
        if(P37==1)
        goto back4;
        if(schedule[0]==0schedule[1]==1) //處理1點鐘到12點
        count=count+39600;
        else
        count=count-3600;

        if(P37==0)
        {
        while(1)
        {
        show(); TF1=0; //恢復標志
        if(P37==1)
        break;
        }
        }

        }

        back4:show();
        if(P35==0)//沒有必要防抖
        break;

        }
        }
        back5: show(); //按的時間太duan

        }

        }


        }


        有幾個缺點:一,調時間的時候有點暗。二,算法比較差。三,代碼比較難看。四,當時我想從0到24小時計時,但count為int溢出了,后面我不用count計時,可是可以但是調時間的話有比較難寫,不想亂費時間了,改成長整型有不知道那個地方出問題。希望高手指點。
        分享到:



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 班玛县| 彝良县| 平邑县| 波密县| 平远县| 沈阳市| 林州市| 贵阳市| 襄垣县| 葫芦岛市| 岐山县| 科技| 原平市| 通辽市| 澳门| 吴川市| 宣武区| 平谷区| 双辽市| 五家渠市| 克什克腾旗| 苗栗市| 潼南县| 新余市| 乐东| 襄樊市| 陈巴尔虎旗| 广安市| 潜山县| 周至县| 玉环县| 东兴市| 彰化县| 本溪市| 扶沟县| 大方县| 蒲城县| 共和县| 迁安市| 新巴尔虎左旗| 福鼎市|