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

QQ登錄

只需一步,快速開(kāi)始

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

關(guān)于51單片機(jī)使用TM1637模塊實(shí)現(xiàn)計(jì)數(shù)的功能 附程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:718523 發(fā)表于 2024-1-17 02:50 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
下面的代碼運(yùn)行后數(shù)據(jù)碼也不動(dòng) 顯示的半個(gè)1和234 折騰不動(dòng)了希望大佬路過(guò)看下謝謝。就是檢測(cè)p3^1的按鍵,按一下TM1637模塊加1


單片機(jī)源程序如下:
  1. #include <reg51.h>

  2. sbit CLK = P1^2;
  3. sbit DIO = P1^1;

  4. sbit insys = P3^1;

  5. void delay(unsigned int ms)  // 延時(shí)函數(shù)
  6. {
  7.     unsigned int i, j;
  8.     for(i = 0; i < ms; i++)
  9.         for(j = 0; j < 120; j++);
  10. }

  11. void TM1637_Start()  // 起始信號(hào)
  12. {
  13.     CLK = 1;
  14.     DIO = 1;
  15.     delay(1);
  16.     DIO = 0;
  17. }

  18. void TM1637_Stop()  // 停止信號(hào)
  19. {
  20.     CLK = 0;
  21.     delay(1);
  22.     DIO = 0;
  23.     delay(1);
  24.     CLK = 1;
  25.     delay(1);
  26.     DIO = 1;
  27. }

  28. void TM1637_WriteByte(unsigned char dataaa)  // 寫入一個(gè)字節(jié)
  29. {
  30.     unsigned char i;
  31.     for(i = 0; i < 8; i++)
  32.     {
  33.         CLK = 0;
  34.         DIO = (dataaa & 0x01);
  35.         delay(1);
  36.         dataaa >>= 1;
  37.         CLK = 1;
  38.         delay(1);
  39.     }
  40.     CLK = 0;
  41.     DIO = 1;
  42.     CLK = 1;
  43.     delay(1);
  44.     CLK = 0;
  45. }

  46. void TM1637_Init()  // 初始化設(shè)置
  47. {
  48.     TM1637_Start();
  49.     TM1637_WriteByte(0x8F);  // 固定寫入0x8F,設(shè)置顯示亮度為最高
  50.     TM1637_Stop();
  51. }

  52. void TM1637_Display(unsigned char displayData)  // 數(shù)碼管顯示函數(shù)
  53. {
  54.     TM1637_Start();
  55.     TM1637_WriteByte(0x40);  // 寫入地址命令,地址為0
  56.     TM1637_Stop();
  57.     TM1637_Start();
  58.     TM1637_WriteByte(displayData);  // 寫入要顯示的數(shù)據(jù)
  59.     TM1637_Stop();
  60. }

  61. void main()
  62. {
  63.         unsigned char num = 0;
  64.     TM1637_Init();  // 初始化設(shè)置
  65.         insys = 1;   
  66.     while(1)
  67.     {
  68.          if(insys = 0){
  69.         TM1637_Display(num);
  70.         num++;
  71.         if(num > 9)
  72.             num = 0;
  73.         delay(1000);  // 延時(shí)1秒
  74.                 }
  75.     }
  76. }
