<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        24小時單片機時鐘終于搞定了

        作者:余春雨老師   來源:本站原創   點擊數:  更新時間:2014年04月26日   【字體:

        此程序的電路圖下載:http://www.thefapper.com/f/ks51.pdf   只需要看數碼管部分即可,其他部分可忽略掉. 

         
        #include <reg52.h> //stc89c51單片機頭文件
         
         
        typedef unsigned char uchar;
        typedef unsigned int uint;
        typedef unsigned long ulong; //變量類型宏定義
         
         
        sbit ENLED = P1^4;
        sbit ADDR0 = P1^0;//管腳定義,作用為使能74hc138,讓38譯碼器開始工作
        sbit ADDR1 = P1^1;
        sbit ADDR2 = P1^2;
        sbit ADDR3 = P1^3; //管腳定義,作用為選定38譯碼器輸出Y0-Y7,以便選定要顯示的數碼管(位選擇)
         
         
        uchar led_char[] = {
        0xC0, 0xF9, 0xA4, 0xB0,
        0x99, 0x92, 0x82, 0xF8,
        0x80, 0x90, 0x88, 0x83,
        0xC6, 0xA1, 0x86, 0x8E}; //數碼管字符真值表 0-F
         
         
        uchar led_buf[] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}; //數碼管字符初始化,為關閉狀態
         
         
        uchar cnt = 0; //T1定時器溢出計數
        uchar key = 0; //數碼管動態掃描開關
        ulong sec = 0; //時間變量 
        uchar hh = 8; //小時初值
        uchar mm = 30; //分鐘初值
        uchar ss = 40; //秒數初值
         
         
        void main()
        {
        sec = hh *3600 + mm * 60 + ss;//時間計算公式
        EA = 1; //打開中斷開關
         
         
        ENLED = 0;
        ADDR3 = 1; //使能74hc138,讓38譯碼器開始工作
         
         
        TMOD = 0x10;//定時器工作模式設定
        TH1 = 0xEE;
        TL1 = 0x00;//定時初值設置
         
         
        ET1 = 1; //打開定時器1中斷開關
        TR1 = 1; //定時器1開始計時
         
         
        while(1)
        {
        if(200 == cnt)
        {
        cnt = 0;
        sec++;
        if(sec < 86400)
        {
        led_buf[0] = led_char[sec%10];
        led_buf[1] = led_char[sec%60/10];
        led_buf[2] = led_char[sec%3600/60%10];
        led_buf[3] = led_char[sec%3600/600];
        led_buf[4] = led_char[sec/3600%10];
        led_buf[5] = led_char[sec/3600/10]; //時間顯示字符計算
        }
            if(sec == 86400)
        {
        sec = 0;
        }
        }
        }
         
         
         
         
        }
        void interruptTimer0() interrupt 3 //定時器1中斷服務程序
        {
          TH1 = 0xEE;
        TL1 = 0x00; //定時初值設置
        cnt++;
         
         
        P0 = 0xFF; //數碼管消除鬼影
         
         
        switch(key)
        {
        case 0: ADDR2 = 0;ADDR1 = 0;ADDR0 = 0;P0 = led_buf[0];key++;break;
        case 1: ADDR2 = 0;ADDR1 = 0;ADDR0 = 1;P0 = led_buf[1];key++;break;
        case 2: ADDR2 = 0;ADDR1 = 1;ADDR0 = 0;P0 = led_buf[2];key++;break;
        case 3: ADDR2 = 0;ADDR1 = 1;ADDR0 = 1;P0 = led_buf[3];key++;break;
        case 4: ADDR2 = 1;ADDR1 = 0;ADDR0 = 0;P0 = led_buf[4];key++;break;
        case 5: ADDR2 = 1;ADDR1 = 0;ADDR0 = 1;P0 = led_buf[5];key = 0;break;
        default:break;
        } //數碼管動態掃描、顯示時間值
        }
        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