久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4051|回復: 10
打印 上一主題 下一主題
收起左側

單片機tm1637數碼管倒計時,如何改成正計時?

  [復制鏈接]
跳轉到指定樓層
樓主
ID:577423 發表于 2019-10-3 19:50 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include <reg52.h>
#include<intrins.h>

sbit CLK = P0^0;  //時鐘信號
sbit DIO = P0^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 );
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;

/***********************************************************
*****
***** 主函數
*****
***********************************************************/
void main( void )
{
        timer0_init();
        time_set(5, 0);  //設置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)
{
        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 )
{
        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 )
* 功能 : 顯示時間
* 輸入 : 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 )
{
        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=(65535-50000)/256;
        TL0=(65535-50000)%256;
        ET0=1;
        EA=1;
        TR0=1;        
}              


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


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

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

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

使用道具 舉報

沙發
ID:82869 發表于 2019-10-3 23:14 | 只看該作者
遞減改成遞增就可以了吧
回復

使用道具 舉報

板凳
ID:35873 發表于 2019-10-4 01:11 | 只看該作者
把void time_judge( void )里面相關數值改成順數 比如  0-9  0-23  0-60  等等   然后-1  改成+1  總之反過來就是嘍  其實我也不懂  瞎蒙的
回復

使用道具 舉報

地板
ID:524818 發表于 2019-10-4 08:40 | 只看該作者
數組聲明的花括號里次序顛倒一下應該就行了
回復

使用道具 舉報

5#
ID:553031 發表于 2019-10-4 09:42 來自手機 | 只看該作者
cphnkj188 發表于 2019-10-4 08:40
數組聲明的花括號里次序顛倒一下應該就行了

遞減改成遞增就可以了吧
回復

使用道具 舉報

6#
ID:213173 發表于 2019-10-4 17:17 | 只看該作者
樓主找的這個示例并不適合初學者參考。原作者把簡單問題復雜化,使用了對于初學者不易理解的結構體變量,把非常簡單的計時程序寫得啰啰嗦嗦一大堆代碼。按樓主需求可以找一些秒表程序參考。
回復

使用道具 舉報

7#
ID:577423 發表于 2019-10-4 19:07 | 只看該作者
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;
                }
        }        
}
主要是改這一段,我改過效果不好
回復

使用道具 舉報