復(fù)制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:718523 發(fā)表于 2024-1-17 15:50 | 只看該作者
程序可以了,但是有中斷會(huì)觸發(fā)很多次甚至是十幾次,請(qǐng)問(wèn)要怎么用定時(shí)器消抖動(dòng)呢,不用軟件延時(shí),我寫的定時(shí)器好像不起作用。程序如下:
  1. #include<reg52.h>
  2. //#include <STC8G.h>
  3. #include <intrins.h>

  4. #define u8 unsigned char
  5. #define u16 unsigned int

  6. unsigned char  flagkey =0;


  7. sbit DIO = P1^1;
  8. sbit CLK = P1^2;
  9. sbit p00 = P0^0;

  10. //u8 num[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7f,0x6F};
  11. u8 num[10]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFf,0xEF};
  12. u16 ms,second,min,hour;
  13. u16 dingshinum;

  14. void Delay2us()                //@12.01MHz
  15. {
  16.         unsigned char i;      
  17.         i = 6;
  18.         while (--i);
  19. }

  20. void Delay3us()                //@12MHz
  21. {
  22.         unsigned char i;

  23.         i = 10;
  24.         while (--i);
  25. }

  26. void Delay5us()                //@12MHz
  27. {
  28.         unsigned char i;        
  29.         i = 18;
  30.         while (--i);
  31. }

  32. void I2CStart()
  33. {
  34.         CLK = 1;
  35.         DIO = 1;
  36.         Delay2us();
  37.         DIO = 0;
  38. }

  39. void I2CAsk()
  40. {
  41.         CLK = 0;
  42.         Delay5us();
  43.         while(DIO);
  44.         CLK = 1;
  45.         Delay2us();
  46.         CLK = 0;
  47. }

  48. void I2CStop()
  49. {
  50.         CLK = 0;
  51.         Delay2us();
  52.         DIO = 0;
  53.         Delay2us();
  54.         CLK = 1;
  55.         Delay2us();
  56.         DIO = 1;
  57. }

  58. void I2CWriteByte(u8 dat)
  59. {
  60.         u8 i;
  61.         for(i=0;i<8;i++)
  62.         {
  63.                 CLK = 0;
  64.                 if(dat&0x01)
  65.                 {
  66.                         DIO = 1;
  67.                 }
  68.                 else
  69.                 {
  70.                         DIO = 0;
  71.                 }
  72.                 Delay3us();
  73.                 dat>>=1;
  74.                 CLK = 1;
  75.                 Delay3us();
  76.         }
  77. }

  78. void Display(u8 m,u8 s)
  79. {
  80.         I2CStart();        //1637 開(kāi)始
  81.         I2CWriteByte(0x40);
  82.         I2CAsk();
  83.         I2CStop();
  84.         I2CStart();
  85.         I2CWriteByte(0xC0);        //設(shè)置顯示首地址即第一個(gè)LED
  86.         I2CAsk();

  87.         I2CWriteByte(num[m/10]);
  88.         I2CAsk();
  89.         I2CWriteByte(num[m%10]);
  90.         I2CAsk();
  91.         I2CWriteByte(num[s/10]);
  92.         I2CAsk();

  93.         I2CWriteByte(num[s%10]);
  94.         I2CAsk();
  95.         I2CWriteByte(0xFF);
  96.         I2CAsk();
  97.         I2CWriteByte(0xFF);
  98.         I2CAsk();
  99.         I2CStop();
  100.         I2CStart();
  101.         I2CWriteByte(0x8F);
  102.         I2CAsk();
  103.         I2CStop();
  104. }





  105. void main()
  106. {
  107.   p00 = 1;
  108.   P1=0x55;       //P1口初始值
  109.   EA=1;          //全局中斷開(kāi)
  110.   EX0=1;         //外部中斷0開(kāi)
  111.   IT0=1;         //邊沿觸發(fā)
  112.         
  113.         
  114.         while(1)
  115.         {
  116.                 Display(min,second);
  117.         }
  118. }

  119. /*------------定時(shí)器----------------*/
  120. void Timer0Init(void)                //5毫秒@12.01MHz
  121. {
  122.         TMOD = 0x01; // 設(shè)置定時(shí)器0為模式1
  123.     TH0 = 0x0EC; // 設(shè)置定時(shí)器0的初始值,用于產(chǎn)生10ms的定時(shí)中斷
  124.     TL0 = 0x78;
  125.     EA = 1; // 允許中斷
  126.     ET0 = 1; // 允許定時(shí)器0中斷
  127.     TR0 = 1; // 啟動(dòng)定時(shí)器0
  128. }


  129. /*------------外部中斷程序----------------*/
  130. void ISR_Key(void) interrupt 0 using 1 {       
  131.         if(flagkey==1){
  132.                 Timer0Init();
  133.                 p00 = ~p00;
  134. second++;
  135.         if(second==60){
  136.         second=0;
  137.         min++;
  138.         if(min==60)
  139.                 {
  140.                     min=0;
  141.                     hour++;
  142.                             if(hour==24)
  143.                             {
  144.                               hour=0;
  145.                             }
  146.                 }                       
  147.                        
  148.     }

  149.         }                    
  150.          
  151. }


  152. /*------------定時(shí)器中斷子程序----------------*/
  153. void Timer0_isr(void) interrupt 1 using 1
  154. {
  155. TH0=0x0EC;                  //重新賦值
  156. TL0=0x78;
  157. dingshinum++;
  158. if(dingshinum<100){
  159.          flagkey = 0;                
  160. }else{
  161.           flagkey = 0;
  162.           dingshinum = 1;           
  163. }
  164. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

板凳
ID:213173 發(fā)表于 2024-1-17 17:05 | 只看該作者
TM1637是2線式通訊接口,對(duì)時(shí)序要求較高。易受中斷干擾。你驅(qū)動(dòng)程序中1ms延時(shí)太長(zhǎng),一般就幾u(yù)s延時(shí)。
回復(fù)

使用道具 舉報(bào)

地板
ID:213173 發(fā)表于 2024-1-17 17:32 | 只看該作者
forest415 發(fā)表于 2024-1-17 15:50
程序可以了,但是有中斷會(huì)觸發(fā)很多次甚至是十幾次,請(qǐng)問(wèn)要怎么用定時(shí)器消抖動(dòng)呢,不用軟件延時(shí),我寫的定時(shí) ...

定時(shí)器和外部中斷不是這么玩的 TM1637驅(qū)動(dòng)共陽(yáng)數(shù)碼管時(shí)鐘示例 仿真.rar (879.07 KB, 下載次數(shù): 19)

回復(fù)

使用道具 舉報(bào)

5#
ID:718523 發(fā)表于 2024-1-17 20:06 | 只看該作者
可以了感謝資料,這個(gè)程序可以實(shí)現(xiàn)按鍵自動(dòng)加1,上電的時(shí)候是0000累計(jì)加到9999試了下沒(méi)有抖動(dòng)了。源程序如下給需要的人
  1. #include<reg52.h>
  2. #include <intrins.h>

  3. #define u8 unsigned char
  4. #define u16 unsigned int

  5. unsigned char  flagkey =0;         //按鍵標(biāo)志
  6. unsigned char Timer0Init_count = 0;//定時(shí)器溢出計(jì)數(shù)

  7. sbit DIO = P1^1; //TM1637
  8. sbit CLK = P1^2; //TM1637
  9. sbit P10 = P1^0; //led
  10. sbit p01 = P0^1; //按鍵

  11. u8 num[10]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFf,0xEF}; //0-9
  12. u16 second,min,hour;        //TM1637六段


  13. /*------------TM1637----------------*/
  14. void Delay2us()                //@12.01MHz
  15. {
  16.         unsigned char i;      
  17.         i = 6;
  18.         while (--i);
  19. }

  20. void Delay3us()                //@12MHz
  21. {
  22.         unsigned char i;

  23.         i = 10;
  24.         while (--i);
  25. }

  26. void Delay5us()                //@12MHz
  27. {
  28.         unsigned char i;        
  29.         i = 18;
  30.         while (--i);
  31. }

  32. void I2CStart()
  33. {
  34.         CLK = 1;
  35.         DIO = 1;
  36.         Delay2us();
  37.         DIO = 0;
  38. }

  39. void I2CAsk()
  40. {
  41.         CLK = 0;
  42.         Delay5us();
  43.         while(DIO);
  44.         CLK = 1;
  45.         Delay2us();
  46.         CLK = 0;
  47. }

  48. void I2CStop()
  49. {
  50.         CLK = 0;
  51.         Delay2us();
  52.         DIO = 0;
  53.         Delay2us();
  54.         CLK = 1;
  55.         Delay2us();
  56.         DIO = 1;
  57. }

  58. void I2CWriteByte(u8 dat)
  59. {
  60.         u8 i;
  61.         for(i=0;i<8;i++)
  62.         {
  63.                 CLK = 0;
  64.                 if(dat&0x01)
  65.                 {
  66.                         DIO = 1;
  67.                 }
  68.                 else
  69.                 {
  70.                         DIO = 0;
  71.                 }
  72.                 Delay3us();
  73.                 dat>>=1;
  74.                 CLK = 1;
  75.                 Delay3us();
  76.         }
  77. }

  78. void Display(u8 m,u8 s)
  79. {
  80.         I2CStart();        //1637 開(kāi)始
  81.         I2CWriteByte(0x40);
  82.         I2CAsk();
  83.         I2CStop();
  84.         I2CStart();
  85.         I2CWriteByte(0xC0);        //設(shè)置顯示首地址即第一個(gè)LED
  86.         I2CAsk();

  87.         I2CWriteByte(num[m/10]);
  88.         I2CAsk();
  89.         I2CWriteByte(num[m%10]);
  90.         I2CAsk();
  91.         I2CWriteByte(num[s/10]);
  92.         I2CAsk();

  93.         I2CWriteByte(num[s%10]);
  94.         I2CAsk();
  95.         I2CWriteByte(0xFF);
  96.         I2CAsk();
  97.         I2CWriteByte(0xFF);
  98.         I2CAsk();
  99.         I2CStop();
  100.         I2CStart();
  101.         I2CWriteByte(0x8F);
  102.         I2CAsk();
  103.         I2CStop();
  104. }




  105. /*------------定時(shí)器----------------*/
  106. void Timer0Init(void)                //12M晶振,延時(shí)10Ms
  107. {
  108.         TMOD = 0x01; // 設(shè)置定時(shí)器0為模式1
  109.     TH0 = 0x0D8; // 設(shè)置定時(shí)器0的初始值,用于產(chǎn)生10ms的定時(shí)中斷
  110.     TL0 = 0x0F0;
  111.     EA = 1; // 允許中斷
  112.     ET0 = 1; // 允許定時(shí)器0中斷
  113.     //TR0 = 1; // 啟動(dòng)定時(shí)器0
  114. }


  115. /*------------檢察按鍵----------------*/
  116. void anjian(void)
  117. {
  118.           if(p01 == 0){  // 檢測(cè)按鍵是否按下
  119.                   TR0 = 1;//按鍵按下開(kāi)始計(jì)時(shí),溢出后中斷
  120.           }else{
  121.                             flagkey=0;
  122.                   }
  123. }

  124. /*------------主程序----------------*/
  125. void main()
  126. {
  127.   Timer0Init(); //定時(shí)器初始化
  128.   P10 = 1;//led關(guān)        
  129.         while(1)
  130.         {
  131.             Display(min,second);
  132.                         anjian();
  133.         }
  134. }




  135. /*------------定時(shí)器中斷子程序----------------*/
  136. void Timer0Interrupt(void) interrupt 1{
  137. if(flagkey==0){
  138. flagkey=1;       
  139. Timer0Init_count ++;
  140. if(Timer0Init_count>5){
  141. TR0 = 0;//關(guān)定時(shí)器
  142. TH0 = 0x0D8;//賦初值
  143. TL0 = 0x0F0;       

  144. Timer0Init_count=0;

  145. P10 = ~P10;

  146. second++;
  147. if(second==100){
  148.         second=0;
  149.         min++;
  150.         if(min==100)
  151.             {
  152.                 //min=0;
  153.                         min=99;
  154.                         second=99;
  155.                 //hour++;
  156.                 //if(hour==100){hour=0;}
  157.             }                               
  158.                        
  159. }}}}
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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