新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 時鐘及溫度用74hc164+74ls145數(shù)碼管顯示單片機(jī)程序

        時鐘及溫度用74hc164+74ls145數(shù)碼管顯示單片機(jī)程序

        作者: 時間:2016-12-01 來源:網(wǎng)絡(luò) 收藏
        下面是實(shí)物圖:




        電路圖很簡單我就不畫了 數(shù)碼管用74hc164串行轉(zhuǎn)并行芯片+74ls145這2個芯片驅(qū)動一個負(fù)責(zé)段選一個負(fù)責(zé)位選,具體看程序頂部的引腳定義.完整的keil工程文件下載地址:http://www.51hei.com/f/164smg.rar 下面是程序源碼.

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

        #include
        #include
        #define uchar unsigned char
        #define uint unsigned int
        sbit iicclk=P1^0;////總線存儲時鐘引腳定義
        sbit iicdat=P1^1;////總線存儲數(shù)據(jù)引腳定義
        sbit hc164dat=P1^2;//段顯串行數(shù)據(jù)引腳定義
        sbit hc164clk=P1^3;//段顯串行時鐘引腳定義
        /*sbit hc164clr=P1^4;*///段顯芯片清零引腳,低電平時,全部輸出引腳清零,即低電平
        sbit ls145p0=P1^5;///位選譯碼芯片P0
        sbit ls145p1=P1^6;///位選譯碼芯片P1
        sbit ls145p2=P1^7;///位選譯碼芯片P2
        sbit ls145p3=P3^7;///位選譯碼芯片P2,用于在74HC164移入數(shù)據(jù)時P0~P3全置高,關(guān)閉所有數(shù)碼管
        sbit DS1820DQ=P0^0;
        sbit ADD=P0^4;///////加一
        sbit MINUS=P0^5;/////減一
        sbit ENTER=P0^6;/////確定
        sbit SET=P0^7;///////設(shè)定鍵
        uchar code tabledu[]={0xed,0x21,0x8f,0xab,0x63,0xea,0xee,0xa1,0xef,0xeb,0x0};//垃圾顯示板0~~9段顯數(shù)據(jù)
        uchar code tablewe[]={0x0,0x20,0x40,0x60,0x80,0xa0,0xc0,0xe0,0x10};//位選編碼,P2口高八位產(chǎn)生編碼值,0x10為關(guān)閉所有位選
        char dateshu[8];
        uchar tim,sec,ming,mins,hourg,hours,min,hour,setflag,seta,dqflag,temperl,temperh,dat;
        void delay1ms(uint x)//0.5毫秒延時函數(shù)
        {
        uint y,z;
        for(y=x;y>0;y--)
        for(z=60;z>0;z--);
        }
        void delayns()
        {
        _nop_();
        _nop_();

        }
        void delay10us(uchar z)//z為3是定時10微秒
        {
        while(z)
        z--;
        }
        void DelayX0us(uchar n)
        {
        while (n--)
        {
        _nop_();
        _nop_();
        }
        }
        void dqrsr()//1820初始化函數(shù)
        {

        dqflag=0;
        DS1820DQ=1;
        delayns();
        DS1820DQ=0;
        DelayX0us(48);//時序延時500US
        DS1820DQ=1;
        delay10us(6);//時序延時20us
        if(DS1820DQ==0)dqflag=1;
        DelayX0us(42);


        }
        void dqwrite(uchar a)
        {
        uchar i;
        dqflag=0;
        DS1820DQ=1; //to釋放總線
        delayns();//時序延時

        for(i=8;i>0;i--)//寫一個字節(jié)的數(shù)據(jù)
        {
        DS1820DQ=0;//總線置低
        _nop_();
        _nop_();

        a=a>>1;//右移時,逸出位保存到CY中
        DS1820DQ=CY;//發(fā)送送據(jù)
        DelayX0us(6);//延時70us
        DS1820DQ=1; //to釋放總線

        }
        }
        uchar dqread(void)//1820讀函數(shù)
        {
        uchar i;
        DS1820DQ=1; //to釋放總線

        delayns();//時序延時
        for(i=0;i<8;i++)
        {
        dat>>=1;
        DS1820DQ=0;
        _nop_();
        _nop_();
        DS1820DQ=1;
        delayns();

        if(DS1820DQ)dat|=0x80; //如果讀回的數(shù)據(jù)為1則作與處理移入DAT變量

        DelayX0us(6);//延時70us
        }

        return dat;

        }
        void write164(uchar x)
        {
        uchar y;
        hc164clk=0;//時鐘置低
        _nop_();
        _nop_();
        for(y=0;y<8;y++)
        {
        hc164dat=(x&0x80);
        delayns();
        hc164clk=1;
        delayns();
        hc164clk=0;
        delayns();
        x<<=1;
        }

        }
        void init()
        {
        P0=0xff;//輸入接口P0全置一,讓按鍵讀回輸入信息
        P2=tablewe[8];//關(guān)閉所有數(shù)碼管的位選
        hc164clk=0;//時鐘置低,以產(chǎn)生上升沿移入數(shù)據(jù)
        IE=0X82; //EA=1開總中斷ET0=1定時器零中斷允許
        TCON=0X10;//TR0=1定時零中斷啟動
        TMOD=0X01;//M1M0=01 T0 工作方式1,16位定時器
        TH0=(65636-50000)/256;
        TL0=(65636-50000)%256;//50ms定時初值
        DS1820DQ=1;

        }
        void iicstart()//暫未使用
        {

        }
        void iicstop()//暫未使用
        {

        }
        void display(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f,uchar g,uchar h)//顯示函數(shù)
        {
        P2=tablewe[8];
        write164(tabledu[a]);
        P2=tablewe[0];
        delay1ms(2);

        P2=tablewe[8];
        write164(tabledu[b]);
        P2=tablewe[1];
        delay1ms(2);
        P2=tablewe[8];
        write164(tabledu[c]);
        P2=tablewe[2];
        delay1ms(2);
        P2=tablewe[8];
        write164(tabledu[d]);
        P2=tablewe[3];
        delay1ms(2);
        P2=tablewe[8];
        write164(tabledu[e]);
        P2=tablewe[4];
        delay1ms(2);
        P2=tablewe[8];
        write164(tabledu[f]);
        P2=tablewe[5];
        delay1ms(2);
        P2=tablewe[8];
        write164(tabledu[g]);
        P2=tablewe[6];
        delay1ms(2);
        P2=tablewe[8];
        write164(tabledu[h]);
        P2=tablewe[7];
        delay1ms(2);
        }
        void timer()//24小時時間計(jì)算函數(shù)
        {

        if(sec>59)
        {


        sec=0;
        min++;
        if(min>59)
        {
        min=0;
        hour++;
        if(hour>23)
        {
        hour=0;
        }
        }

        }
        dateshu[0]=sec%10;
        dateshu[1]=sec/10;
        dateshu[2]=min%10;
        dateshu[3]=min/10;
        dateshu[4]=hour%10;
        dateshu[5]=hour/10;


        }
        void key()//設(shè)定程序入口
        {
        if(SET==0)
        {
        setflag=1;
        }


        上一頁 1 2 下一頁

        評論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 湘西| 邵阳市| 英山县| 台江县| 神木县| 齐河县| 台南市| 翁牛特旗| 灵武市| 建湖县| 新邵县| 秭归县| 余干县| 五常市| 绥中县| 开鲁县| 博客| 阜康市| 青铜峡市| 白水县| 汝城县| 庄河市| 凉山| 潮安县| 抚顺县| 乌兰县| 綦江县| 西乌珠穆沁旗| 绥滨县| 深水埗区| 香河县| 乡城县| 凉城县| 磐安县| 五指山市| 遵化市| 弋阳县| 莱芜市| 嘉禾县| 无棣县| 万源市|