新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機普通定時器時鐘參考程序

        51單片機普通定時器時鐘參考程序

        作者: 時間:2016-11-18 來源:網絡 收藏
        /*

        1、按鍵可以調整當時時間
        2、按鍵可以調節定時時間

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

        *8位數碼管顯示 時間格式格式 12-08-00 標示12點08分00秒

        S1 用于小時 加1操作
        S2 用于小時減1操作
        S3 用于分鐘 加1操作
        S4 用于分鐘減1操作
        */


        #include //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義


        sbit KEY1=P3^0; //定義端口參數
        sbit KEY2=P3^1;
        sbit KEY3=P3^2;
        sbit KEY4=P3^3;
        code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
        //共陰數碼管 0-9
        unsigned char StrTab[8]; //定義緩沖區
        unsigned char minute=30,hour=12,second; //定義并且初始化值 12:30:00
        /******************************************************************/
        /* 延時函數 */
        /******************************************************************/
        void delay(unsigned int cnt)
        {
        while(--cnt);
        }

        /******************************************************************/
        /* 顯示處理函數 */
        /******************************************************************/
        void Displaypro(void)
        {

        StrTab[0]=tab[hour/10]; //顯示小時
        StrTab[1]=tab[hour%10];
        StrTab[2]=0x40; //顯示"-"
        StrTab[3]=tab[minute/10]; //顯示分鐘
        StrTab[4]=tab[minute%10];
        StrTab[5]=0x40; //顯示"-"
        StrTab[6]=tab[second/10]; //顯示秒
        StrTab[7]=tab[second%10];

        }
        /******************************************************************/
        /* 主函數 */
        /******************************************************************/
        main()//主函數
        {
        TMOD |=0x01;//定時器0 10ms in 12M crystal 用于計時
        TH0=0xc5; //初值
        TL0=0x68;
        ET0=1;
        TR0=1;

        TMOD |=0x10; //定時器1用于動態掃描
        TH1=0xF8; //初值
        TL1=0xf0;
        ET1=1;
        TR1=1;
        EA =1;

        //Displaypro(); //調用顯示處理

        while(1)//主循環
        {

        if(!KEY1) //按鍵1去抖以及動作
        {
        delay(10000);
        if(!KEY1)
        {
        hour++;if(hour==24)hour=0; //正常時間 小時 加1
        Displaypro();
        }
        }

        if(!KEY2) //按鍵2去抖以及動作
        {
        delay(10000);
        if(!KEY2)
        {
        hour--;if(hour==255)hour=23; //正常時間 小時減1

        Displaypro();
        }
        }
        if(!KEY3) //按鍵去抖以及動作
        {
        delay(10000);
        if(!KEY3)
        {
        minute++;if(minute==60)minute=0;//分加1
        Displaypro();
        }
        }
        if(!KEY4) //按鍵去抖以及動作
        {
        delay(10000);
        if(!KEY4)
        {
        minute--;if(minute==255)minute=59; //分減1
        Displaypro();
        }
        }
        }
        }
        /******************************************************************/
        /* 定時器1中斷 */
        /******************************************************************/
        void time1_isr(void) interrupt 3 using 0//定時器1用來動態掃描
        {
        static unsigned char num;
        TH1=0xF8;//重入初值
        TL1=0xf0;

        switch (num){
        case 0:P2=0;P0=StrTab[num];break; //分別調用緩沖區的值進行掃描
        case 1:P2=1;P0=StrTab[num];break;
        case 2:P2=2;P0=StrTab[num];break;
        case 3:P2=3;P0=StrTab[num];break;
        case 4:P2=4;P0=StrTab[num];break;
        case 5:P2=5;P0=StrTab[num];break;
        case 6:P2=6;P0=StrTab[num];break;
        case 7:P2=7;P0=StrTab[num];break;
        default:break;
        }
        num++; //掃描8次,使用8個數碼管
        if(num==8)
        num=0;
        }
        /******************************************************************/
        /* 定時器0中斷 */
        /******************************************************************/
        void tim(void) interrupt 1 using 1
        {
        static unsigned char count;//定義內部靜態變量

        TH0=0xc5; //重新賦值
        TL0=0x68;
        count++;
        switch (count)
        {
        case 0:
        case 20:
        case 40:
        case 60:
        case 80:Displaypro(); //隔一定時間調用顯示處理
        break;
        case 50:P1=~P1; //半秒 LED閃爍
        break;
        default:break;
        }

        if (count==100)
        {
        count=0;
        second++; //秒加1
        if(second==60)
        {
        second=0;
        minute++; //分加1
        if(minute==60)
        {
        minute=0;
        hour++; //時加1
        if(hour==24)
        hour=0;
        }

        }

        }

        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 西乌珠穆沁旗| 天津市| 高青县| 潼关县| 城固县| 鄂伦春自治旗| 大荔县| 缙云县| 峨山| 衡山县| 子洲县| 麟游县| 阿拉尔市| 茌平县| 双峰县| 贵阳市| 韩城市| 麟游县| 独山县| 丹巴县| 四会市| 江陵县| 龙门县| 余姚市| 大同市| 丰台区| 合水县| 金川县| 上虞市| 隆德县| 江门市| 鄯善县| 临朐县| 迭部县| 即墨市| 区。| 静乐县| 曲阜市| 祁连县| 神池县| 平和县|