新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機 定時器 流水燈 數碼管計時

        51單片機 定時器 流水燈 數碼管計時

        作者: 時間:2016-11-25 來源:網絡 收藏
        這個就是前面的歷程的一個綜合定時器T0控制流水燈,T1控制時間,通過數碼管顯示出來。

        代碼如下:

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

        //Led流水燈,五位數碼管100000秒計時
        #include //頭文件
        #include //循環左旋函數所在頭文件
        #define uint unsigned int //宏定義無符號整形
        #define uchar unsigned char //宏定義無符號字符型
        sbit weixuan=P2^7; //聲明P2.7為位選端口
        sbit duanxuan=P2^6; //聲明P2.6為段選端口
        uint number1,number2,aa,number; //number1:T0計滿次數;number2:T1計滿次數;number:顯示的秒數;aa:P0端口顯示賦值
        uint no1,no2,no3,no4,no5; //分別代表五個數碼管顯示的數字(字符斷碼數字序號)
        void delay(uint); //聲明延時函數
        void display(uint,uint,uint,uint,uint); //聲明數碼管顯示函數
        uchar code table[]={ //字符斷碼
        0x3f,0x06,0x5b,0x4f,
        0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x77,0x7c,
        0x39,0x5e,0x79,0x71}; //C語言編碼定義

        void main() //主函數入口
        {
        aa=0xfe; //aa初始化,點亮第一的LED
        //定時器初始化
        TMOD=0x11; //TMOD賦值,確定T0/T1工作方式
        TH0=(65536-46080)/256;//TH0/TL0;TH1/TL1計算初值
        TL0=(65536-46080)%6;
        TH1=(65536-46080)/256;
        TL1=(65536-46080)%6;
        EA=1; //總中斷打開
        ET0=1; //開T0/T1中斷
        ET1=1;
        TR0=1; //TR0/TR1置位,啟動定時器
        TR1=1;
        while(1) //不可少的大循環
        {
        display(no1,no2,no3,no4,no5); //數碼管顯示
        }
        }
        //延時函數主體
        void delay(uint s)
        {
        uint i,j;
        for(i=s;i>0;i--)
        {
        for(j=110;j>0;j--)
        {
        }
        }
        }
        //顯示數碼管顯示函數主體
        void display(uint no1,uint no2,uint no3,uint no4,uint no5) //數碼管顯示函數主體
        {
        //數碼管1顯示 ①送斷碼;②選擇要顯示數碼管
        duanxuan=1; //打開段選鎖存器
        P0=table[no5]; //送斷碼
        duanxuan=0; //關閉(鎖住)鎖存器
        P0=0xff; //必不可少的清屏
        weixuan=1; //打開位選鎖存器
        P0=0xfe; //選擇數碼管
        weixuan=0; //關閉鎖存器
        delay(2); //延時
        //數碼管2顯示
        duanxuan=1;
        P0=table[no4];
        duanxuan=0;
        P0=0xff;
        weixuan=1;
        P0=0xfd;
        weixuan=0;
        delay(2);
        //數碼管3顯示
        duanxuan=1;
        P0=table[no3];
        duanxuan=0;
        P0=0xff;
        weixuan=1;
        P0=0xfb;
        weixuan=0;
        delay(2);
        //數碼管4顯示
        duanxuan=1;
        P0=table[no2];
        duanxuan=0;
        P0=0xff;
        weixuan=1;
        P0=0xf7;
        weixuan=0;
        delay(2);
        //數碼管5顯示
        duanxuan=1;
        P0=table[no1];
        duanxuan=0;
        P0=0xff;
        weixuan=1;
        P0=0xef;
        weixuan=0;
        delay(2);
        }
        //定時器T0方式一中斷服務程序
        void T0_time_no1() interrupt 1
        {
        TH0=(65536-46080)/256; //預裝初始值
        TL0=(65536-46080)%6;
        number1++; //number1判斷計滿次數,4次為200ms
        if(number1==4)
        {
        number1=0;
        aa=_crol_(aa,1); //循環左旋函數,把aa左旋之后賦值給aa
        P1=aa; //P1顯示流水燈
        }
        }
        //定時器T1方式一中斷服務程序
        void T1_time_no1() interrupt 3
        {
        TH1=(65536-46080)/256; //預裝初始值
        TL1=(65536-46080)%6;
        number2++; //用于判斷T1計滿次數
        if(number2==4) //number2=20,就是1s時間
        {
        number2=0;
        number++; //用于裝總數字
        no5=number/10000; //把一個5位數分離出來給五個數碼管顯示
        no4=number000/1000;
        no3=number00/100;
        no2=number0/10;
        no1=number;
        if(number==1000000) //達到最大值100000,重新開始計時
        {
        number=0;
        }
        }
        }

        以上,結束。



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 肇庆市| 读书| 政和县| 利川市| 永登县| 青浦区| 弥渡县| 和平区| 固始县| 清新县| 儋州市| 丰都县| 和田市| 海兴县| 古浪县| 乾安县| 阿瓦提县| 伊金霍洛旗| 揭阳市| 宁国市| 都安| 荥阳市| 饶河县| 景宁| 博罗县| 浮梁县| 姚安县| 黄山市| 县级市| 库伦旗| 安远县| 伊吾县| 兴安盟| 华安县| 罗定市| 南雄市| 隆昌县| 蓬安县| 德江县| 赫章县| 吉首市|