找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2570|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)TM1637驅(qū)動(dòng)程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:917238 發(fā)表于 2021-8-12 16:10 來(lái)自觸屏版 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
#include <reg52.h>
#include<intrins.h>

sbit CLK = P0^0;  //時(shí)鐘信號(hào)
sbit DIO = P0^1;  //數(shù)據(jù)/地址數(shù)據(jù)
                                                                                                                                                                 //共陰極數(shù)碼管
unsigned char code SEGData[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//1-9
unsigned char code SEGDataDp[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //有小數(shù)點(diǎn)只用于地址0xc1

unsigned char dpFlag = 0; //控制第二個(gè)數(shù)碼管的dp的顯示

void TM1637_start( void );
void TM1637_stop( void );
void TM1637_write1Bit(unsigned char mBit);
void TM1637_write1Byte(unsigned char mByte);
void TM1637_writeCammand(unsigned char mData);
void TM1637_writeData(unsigned char addr, unsigned char mData);
void time_set(char hour, char min);
void time_judge( void );
void time_display( void );
void timer0_init( void );

void delay_140us( void );
void delay_1ms(unsigned int i);

unsigned int countTime = 0;
unsigned char time, sec;
struct {
        char shi;
        char ge;
}Hour;

struct {
        char shi;
        char ge;
}Min;

/***********************************************************
*****
***** 主函數(shù)
*****
***********************************************************/
void main( void )
{
        timer0_init();
        time_set(5, 0);  //設(shè)置5小時(shí)倒計(jì)時(shí)
        while(1)
        {
                time_display();         //顯示時(shí)間
                if(countTime <= 10)
                {
                        dpFlag = 0;                        
                }
                else
                if(countTime <= 20)
                {
                        dpFlag = 1;        
                }
                else
                {
                        countTime = 0;
                        time_judge();
                }
        }
}

void time_set(char hour, char min)
{
        if((hour < 0) || (min<0))
        {
                hour = 0;
                min = 0;
        }
        Hour.shi = hour/10;
        Hour.ge = hour%10;
        Min.shi = min/10;
        Min.ge = min%10;               
}

/*************************************************************
* 名稱 : time_judge( void )
* 功能 : 判斷時(shí)間變化
* 輸入 : void
* 輸出 : 無(wú)
**************************************************************/
void time_judge( void )
{
        if(++sec == 60)           //60秒
        {        
                sec = 0;
                if((Hour.shi || Hour.ge || Min.shi || Min.ge) && (--Min.ge <= -1))
                {
                        Min.ge = 9;
                        if((Hour.shi) ||(Hour.ge) && (--Min.shi <= -1))
                        {
                                Min.shi = 5;
                                if(Hour.shi && (--Hour.ge <= -1))
                                {
                                        Hour.ge = 9;
                                        if(--Hour.shi <= -1)
                                        {
                                                Hour.shi = 0;        
                                        }
                                }
                                else
                                if((!Hour.shi) && (--Hour.ge <= -1))
                                {
                                        Hour.ge = 0;
                                }
                        }
                        else
                        if((!Hour.shi) && (!Hour.ge) && (--Min.shi <= -1))
                        {
                                Min.shi = 0;
                        }
                }
                else
                if(((!Hour.shi) && (!Hour.ge) && (!Min.shi) ) && (Min.ge <= -1))
                {
                        Min.ge = 0;
                }
        }        
}
  /*******************************************************************
* 名稱 : void time_display( void )
* 功能 : 顯示時(shí)間
* 輸入 : void
* 輸出 : 無(wú)
**************************************************************/
void time_display( void )
{
        TM1637_writeCammand(0x44);
        TM1637_writeData(0xc0, SEGData[Hour.shi]);
        if(dpFlag)
                TM1637_writeData(0xc1, SEGDataDp[Hour.ge]); //小數(shù)點(diǎn)標(biāo)志為1則用小數(shù)點(diǎn)那個(gè)數(shù)組
        else
                TM1637_writeData(0xc1, SEGData[Hour.ge]);
        TM1637_writeData(0xc2, SEGData[Min.shi]);
        TM1637_writeData(0xc3, SEGData[Min.ge]);
        TM1637_writeCammand(0x8a);                                
}

/********************************************************************
* 名稱 : void TM1637_start( void )
* 功能 : start信號(hào)
* 輸入 : void
* 輸出 : 無(wú)
**************************************************************/
void TM1637_start( void )
{
        CLK = 1;
        DIO = 1;
        delay_140us();
        DIO = 0;
        delay_140us();
        CLK = 0;
        delay_140us();
}

/********************************************************************
* 名稱 : void TM1637_stop( void )
* 功能 : stop信號(hào)
* 輸入 : void
* 輸出 : 無(wú)
**************************************************************/
void TM1637_stop( void )
{
        CLK = 0;
        delay_140us();
        DIO = 0;
        delay_140us();
        CLK = 1;
        delay_140us();
        DIO = 1;
        delay_140us();
}

void TM1637_write1Bit(unsigned char mBit )
{
        CLK = 0;
        delay_140us();
        if(mBit)
                DIO = 1;
        else
                DIO = 0;
        delay_140us();        
        CLK        = 1;
        delay_140us();
}

/********************************************************************
* 名稱 : void TM1637_write1Byte(unsigned char mByte)
* 功能 : 寫1byte
* 輸入 : unsigned char mByte
* 輸出 : 無(wú)
**************************************************************/
void TM1637_write1Byte(unsigned char mByte)
{
        char loop = 0;
        for(loop = 0; loop < 8; loop++)
        {
                TM1637_write1Bit((mByte>>loop)&0x01); //取得最低位        
        }
        CLK = 0;
        delay_140us();
        DIO = 1;
        delay_140us();
        CLK = 1;
        delay_140us();
        while(DIO == 1);  //獲得應(yīng)答位         
}

/********************************************************************
* 名稱 : void TM1637_writeCammand(unsigned char mData)
* 功能 : 寫指令1byte
* 輸入 : unsigned char mData
* 輸出 : 無(wú)
**************************************************************/
void TM1637_writeCammand(unsigned char mData)
{
        TM1637_start();
        TM1637_write1Byte(mData);  //數(shù)據(jù)
        TM1637_stop();        
}

/********************************************************************
* 名稱 : void TM1637_writeData(unsigned char addr, unsigned char mData)
* 功能 : 固定地址寫數(shù)據(jù)1byte
* 輸入 : unsigned char addr, unsigned char mData
* 輸出 : 無(wú)
**************************************************************/
void TM1637_writeData(unsigned char addr, unsigned char mData)
{
        TM1637_start();
        TM1637_write1Byte(addr);  //地址
        TM1637_write1Byte(mData);  //數(shù)據(jù)
        TM1637_stop();        
}


void timer0_init( void )
{
        TMOD=0X01;
        TH0=(65535-50000)/256;
        TL0=(65535-50000)%256;
        ET0=1;
        EA=1;
        TR0=1;        
}              


/********************************************************************
* 名稱 :
* 功能 : 定時(shí)50ms,實(shí)際運(yùn)行中由于指令運(yùn)行造成的延時(shí),實(shí)際時(shí)間肯定大于50ms
* 輸入 : 無(wú)
* 輸出 : 無(wú)
**************************************************************/
void timer0_isr() interrupt 1
{
        TH0=(65535-50000)/256;  //50ms
        TL0=(65535-50000)%256;        //
        countTime++;
}


/********************************************************************
* 名稱 : Delay_1ms(unsigned int i)
* 功能 : 延時(shí)子程序,延時(shí)時(shí)間為 140us
* 輸入 :
* 輸出 : 無(wú)
**************************************************************/
void delay_140us( void )
{
    int i;
    for(i=0; i<20; i++)
      _nop_();
}

/********************************************************************
* 名稱 : Delay_1ms(unsigned int i)
* 功能 : 延時(shí)子程序,延時(shí)時(shí)間為 1ms * x
* 輸入 : x (延時(shí)一毫秒的個(gè)數(shù))
* 輸出 : 無(wú)
***********************************************************************/
/*
void Delay_1ms(unsigned int i)//1ms延時(shí)
{
    unsigned char x,j;
    for(j=0;j<i;j++)
    for(x=0;x<=148;x++);        
}
*/

評(píng)分

參與人數(shù) 1黑幣 +10 收起 理由
admin + 10 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:328014 發(fā)表于 2021-8-12 16:17 | 只看該作者
樓主你好,有原理圖嗎?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表