新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 自制51單片機超大數碼管時鐘

        自制51單片機超大數碼管時鐘

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

        市面上出售的數碼管一般都很小,本人用led發光管自己制作了一種個頭很非常大的數碼管,掛在家里顯示效果非常牛逼下面是實物圖:
        點擊瀏覽下一頁點擊瀏覽下一頁

        點擊瀏覽下一頁點擊瀏覽下一頁

        下面是電路圖:
        點擊瀏覽下一頁

        下面是c51程序源代碼:

        #includereg52.h>
        #include intrins.h>
        #define uchar unsigned char
        #define uint unsigned int
        #define pos P0 //設置數碼顯示的位選
        #define segs P1 //設置數碼顯示的段選

        code unsigned char d[]=
        {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,

        0x7c,0x39,0x5e,0x79,0x71,0x40,0};
        // 0 1 2 3 4 5 6 7 8 9 a b c d e f - 熄滅
        //P0段選,共陰數碼管 0-9 a-f - 表

        unsigned char code w[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
        //P1位選,直接使用P1的8個端口進行8位選擇(此演示中未用到)

        //ds1302連線設置
        sbit SCL2=P2^0; //SCL2定義為P2口的第2位腳,連接DS1302SCL
        sbit SDA2=P2^1; //SDA2定義為P2口的第1位腳,連接DS1302SCL
        sbit RST = P2^2; // DS1302片選腳

        unsigned char now[8]= {0, 19, 9, 17, 1, 7 , 10, 0};
        // 秒 分 時 日 月 星期 年 寫入禁止(0允許寫入,1禁止寫入)
        unsigned char nowtoshow[8];//進行數據位的拆分處理用
        code unsigned char write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //保存寫入寄存器位置
        code unsigned char read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d}; //保存讀取寄存器位置

        unsigned char flash=0; //閃秒
        void display(unsigned char *lp);//數字的顯示函數;lp為指向數組的地址,lc為顯示的個數

        void Write_Ds1302_byte(unsigned char temp); //字節寫入函數
        void Write_Ds1302( unsigned char address,unsigned char dat ); //調用字節定入函數在特定的地址寫入特定的數據
        unsigned char Read_Ds1302 ( unsigned char address ); //調用指定的地址的數據

        void Read_RTC(void);//read RTC //讀取時間日期值到nowtoshow
        void Set_RTC(void);//set RTC //設定時間日期值,這里用于賦初值
        void keydelay(unsigned char t);////鍵盤消抖延時
        delay();


        void main()
        {
        unsigned int k=0; //使k在0到4000之間循環,不同的時間段顯示不同的內容,以較多的時間顯示時間,以很少的時間顯示日期和星期

        //Set_RTC(); //設初值,第一次使用,以后就可以注釋掉,以免再次調校時間,當然必須給1302接上2~5.5V的備用電源或電池

        Read_RTC();
        nowtoshow[0]=now[2]/16; //數據的轉換,因我們采用數碼管0~9的顯示,將數據分開
        nowtoshow[1]=now[2]0x0f;
        nowtoshow[2]=now[1]/16;
        nowtoshow[3]=now[1]0x0f;
        display(nowtoshow);

        while(1)
        {
        if (k2000) //顯示時間
        {
        if (k%100==0) //循環1000次后進行一次數據更新
        {
        Read_RTC();
        if (flash==0) //象征性的閃秒,并不準確,也沒有必要準確
        { flash=1;}
        else
        {flash=0;}
        nowtoshow[0]=now[2]/16; //數據的轉換,因我們采用數碼管0~9的顯示,將數據分開
        if (nowtoshow[0]==0)nowtoshow[0]=17; //如果是0則不顯示
        nowtoshow[1]=now[2]0x0f;
        nowtoshow[2]=now[1]/16;
        nowtoshow[3]=now[1]0x0f;
        }
        }
        if (k>2000k2500) //顯示日期
        {
        flash=17;
        nowtoshow[0]=now[4]/16; //數據的轉換,因我們采用數碼管0~9的顯示,將數據分開
        if (nowtoshow[0]==0)nowtoshow[0]=17; //如果是0則不顯示
        nowtoshow[1]=now[4]0x0f;
        nowtoshow[2]=now[3]/16;
        if (nowtoshow[2]==0)nowtoshow[2]=17; //如果是0則不顯示

        nowtoshow[3]=now[3]0x0f;


        }
        if (k>2500) //顯示星期
        {
        flash=17;
        nowtoshow[0]=17; //數據的轉換,因我們采用數碼管0~9的顯示,將數據分開
        nowtoshow[1]=17;
        nowtoshow[2]=17;
        nowtoshow[3]=now[5];
        }
        k++;
        if (k==3000)k=0;
        display(nowtoshow);
        }
        }

        51單片機相關文章:51單片機教程



        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 交城县| 宁国市| 建始县| 咸宁市| 厦门市| 高碑店市| 东兰县| 北安市| 绥芬河市| 铁岭市| 万荣县| 丹凤县| 夏河县| 临武县| 滨海县| 福贡县| 那坡县| 固原市| 穆棱市| 桐乡市| 贵阳市| 邵阳县| 淳化县| 从江县| 海淀区| 迭部县| 大化| 清远市| 德江县| 龙南县| 广宁县| 饶河县| 云南省| 石城县| 平阳县| 峨眉山市| 武威市| 日照市| 大洼县| 苍山县| 滁州市|