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

QQ登錄

只需一步,快速開始

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

STC89單片機(jī)+TM1638超級(jí)秒表程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:466381 發(fā)表于 2020-11-24 23:40 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
超級(jí)秒表,具有計(jì)時(shí)功能,暫停功能,定時(shí)器功能,用起來超級(jí)好玩。

單片機(jī)源程序如下:
  1. #ifndef        _TM1638_H
  2. #define        _TM1638_H

  3. #include        <REG52.H>

  4. #define        DATA_COMMAND        0X40
  5. #define        DISP_COMMAND        0x80
  6. #define        ADDR_COMMAND        0XC0

  7. //TM1638模塊引腳定義
  8. sbit        DIO=P1^0;
  9. sbit        CLK=P1^1;
  10. sbit        STB=P1^2;

  11. //共陰數(shù)碼管顯示代碼
  12. unsigned char code tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
  13.                            0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};


  14. void TM1638_Write(unsigned char        DATA)                        //寫數(shù)據(jù)函數(shù)
  15. {
  16.         unsigned char i;
  17.         for(i=0;i<8;i++)
  18.         {
  19.                 CLK=0;
  20.                 if(DATA&0x01)
  21.                 {
  22.                         DIO=1;
  23.                 }
  24.                 else
  25.                 {
  26.                         DIO=0;
  27.                 }
  28.                 CLK=1;
  29.                 DATA>>=1;
  30.         }
  31. }
  32. unsigned char TM1638_Read(void)                                        //讀數(shù)據(jù)函數(shù)
  33. {
  34.         unsigned char i;
  35.         unsigned char temp=0x00;
  36.         DIO=1;
  37.         for(i=0;i<8;i++)
  38.         {
  39.                 temp>>=1;
  40.                 CLK=0;
  41.                 if(DIO)
  42.                 {
  43.                         temp|=0x80;
  44.                 }
  45.                 else
  46.                 {
  47.                         temp&=0x7f;
  48.                 }
  49.                 CLK=1;
  50.         }
  51.         return temp;
  52. }

  53. void Write_COM(unsigned char cmd)                //發(fā)送命令字
  54. {
  55.         STB=0;
  56.         TM1638_Write(cmd);
  57.         STB=1;
  58. }

  59. unsigned char Read_key()
  60. {
  61.         unsigned char Key[4],i,Keyvalue=0;
  62.         STB=0;       
  63. //        Write_COM(0x42);
  64. TM1638_Write(0x42);       
  65.         for(i=0;i<4;i++)
  66.         {
  67.                 Key[i]=TM1638_Read();
  68.         }
  69.         STB=1;
  70.         for(i=0;i<4;i++)
  71.         {
  72.                 Keyvalue|=Key[i]<<i;
  73.         }
  74.         for(i=0;i<8;i++)
  75.         {
  76.                 if((0x01<<i)==Keyvalue)
  77.                 {break;}
  78.         }
  79.         return i;
  80. }
  81. /*
  82. unsigned char Read_key(void)
  83. {
  84.         unsigned char c[4],i,key_value=0;
  85.         STB=0;
  86.         TM1638_Write(0x42);                           //讀鍵掃數(shù)據(jù) 命令
  87.         for(i=0;i<4;i++)               
  88.                 c[i]=TM1638_Read();
  89.         STB=1;                                                   //4個(gè)字節(jié)數(shù)據(jù)合成一個(gè)字節(jié)
  90.         for(i=0;i<4;i++)
  91.                 key_value|=c[i]<<i;
  92.         for(i=0;i<8;i++)
  93.                 if((0x01<<i)==key_value)
  94.                         break;
  95.         return i;
  96. }
  97. */
  98. void Write_DATA(unsigned char add,unsigned char DATA)                //指定地址寫入數(shù)據(jù)
  99. {
  100.         Write_COM(0x44);
  101.         STB=0;
  102.         TM1638_Write(0xc0|add);
  103.         TM1638_Write(DATA);
  104.         STB=1;
  105. }
  106. /*
  107. void Write_oneLED(unsigned char num,unsigned char flag)        //單獨(dú)控制一個(gè)LED函數(shù),num為需要控制的led序號(hào),flag為0時(shí)熄滅,不為0時(shí)點(diǎn)亮
  108. {
  109.         if(flag)
  110.                 Write_DATA(2*num+1,1);
  111.         else
  112.                 Write_DATA(2*num+1,0);
  113. }          */
  114. void Write_allLED(unsigned char LED_flag)                                        //控制全部LED函數(shù),LED_flag表示各個(gè)LED狀態(tài)
  115. {
  116.         unsigned char i;
  117.         for(i=0;i<8;i++)
  118.                 {
  119.                         if(LED_flag&(1<<i))
  120.                                 //Write_DATA(2*i+1,3);
  121.                                 Write_DATA(2*i+1,1);
  122.                         else
  123.                                 Write_DATA(2*i+1,0);
  124.                 }
  125. }

  126. //TM1638初始化函數(shù)
  127. void init_TM1638(void)
  128. {
  129.         unsigned char i;
  130.         Write_COM(0x8b);       //亮度 (0x88-0x8f)8級(jí)亮度可調(diào)
  131.         Write_COM(0x40);       //采用地址自動(dòng)加1
  132.         STB=0;                           //
  133.         TM1638_Write(0xc0);    //設(shè)置起始地址

  134.         for(i=0;i<16;i++)           //傳送16個(gè)字節(jié)的數(shù)據(jù)
  135.                 TM1638_Write(0x00);
  136.         STB=1;
  137. }
  138. #endif