8#
ID:213173 發表于 2019-10-5 06:53 | 只看該作者
越南超級人類 發表于 2019-10-4 19:07
void time_judge( void )
{
        if(++sec == 60)           //60秒

只是簡單的改這一部分不能解決問題,給你改了一下,冗余的部分全部去掉,你試試。
  1. #include <reg52.h>
  2. #include<intrins.h>

  3. sbit CLK = P0^0;  //時鐘信號
  4. sbit DIO = P0^1;  //數據/地址數據
  5. //這里需要增加一個輸出端口
  6. //sbit OUT = P1^0;                                                                                                                                                                 //共陰極數碼管

  7. unsigned char code SEGData[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//1-9
  8. unsigned char code SEGDataDp[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //有小數點只用于地址0xc1

  9. unsigned char dpFlag = 0; //控制第二個數碼管的dp的顯示

  10. void TM1637_start( void );
  11. void TM1637_stop( void );
  12. void TM1637_write1Bit(unsigned char mBit);
  13. void TM1637_write1Byte(unsigned char mByte);
  14. void TM1637_writeCammand(unsigned char mData);
  15. void TM1637_writeData(unsigned char addr, unsigned char mData);
  16. //void time_set(char hour, char min);
  17. void time_judge( void );
  18. void time_display( void );
  19. void timer0_init( void );

  20. void delay_140us( void );
  21. //void delay_1ms(unsigned int i);

  22. unsigned int countTime = 0;
  23. unsigned char sec,min,hour;
  24. bit time=1;
  25. /*
  26. struct
  27. {
  28.         char shi;
  29.         char ge;
  30. }Hour;

  31. struct
  32. {
  33.         char shi;
  34.         char ge;
  35. }Min;
  36. */
  37. /***********************************************************
  38. *****
  39. ***** 主函數
  40. *****
  41. ***********************************************************/
  42. void main( void )
  43. {
  44.         timer0_init();
  45. //        time_set(5,0);  //設置5小時倒計時
  46. //        OUT=1;//加電輸出
  47.         while(1)
  48.         {
  49.                 if(time)//判斷停止計時標志
  50.                 {
  51.                         if(countTime <=10)//閃秒
  52.                         {
  53.                                 dpFlag = 0;                        
  54.                         }
  55.                         else
  56.                         {
  57.                                 dpFlag = 1;        
  58.                         }
  59.                         if(countTime >=20)
  60.                         {
  61.                                 countTime = 0;
  62.                                 time_judge();
  63.                         }
  64.                 }
  65.                 time_display();         //顯示時間
  66.         }
  67. }
  68. /*
  69. void time_set(char hour, char min)
  70. {
  71.         Hour.shi = hour/10;
  72.         Hour.ge = hour%10;
  73.         Min.shi = min/10;
  74.         Min.ge = min%10;               
  75. }
  76. */
  77. /*************************************************************
  78. * 名稱 : time_judge( void )
  79. * 功能 : 判斷時間變化
  80. * 輸入 : void
  81. * 輸出 : 無
  82. **************************************************************/
  83. void time_judge( void )
  84. {
  85.         if(++sec>=60)           //60秒
  86.         {        
  87.                 sec=0;
  88.                 if(++min>=60)
  89.                 {
  90.                         min=0;
  91.                         if(++hour>=5)//正計時5小時到
  92.                         {
  93.                                 time=0;//計時結束
  94. //                                OUT=0;//停止輸出
  95.                         }
  96.                 }        
  97. /*
  98.                 if((Hour.shi || Hour.ge || Min.shi || Min.ge) && (--Min.ge <= -1))
  99.                 {
  100.                         Min.ge = 9;
  101.                         if((Hour.shi) ||(Hour.ge) && (--Min.shi <= -1))
  102.                         {
  103.                                 Min.shi = 5;
  104.                                 if(Hour.shi && (--Hour.ge <= -1))
  105.                                 {
  106.                                         Hour.ge = 9;
  107.                                         if(--Hour.shi <= -1)
  108.                                         {
  109.                                                 Hour.shi = 0;        
  110.                                         }
  111.                                 }
  112.                                 else
  113.                                 if((!Hour.shi) && (--Hour.ge <= -1))
  114.                                 {
  115.                                         Hour.ge = 0;
  116.                                 }
  117.                         }
  118.                         else
  119.                         if((!Hour.shi) && (!Hour.ge) && (--Min.shi <= -1))
  120.                         {
  121.                                 Min.shi = 0;
  122.                         }
  123.                 }
  124.                 else
  125.                 if(((!Hour.shi) && (!Hour.ge) && (!Min.shi) ) && (Min.ge <= -1))
  126.                 {
  127.                         Min.ge = 0;
  128.                 }
  129. */
  130.         }
  131. }
  132. /*******************************************************************
  133. * 名稱 : void time_display( void )
  134. * 功能 : 顯示時間
  135. * 輸入 : void
  136. * 輸出 : 無
  137. **************************************************************/
  138. void time_display( void )
  139. {
  140.         TM1637_writeCammand(0x44);
  141.         TM1637_writeData(0xc0, SEGData[hour/10]);
  142.         if(dpFlag)
  143.                 TM1637_writeData(0xc1, SEGDataDp[hour%10]); //小數點標志為1則用小數點那個數組
  144.         else
  145.                 TM1637_writeData(0xc1, SEGData[hour%10]);
  146.         TM1637_writeData(0xc2, SEGData[min/10]);
  147.         TM1637_writeData(0xc3, SEGData[min%10]);
  148.         TM1637_writeCammand(0x8a);                     
  149. /*
  150.         TM1637_writeCammand(0x44);
  151.         TM1637_writeData(0xc0, SEGData[Hour.shi]);
  152.         if(dpFlag)
  153.                 TM1637_writeData(0xc1, SEGDataDp[Hour.ge]); //小數點標志為1則用小數點那個數組
  154.         else
  155.                 TM1637_writeData(0xc1, SEGData[Hour.ge]);
  156.         TM1637_writeData(0xc2, SEGData[Min.shi]);
  157.         TM1637_writeData(0xc3, SEGData[Min.ge]);
  158.         TM1637_writeCammand(0x8a);
  159. */
  160. }

  161. /********************************************************************
  162. * 名稱 : void TM1637_start( void )
  163. * 功能 : start信號
  164. * 輸入 : void
  165. * 輸出 : 無
  166. **************************************************************/
  167. void TM1637_start( void )
  168. {
  169.         CLK = 1;
  170.         DIO = 1;
  171.         delay_140us();
  172.         DIO = 0;
  173.         delay_140us();
  174.         CLK = 0;
  175.         delay_140us();
  176. }

  177. /********************************************************************
  178. * 名稱 : void TM1637_stop( void )
  179. * 功能 : stop信號
  180. * 輸入 : void
  181. * 輸出 : 無
  182. **************************************************************/
  183. void TM1637_stop( void )
  184. {
  185.         CLK = 0;
  186.         delay_140us();
  187.         DIO = 0;
  188.         delay_140us();
  189.         CLK = 1;
  190.         delay_140us();
  191.         DIO = 1;
  192.         delay_140us();
  193. }

  194. void TM1637_write1Bit(unsigned char mBit )
  195. {
  196.         CLK = 0;
  197.         delay_140us();
  198.         if(mBit)
  199.                 DIO = 1;
  200.         else
  201.            DIO = 0;
  202.         delay_140us();        
  203.         CLK = 1;
  204.         delay_140us();
  205. }

  206. /********************************************************************
  207. * 名稱 : void TM1637_write1Byte(unsigned char mByte)
  208. * 功能 : 寫1byte
  209. * 輸入 : unsigned char mByte
  210. * 輸出 : 無
  211. **************************************************************/
  212. void TM1637_write1Byte(unsigned char mByte)
  213. {
  214.         char loop = 0;
  215.         for(loop = 0; loop < 8; loop++)
  216.         {
  217.                 TM1637_write1Bit((mByte>>loop)&0x01); //取得最低位        
  218.         }
  219.         CLK = 0;
  220.         delay_140us();
  221.         DIO = 1;
  222.         delay_140us();
  223.         CLK = 1;
  224.         delay_140us();
  225.         while(DIO == 1);  //獲得應答位         
  226. }
  227. /********************************************************************
  228. * 名稱 : void TM1637_writeCammand(unsigned char mData)
  229. * 功能 : 寫指令1byte
  230. * 輸入 : unsigned char mData
  231. * 輸出 : 無
  232. **************************************************************/
  233. void TM1637_writeCammand(unsigned char mData)
  234. {
  235.         TM1637_start();
  236.         TM1637_write1Byte(mData);  //數據
  237.         TM1637_stop();        
  238. }
  239. /********************************************************************
  240. * 名稱 : void TM1637_writeData(unsigned char addr, unsigned char mData)
  241. * 功能 : 固定地址寫數據1byte
  242. * 輸入 : unsigned char addr, unsigned char mData
  243. * 輸出 : 無
  244. **************************************************************/
  245. void TM1637_writeData(unsigned char addr, unsigned char mData)
  246. {
  247.         TM1637_start();
  248.         TM1637_write1Byte(addr);  //地址
  249.         TM1637_write1Byte(mData);  //數據
  250.         TM1637_stop();        
  251. }

  252. void timer0_init( void )
  253. {
  254.         TMOD=0X01;
  255.         TH0=(65535-50000)/256;
  256.         TL0=(65535-50000)%256;
  257.         ET0=1;
  258.         EA=1;
  259.         TR0=1;        
  260. }              
  261. /********************************************************************
  262. * 名稱 :
  263. * 功能 : 定時50ms,實際運行中由于指令運行造成的延時,實際時間肯定大于50ms
  264. * 輸入 : 無
  265. * 輸出 : 無
  266. **************************************************************/
  267. void timer0_isr() interrupt 1
  268. {
  269.         TH0=(65535-50000)/256;  //50ms
  270.         TL0=(65535-50000)%256;        //
  271.         countTime++;
  272. }

  273. /********************************************************************
  274. * 名稱 : Delay_1ms(unsigned int i)
  275. * 功能 : 延時子程序,延時時間為 140us
  276. * 輸入 :
  277. * 輸出 : 無
  278. **************************************************************/
  279. void delay_140us( void )
  280. {
  281.         int i;
  282.         for(i=0; i<20; i++)
  283.                 _nop_();
  284. }

  285. /********************************************************************
  286. * 名稱 : Delay_1ms(unsigned int i)
  287. * 功能 : 延時子程序,延時時間為 1ms * x
  288. * 輸入 : x (延時一毫秒的個數)
  289. * 輸出 : 無
  290. ***********************************************************************/
  291. /*
  292. void Delay_1ms(unsigned int i)//1ms延時
  293. {
  294.     unsigned char x,j;
  295.     for(j=0;j<i;j++)
  296.     for(x=0;x<=148;x++);        
  297. }
  298. */

復制代碼
回復

使用道具 舉報

9#
ID:577423 發表于 2019-10-5 20:02 | 只看該作者
其實我想學習tm1537做顯示,主要是不懂邏輯,位等等這些東西
回復

使用道具 舉報

10#
ID:845657 發表于 2020-11-18 22:33 | 只看該作者
wulin 發表于 2019-10-5 06:53
只是簡單的改這一部分不能解決問題,給你改了一下,冗余的部分全部去掉,你試試。

大佬,這個能顯示秒嗎?
回復

使用道具 舉報

11#
ID:748788 發表于 2021-1-5 11:02 | 只看該作者
越南超級人類 發表于 2019-10-5 20:02
其實我想學習tm1537做顯示,主要是不懂邏輯,位等等這些東西

那你不如找x寶tm1637的賣家看看,那里一般都會提供比較簡潔的例程
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产91在线精品 | 亚洲精品久久久一区二区三区 | 精区3d动漫一品二品精区 | 日韩在线不卡 | 成人在线观看网站 | 看亚洲a级一级毛片 | 国产日韩av一区二区 | 天天色av | 免费成人在线网站 | 最新中文字幕在线 | 亚洲国产免费 | 日韩影院一区 | 久久综合888 | 国产在线观看av | 免费的日批视频 | 国产精品色一区二区三区 | 亚洲一区视频在线 | 欧美成人免费在线视频 | 国产精品国产精品 | 国外成人在线视频 | 在线免费观看黄色 | 波多野结衣一二三区 | 亚洲一区二区三区福利 | 国产精品久久9 | 亚洲性免费 | 成人午夜视频在线观看 | 亚洲欧美激情精品一区二区 | 国产精品美女一区二区三区 | 狠狠做六月爱婷婷综合aⅴ 国产精品视频网 | 狠狠爱综合网 | 欧洲av一区| 国产精品久久国产愉拍 | 91xxx在线观看 | 毛片网站在线观看视频 | 国产精品成人一区二区 | 国产精品一级 | 在线视频 亚洲 | 谁有毛片 | 日韩高清一区 | 综合一区 | 精品一区国产 |