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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4639|回復: 8
收起左側

STC89單片機+TM1638超級秒表程序

  [復制鏈接]
ID:466381 發表于 2020-11-24 23:40 | 顯示全部樓層 |閱讀模式
超級秒表,具有計時功能,暫停功能,定時器功能,用起來超級好玩。

單片機源程序如下:
  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. //共陰數碼管顯示代碼
  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)                        //寫數據函數
  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)                                        //讀數據函數
  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)                //發送命令字
  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);                           //讀鍵掃數據 命令
  87.         for(i=0;i<4;i++)               
  88.                 c[i]=TM1638_Read();
  89.         STB=1;                                                   //4個字節數據合成一個字節
  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)                //指定地址寫入數據
  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)        //單獨控制一個LED函數,num為需要控制的led序號,flag為0時熄滅,不為0時點亮
  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函數,LED_flag表示各個LED狀態
  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初始化函數
  127. void init_TM1638(void)
  128. {
  129.         unsigned char i;
  130.         Write_COM(0x8b);       //亮度 (0x88-0x8f)8級亮度可調
  131.         Write_COM(0x40);       //采用地址自動加1
  132.         STB=0;                           //
  133.         TM1638_Write(0xc0);    //設置起始地址

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

  11. u16 TIMERBAT=0;
  12. bit flag=0;
  13. u8 state=0;  //0沒開始計時或者暫停   1開始計時   2設置模式
  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時
  24. u8 shijianshezhi[4];  //0秒 1分 2時

  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. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼


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

使用道具 舉報

ID:328014 發表于 2020-11-25 00:20 | 顯示全部樓層
好東東 原理圖能分享下嗎?
回復

使用道具 舉報

ID:466381 發表于 2020-11-25 10:27 | 顯示全部樓層
51hei團團 發表于 2020-11-25 00:20
好東東 原理圖能分享下嗎?

并沒有
回復

使用道具 舉報

ID:137590 發表于 2021-7-25 18:27 | 顯示全部樓層
并沒有
回復

使用道具 舉報

ID:884711 發表于 2022-8-6 09:03 | 顯示全部樓層
這是在本壇看到的看到的第一個有關tm1638的好貼子,真正值得一看。
回復

使用道具 舉報

ID:967056 發表于 2022-12-5 22:04 | 顯示全部樓層
進入定時器0中斷程序時應關閉定時器0(TR0=0),出中斷程序時再打開定時器0(TR0=1)
回復

使用道具 舉報

ID:967056 發表于 2022-12-5 22:05 | 顯示全部樓層
進入T0中斷程序時應關閉T0定時(TR0=0),出中斷程序時再打開T0定時(TR0=1)
回復

使用道具 舉報

ID:1064915 發表于 2023-3-15 17:32 | 顯示全部樓層

這種開發板?
20210620095221130.jpg 20210620002431634.png

回復

使用道具 舉報

ID:1110792 發表于 2025-4-10 20:02 | 顯示全部樓層
謝謝分享,試試。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 香蕉视频一区二区 | 99免费精品 | 久久成 | 久久av一区二区 | 国产精品一区二区欧美 | 毛片一级片 | 久久99精品久久久久久国产越南 | 欧美视频区| 久久久这里只有17精品 | 日韩电影中文字幕 | 成人福利视频 | 欧美一级淫片免费视频黄 | 日韩在线不卡视频 | 91九色视频 | 欧美性一区二区三区 | 国产91 在线播放 | 色综合视频在线 | 国产精品成人国产乱一区 | 欧美 日韩 国产 成人 | 久久网国产 | 中文字幕一区在线 | 日韩高清一区 | 亚洲婷婷六月天 | 欧美αv| 国产精品自产拍 | 一级全黄视频 | 一区二区三区精品视频 | 国产99精品 | 日韩精品视频在线 | 国产麻豆乱码精品一区二区三区 | 国产xxxx搡xxxxx搡麻豆 | 嫩草视频在线 | 国产清纯白嫩初高生视频在线观看 | h在线免费观看 | 国产精品呻吟久久av凹凸 | 欧美三区 | 国产日韩欧美在线 | 亚洲视频在线一区 | 国产精品日韩一区 | 毛片视频观看 | 中文字幕电影在线观看 |