復(fù)制代碼
  1. #include<reg52.h>
  2. #include "tm1638.h"
  3. #define u16 unsigned int
  4. #define u8 unsigned char
  5. /*
  6. 制作一個(gè)秒表 要求: a. 可以計(jì)時(shí)至少 10 分鐘,并且精確到0.01s,在數(shù)碼管上實(shí)時(shí)顯示 當(dāng)前時(shí)間;
  7. b. 按下 S1,開始計(jì)時(shí);按下 S2 暫停/啟動(dòng);按下 S3 結(jié)束計(jì)時(shí);
  8. c.(選做)增加一個(gè)模式選擇鍵以及數(shù)字輸入按鍵,按下后可在計(jì)時(shí)模 式和設(shè)置模式切換。
  9. 在設(shè)置模式中,可設(shè)置一個(gè)時(shí)間(利用按鍵輸入), 切換回計(jì)時(shí)模式時(shí),當(dāng)計(jì)到設(shè)置時(shí)間時(shí),蜂鳴器響。
  10. */

  11. u16 TIMERBAT=0;
  12. bit flag=0;
  13. u8 state=0;  //0沒開始計(jì)時(shí)或者暫停   1開始計(jì)時(shí)   2設(shè)置模式
  14. u8 hym;//按鍵鍵碼控制
  15. void Timer0Init(void);
  16. void Display();
  17. void Set_Bell();
  18. void Clock_System();
  19. void CLR_Time();
  20. void CLRBell();
  21. bit Judge_Baba();

  22. u8 code distab[17] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};
  23. u8 shijian[5];  //0爸爸 1秒 2分 3時(shí)
  24. u8 shijianshezhi[4];  //0秒 1分 2時(shí)

  25. void main()
  26. {
  27.         init_TM1638();
  28.         Timer0Init();
  29.         flag=0;
  30.         while(1)
  31.         {
  32.                 if(state==2)
  33.                 {
  34.                         Set_Bell();
  35.                 }
  36.                 else
  37.                 {
  38.                         Clock_System();
  39.                 }
  40.                
  41.         }
  42. }

  43. void Set_Bell()
  44. {
  45.         TR0=0;
  46.         while(state==2)
  47.         {
  48.                 hym=Read_key();
  49.                 if(hym!=8)
  50.                 {
  51.                         switch(hym)
  52.                         {
  53.                                 case 3:state=0;break;
  54.                                 case 4:shijianshezhi[2]++;shijianshezhi[2]%=24;break;
  55.                                 case 5:shijianshezhi[1]++;shijianshezhi[1]%=60;break;
  56.                                 case 6:shijianshezhi[0]++;shijianshezhi[0]%=60;break;
  57.                                 case 7:CLRBell();break;
  58.                         }
  59.                         while(Read_key()==hym);
  60.                 }
  61.                 Display();
  62.         }
  63. }

  64. void Clock_System()
  65. {
  66.         while(state!=2)
  67.         {
  68.                 TR0=state;
  69.                 hym=Read_key();
  70.                 if(hym!=8)
  71.                 {
  72.                         switch(hym)
  73.                         {
  74.                                 case 0:state=1;break;
  75.                                 case 1:if(state==1){state=0;} else{state=1;}break;
  76.                                 case 2:state=0;CLR_Time();break;
  77.                                 case 3:state=2;break;
  78.                         }
  79.                         while(Read_key()==hym);
  80.                 }
  81.                 if(flag)
  82.                 {
  83.                         flag=0;
  84.                         shijian[0]++;
  85.                 }
  86.                 if(shijian[0]==100)
  87.                 {
  88.                         shijian[0]=0;
  89.                         shijian[1]++;
  90.                 }
  91.                 if(shijian[1]==60)
  92.                 {
  93.                         shijian[1]=0;
  94.                         shijian[2]++;
  95.                 }
  96.                 if(shijian[2]==60)
  97.                 {
  98.                         shijian[2]=0;
  99.                         shijian[3]++;
  100.                         shijian[3]%=24;
  101.                 }
  102.                 Display();
  103.                 if(Judge_Baba())
  104.                 {
  105.                         Write_allLED(0xff);
  106.                 }
  107.                 else
  108.                 {
  109.                         Write_allLED(0x00);       
  110.                 }
  111.         }
  112. }

  113. void CLR_Time()
  114. {
  115.         u8 i;
  116.         for(i=0;i<4;i++)
  117.         {
  118.                 shijian[i]=0;
  119. ……………………

  120. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼


所有資料51hei提供下載:
超級(jí)秒表.zip (32.39 KB, 下載次數(shù): 139)


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

使用道具 舉報(bào)

沙發(fā)
ID:328014 發(fā)表于 2020-11-25 00:20 | 只看該作者
好東東 原理圖能分享下嗎?
回復(fù)

使用道具 舉報(bào)

板凳
ID:466381 發(fā)表于 2020-11-25 10:27 | 只看該作者

并沒有
回復(fù)

使用道具 舉報(bào)

地板
ID:137590 發(fā)表于 2021-7-25 18:27 | 只看該作者
并沒有
回復(fù)

使用道具 舉報(bào)

5#
ID:884711 發(fā)表于 2022-8-6 09:03 | 只看該作者
這是在本壇看到的看到的第一個(gè)有關(guān)tm1638的好貼子,真正值得一看。
回復(fù)

使用道具 舉報(bào)

6#
ID:967056 發(fā)表于 2022-12-5 22:04 | 只看該作者
進(jìn)入定時(shí)器0中斷程序時(shí)應(yīng)關(guān)閉定時(shí)器0(TR0=0),出中斷程序時(shí)再打開定時(shí)器0(TR0=1)
回復(fù)

使用道具 舉報(bào)

7#
ID:967056 發(fā)表于 2022-12-5 22:05 | 只看該作者
進(jìn)入T0中斷程序時(shí)應(yīng)關(guān)閉T0定時(shí)(TR0=0),出中斷程序時(shí)再打開T0定時(shí)(TR0=1)
回復(fù)

使用道具 舉報(bào)

8#
ID:1064915 發(fā)表于 2023-3-15 17:32 | 只看該作者

這種開發(fā)板?


回復(fù)

使用道具 舉報(bào)

9#
ID:1110792 發(fā)表于 2025-4-10 20:02 | 只看該作者
謝謝分享,試試。
回復(fù)

使用道具 舉報(bào)

10#
ID:1064915 發(fā)表于 2025-4-23 17:14 | 只看該作者
模塊包括以下資源:

1、8個(gè)按鍵,

2、8個(gè)LED,

3、8位數(shù)碼管

該模塊所用芯片為TM1638,集合了以上三種單片機(jī)常見外圍電路,是大特點(diǎn)是只需占用單片機(jī)三個(gè)IO口即可驅(qū)動(dòng),掃描顯示和按鍵掃描不需要單片機(jī)干預(yù),只需要讀寫相關(guān)寄存器送顯示數(shù)據(jù)或檢測(cè)按鍵,節(jié)省MCU資源。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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