找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3363|回复: 7
收起左侧

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, 下载次数: 132)
回复

使用道具 举报

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

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表