新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > DIY制作LED數碼管定時器

        DIY制作LED數碼管定時器

        作者: 時間:2016-11-29 來源:網絡 收藏
        由于只有一個數碼管,只能顯示0到15,所以這個定時器可以定時0到15分,0到15個小時,0到15天,0到15個星期,本來想在程序中加上定時0到15個月,但想想在實際情況中定時15個月都有一年多了,估計好少用到,就不寫了。這個定時器我加上了繼電器,所以可以控制220V交流電,且定時誤差在幾個毫秒內,還算精確吧。。。

        先來幾張初期的原理圖:




        下面是單片機的源程序:
        #include
        #define uint unsigned int
        #define uchar unsigned char
        sbit ledg=P1^0;//秒閃爍(一秒鐘亮一秒鐘滅)
        sbit ledb=P1^1;//分閃爍(一分鐘亮一分鐘滅)
        sbit fmq=P3^3;// 蜂鳴器
        sbit ledx=P3^4;// 定時星期指示燈
        sbit ledt=P3^6;// 定時天指示燈
        sbit ledf=P3^5;// 定時分鐘指示燈
        sbit leds=P3^7;// 定時小時指示燈
        sbit key1=P1^6;// 啟動|暫停
        sbit key2=P1^5;// 調整定時分鐘
        sbit key3=P1^4;// 調整定時小時
        sbit key4=P1^3;// 調整定時天
        sbit key5=P1^2;// 調整定時星期
        sbit jdq=P1^7; //繼電器
        uint i,j,num,num1,num2,num3,num4,num5,num6;
        uchar shi,temp1,temp2,temp3,temp4,temp5,temp6,temp7,temp8,dsf,dss,dst,dsx;
        uchar code shuju[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
        0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
        void delayms(uint xms)
        {
        for(i=xms;i>0;i--)
        for(j=110;j>0;j--);
        }
        void display(shi)
        {
        P2=shuju[shi];
        }
        void keyscan()
        {
        uchar i;
        if(key1==0)
        {
        delayms(10);
        if(key1==0)
        {
        ledb=0; //把分閃爍指示燈調用來指示啟動|暫停
        while(i==0&&P2!=0xC0)
        {
        TR0=~TR0;// 啟動|暫停
        i++;
        }
        if(TR0==1)
        {
        ledb=1;//把分閃爍指示燈調用來指示啟動|暫停
        }
        else
        {
        TR0=0;
        }
        }
        }
        if(key2==0&&TR0==0)
        {
        dss=0; // 定時小時清零
        dst=0; // 定時天數清零
        dsx=0; // 定時星期清零
        temp1=1; //進入switch-case
        delayms(10);
        }
        if(key3==0&&TR0==0)
        {
        dsf=0;
        dst=0;
        dsx=0;
        temp2=1;
        delayms(10);
        }
        if(key4==0&&TR0==0)
        {
        dsf=0;
        dss=0;
        dsx=0;
        temp3=1;
        delayms(10);
        }
        if(key5==0&&TR0==0)
        {
        dsf=0;
        dss=0;
        dst=0;
        temp4=1;
        delayms(10);
        }
        switch (temp1)
        {
        case 1:
        if(key2==0)
        {
        leds=1; // 關閉定時小時指示燈
        ledt=1; // 關閉定時天指示燈
        ledx=1;// 關閉定時星期指示燈
        ledf=0;// 打開定時分鐘指示燈
        ledg=1; // 關閉秒閃爍
        ledb=1; // 關閉分閃爍
        jdq=0; //關閉繼電器
        dsf++; // 分鐘加加
        shi=dsf;// 把分送去顯示
        if(dsf==16)
        {
        shi=0;
        dsf=0;
        }
        while(!key2);
        temp1=2;
        temp5=1;
        num2=dsf;
        temp6=2;
        temp7=2;
        temp8=2;
        }
        break;
        }
        switch (temp2)
        {
        case 1:
        if(key3==0)
        {
        ledf=1;
        ledt=1;
        ledx=1;
        leds=0;
        jdq=0;
        ledg=1;
        ledb=1;
        dss++;
        shi=dss;
        if(dss==16)
        {
        shi=0;
        dss=0;
        }
        while(!key3);
        temp2=2;
        temp6=1;
        num4=dss;
        temp5=2;
        temp7=2;
        temp8=2;
        }
        break;
        }
        switch (temp3)
        {
        case 1:
        if(key4==0)
        {
        ledf=1;
        leds=1;
        ledx=1;
        ledt=0;
        jdq=0;
        ledg=1;
        ledb=1;
        dst++;
        shi=dst;
        if(dst==16)
        {
        shi=0;
        dst=0;
        }
        while(!key4);
        temp3=2;
        temp7=1;
        num5=dst;
        temp5=2;
        temp6=2;
        temp8=2;
        }
        break;
        }
        switch (temp4)
        {
        case 1:
        if(key5==0)
        {
        ledf=1;
        leds=1;
        ledt=1;
        ledx=0;
        jdq=0;
        ledg=1;
        ledb=1;
        dsx++;
        shi=dsx;
        if(dsx==16)
        {
        shi=0;
        dsx=0;
        }
        while(!key5);
        temp4=2;
        temp8=1;
        num6=dsx;
        temp5=2;
        temp6=2;
        temp7=2;
        }
        break;
        }
        switch (temp5)
        {
        case 1:
        if(num==3686)
        {
        num=0;
        ledg=~ledg;
        num1++;
        }

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

        if(num1==60)
        {
        num1=0;
        num2--;
        shi=num2;
        if(num2==0)
        {
        jdq=1;
        TR0=0;
        }
        }
        break;

        }
        switch (temp6)
        {
        case 1:
        if(num==3686)
        {
        num=0;
        ledg=~ledg;
        num1++;
        }

        if(num1==60)
        {
        num1=0;
        ledb=~ledb;
        num3++;
        if(num3==60)
        {
        num3=0;
        num4--;
        shi=num4;
        }
        if(num4==0)
        {
        jdq=1;
        TR0=0;
        }
        }
        break;
        }
        switch (temp7)
        {
        case 1:
        if(num==3686)
        {
        num=0;
        ledg=~ledg;
        num1++;
        }

        if(num1==60)
        {
        num1=0;
        ledb=~ledb;
        num3++;
        if(num3==1440)
        {
        num3=0;
        num5--;
        shi=num5;
        }
        if(num5==0)
        {
        jdq=1;
        TR0=0;
        }
        }
        break;
        }
        switch (temp8)
        {
        case 1:
        if(num==3686)
        {
        num=0;
        ledg=~ledg;
        num1++;
        }

        if(num1==60)
        {
        num1=0;
        ledb=~ledb;
        num3++;
        if(num3==10080)
        {
        num3=0;
        num6--;
        shi=num6;
        }
        if(num6==0)
        {
        jdq=1;
        TR0=0;
        }
        }
        break;
        }
        }

        void main()
        {
        TMOD=0x02;
        TH0=6;
        TL0=6;
        EA=1;
        ET0=1;
        jdq=0;
        while(1)
        {
        keyscan();
        display(shi);
        while(jdq==1&&P2==0xC0)
        {
        fmq=0;
        ledg=1;
        ledb=1;
        }
        }
        }
        void T0_time()interrupt 1
        {
        num++;
        }

        全部全代碼下載:http://www.51hei.com/f/ledccr.rar
        這是洞洞板繪圖軟件畫的電路圖:





        關鍵詞: DIYLED數碼管定時

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 凤翔县| 收藏| 忻城县| 四平市| 宝应县| 稻城县| 壶关县| 南城县| 涡阳县| 尖扎县| 拜城县| 台中县| 台南县| 清水县| 赣榆县| 和顺县| 板桥市| 香河县| 工布江达县| 霸州市| 嘉黎县| 蓝山县| 宁波市| 娄烦县| 东莞市| 菏泽市| 健康| 德兴市| 玛多县| 铜陵市| 工布江达县| 柳江县| 鞍山市| 嘉祥县| 扎赉特旗| 青神县| 定结县| 天峻县| 务川| 民丰县| 张家川|