制作出來的實物圖如下:
副本 (4) myphoto.jpg (3.05 MB, 下載次數: 355)
下載附件
2018-8-21 16:25 上傳
單片機源程序如下:
- 之前的程序是倒計時的,現在改成了向前走時了,經過反復的比對時間,時鐘準確了!!/*************************************************************
- **** Time: 2018.08.21
- ********************************/
- #include <reg52.h>
- #include<intrins.h>
- sbit CLK = P2^0; //時鐘信號
- sbit DIO = P2^1; //數據/地址數據
- 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}; //有小數點只用于地址0xc1
- unsigned char dpFlag = 0; //控制第二個數碼管的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 );
- unsigned int countTime = 0;
- unsigned char time, sec;
- struct {
- char shi;
- char ge;
- }Hour;
- struct {
- char shi;
- char ge;
- }Min;
- /***********************************************************
- *****
- ***** 主函數
- *****
- ***********************************************************/
- void main( void )
- {
- timer0_init();
- time_set(23, 59); //設置5小時倒計時
- while(1)
- {
- time_display(); //顯示時間
- if(countTime <= 10)
- {
- dpFlag = 0;
- }
- else
- if(countTime <= 20)
- {
- dpFlag = 1;
- }
- else
- {
- countTime = 0;
- time_judge();
- }
- }
- }
- /********************************************************************
- * 名稱 : void time_set(char hour, char min)
- * 功能 : 設置時間
- * 輸入 : char hour, char min
- * 輸出 : 無
- **************************************************************/
- 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 )
- * 功能 : 判斷時間變化
- * 輸入 : void
- * 輸出 : 無
- **************************************************************/
- void time_judge( void )
- {
- sec++;
- if(sec>=60)
- {
- sec=0;
- Min.ge ++;
- }
- if(Min.ge>=10)
- {
- Min.ge=0;
- Min.shi++;
- }
- if(Min.shi>=6)
- {
- Min.ge=0;
- Min.shi=0;
- Hour.ge++;
- }
- if(Hour.ge>=10)
- {
- Hour.ge=0;
- Hour.shi++;
- }
- if((Hour.shi>=2) &&(Hour.ge>=4) )
- {
- sec=0;
- Min.ge =0;
- Min.shi=0;
- Hour.ge=0;
- Hour.shi=0;
- }
- }
- /********************************************************************
- * 名稱 : void time_display( void )
- * 功能 : 顯示時間
- * 輸入 : void
- * 輸出 : 無
- **************************************************************/
- void time_display( void )
- {
- TM1637_writeCammand(0x44);
- TM1637_writeData(0xc0, SEGData[Hour.shi]);
- if(dpFlag)
- TM1637_writeData(0xc1, SEGDataDp[Hour.ge]); //小數點標志為1則用小數點那個數組
- 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信號
- * 輸入 : void
- * 輸出 : 無
- **************************************************************/
- void TM1637_start( void )
- {
- CLK = 1;
- DIO = 1;
- delay_140us();
- DIO = 0;
- delay_140us();
- CLK = 0;
- delay_140us();
- }
- /********************************************************************
- * 名稱 : void TM1637_stop( void )
- * 功能 : stop信號
- * 輸入 : void
- * 輸出 : 無
- **************************************************************/
- 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 )
- * 功能 : 寫1bit
- * 輸入 : unsigned char mBit
- * 輸出 : 無
- **************************************************************/
- 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
- * 輸出 : 無
- **************************************************************/
- 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); //獲得應答位
- }
- /********************************************************************
- * 名稱 : void TM1637_writeCammand(unsigned char mData)
- * 功能 : 寫指令1byte
- * 輸入 : unsigned char mData
- * 輸出 : 無
- **************************************************************/
- void TM1637_writeCammand(unsigned char mData)
- {
- TM1637_start();
- TM1637_write1Byte(mData); //數據
- TM1637_stop();
- }
- /********************************************************************
- * 名稱 : void TM1637_writeData(unsigned char addr, unsigned char mData)
- * 功能 : 固定地址寫數據1byte
- * 輸入 : unsigned char addr, unsigned char mData
- * 輸出 : 無
- **************************************************************/
- void TM1637_writeData(unsigned char addr, unsigned char mData)
- {
- TM1637_start();
- TM1637_write1Byte(addr); //地址
- TM1637_write1Byte(mData); //數據
- TM1637_stop();
- }
- /********************************************************************
- **************************************************************/
- void timer0_init( void )
- {
- TMOD=0X01;
- TH0=(65536-35000)/256;
- TL0=(65536-35000)%256;
- ET0=1;
- EA=1;
- TR0=1;
- }
復制代碼
0.png (47.06 KB, 下載次數: 49)
下載附件
2018-8-21 17:13 上傳
所有資料51hei提供下載:
TM1637.rar
(33.18 KB, 下載次數: 23)
2018-8-21 16:23 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|