天天看點

51單片機單個數位管0-9循環秒計數

51單片機機關數位管0-9循環秒計數

51單片機單個數位管0-9循環秒計數
  • 51單片機:

    AT89C52

    74HC595、機關共陰數位管、

    74HC245、`
  • Proteus仿真

執行個體代碼

/*********51單片機機關數位管0-9循環秒計數***********/
#include <reg51.H>
#define uint unsigned int
#define uchar unsigned char
sbit HC595_DIO   = P1^0;
sbit HC595_SCLK  = P1^1;
sbit HC595_RCLK  = P1^2;

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,//共陰數位管段碼0~f
                                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar code dis_buf[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//共陰數位管位碼

/******************1ms延時子程式(12MHz)*******************/
void delayms(uint k)
{
        uint i,j;
        for(i=k;i>0;i--)
                for(j=125;j>0;j--);
}
/**************** 向HC595發送一個位元組函數 ******************/
void Send_595(uchar dat)
{               
        uchar i;
        for(i=0;i<8;i++)
        {
                HC595_DIO=(dat&0x80)>>7;//由高位到低位指派資料輸出端
                HC595_SCLK = 1;        //移位時鐘
                HC595_SCLK = 0;
                dat <<= 1;                        //dat左移一位
        }
}
/**************** 數位管顯示函數 ******************/
void DisplayScan()
{       
        static uchar i=0;
        Send_595(dis_buf[i]);//向HC595發送位碼(共陰數位管)
        Send_595(table[i]);        //向HC595發送段碼(共陰數位管)
//        Send_595(~dis_buf[i]);//向HC595發送位碼(共陽數位管)
//        Send_595(~table[i]);        //向HC595發送段碼(共陽數位管)
        HC595_RCLK = 1;                //鎖存輸出資料
        HC595_RCLK = 0;
        i++;
        i%=10;
}

void main()
{
        HC595_SCLK  = 0;        //初始化移位時鐘端
        HC595_RCLK  = 0;        //初始化鎖存輸出端
        while(1)
        {
                DisplayScan();        //數位管顯示函數
                delayms(1000);                //延時1ms
        }
}
           

相關代碼解釋

  • i%=10;

    看到這個有點反應懵,
i%=10 等于 if(i>=10)i=0; 其作用就是歸零。

繼續閱讀