蓝桥杯之单片机学习(九)——定时器的进阶综合案例解析

简介: 蓝桥杯之单片机学习(九)——定时器的进阶综合案例解析

一、训练任务


在CT107D单片机综合训练平台上,利用定时器T0、数码管模块和2个独立按键(J5的2-3短接),设计一个秒表,有清零、暂停、启动功能


1.显示格式为

分-秒-0.05秒(即50ms)

08-26-18表示:8分26秒900毫秒

2.独立按键S4为:暂停/启动

独立按键S5为:清零

按键均为按下有效


二、训练重点


1.定时器的精确定时应用

2.定时器的多时段计时应用

3.定时器、显示模块、独立按键多模块综合应用程序设计的思路与编码


三、代码展示


#include <reg52.h>
sbit S4 = P3^3;
sbit S5 = P3^2;
typedef unsigned int uint;
typedef unsigned char uchar;
uchar code SMG_duanma[18] = 
  {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
  0x88,0x80,0xc6,0xc0,0x86,0x8e,
  0xbf,0x7f};//分别是0-9(对应下标),A-F,“-”,“.”
uchar t_m = 0;
uchar t_s = 0;
uchar t_005s = 0;
//配置HC138
void SelectHC138(uchar channel)
{
  switch(channel)
  {
  case 4:
    P2 = (P2 & 0X1F) | 0X80;
  break;
  case 5:
    P2 = (P2 & 0X1F) | 0Xa0;
  break;
  case 6:
    P2 = (P2 & 0X1F) | 0Xc0;
  break;
  case 7:
    P2 = (P2 & 0X1F) | 0Xe0;
  break;
  }
}
//在pos位码上,显示value段码
void DisplaySMG_Bit(uchar pos, uchar value)
{
  SelectHC138(6);
  P0 = 0X01 << pos;
  SelectHC138(7);
  P0 = value;
}
void DelaySMG(uint t)
{
  while(t--);
}
//数码管显示
void DisplayTime()
{
  DisplaySMG_Bit(7,SMG_duanma[t_005s%10]);
  DelaySMG(500);
  DisplaySMG_Bit(6,SMG_duanma[t_005s/10]);
  DelaySMG(500);
  DisplaySMG_Bit(5,SMG_duanma[16]);
  DelaySMG(500);
  DisplaySMG_Bit(4,SMG_duanma[t_s%10]);
  DelaySMG(500);
  DisplaySMG_Bit(3,SMG_duanma[t_s/10]);
  DelaySMG(500);
  DisplaySMG_Bit(2,SMG_duanma[16]);
  DelaySMG(500);
  DisplaySMG_Bit(1,SMG_duanma[t_m%10]);
  DelaySMG(500);
  DisplaySMG_Bit(0,SMG_duanma[t_m/10]);
  DelaySMG(500);
}
//********定时器相关函数*********
void InitTimer0()
{
  TMOD = 0x01;
  TH0 = (65535 - 50000) / 256;
  TL0 = (65535 - 50000) % 256;
  ET0 = 1;
  EA = 1;
  TR0 = 1;
}
void ServiceTimer0() interrupt 1
{
  TH0 = (65535 - 50000) / 256;
  TL0 = (65535 - 50000) % 256;
  t_005s++;
  if(t_005s == 20)
  {
  t_s++;
  t_005s = 0;
  if(t_s == 60)
  {
    t_m++;
    t_s = 0;
  }
  if(t_m == 99)
  {
    t_m = 0;
  }
  }
}
//*******************************
//按键去抖延时(uchar就够用)
void DelayK(uchar t)
{
  while(t--);
}
//按键扫描函数
void ScanKeys()
{
  if(S4 == 0)  //秒表启动/暂停
  {
  DelayK(100);
  if(S4 == 0)
  {
    TR0 = ~TR0;
    while(S4 == 0)
    {
    DisplayTime();
    }
  }
  }
  if(S5 == 0)  //秒表清零
  {
  DelayK(100);
  if(S5 == 0)
  {
    t_m = 0;
    t_s = 0;
    t_005s = 0;
    while(S5 == 0)
    {
    DisplayTime();
    }
  }
  }
}
//初始化系统
void Initsys()
{
  SelectHC138(5);
  P0 = 0X00;//关闭蜂鸣器和继电器
  SelectHC138(4);
  P0 = 0XFF;//关闭LED
}
void main()
{
  InitTimer0();
  Initsys();
  while(1)
  {
  DisplayTime();
  ScanKeys();
  }
}


四、一些建议


如果自己的变量很多,可以写在一张纸上

可以画流程图

函数取名

全局变量与局部变量

这个题目多练几遍

相关文章
|
5天前
并发编程之读写锁ReadWriteLock的详细解析(带小案例)
并发编程之读写锁ReadWriteLock的详细解析(带小案例)
7 0
|
5天前
并发编程之Callable方法的详细解析(带小案例)
并发编程之Callable方法的详细解析(带小案例)
11 0
|
5天前
|
JSON Java Maven
Javaweb之SpringBootWeb案例之自动配置以及常见方案的详细解析
Javaweb之SpringBootWeb案例之自动配置以及常见方案的详细解析
7 0
Javaweb之SpringBootWeb案例之自动配置以及常见方案的详细解析
|
5天前
|
JSON Java Maven
Javaweb之SpringBootWeb案例之 SpringBoot原理的详细解析
Javaweb之SpringBootWeb案例之 SpringBoot原理的详细解析
11 0
Javaweb之SpringBootWeb案例之 SpringBoot原理的详细解析
|
5天前
|
Java 容器 Spring
Javaweb之SpringBootWeb案例之 Bean管理的Bean作用域详细的解析
Javaweb之SpringBootWeb案例之 Bean管理的Bean作用域详细的解析
12 0
|
5天前
|
Java 数据库
Javaweb之SpringBootWeb案例之AOP案例的详细解析
Javaweb之SpringBootWeb案例之AOP案例的详细解析
11 0
|
5天前
|
Java Spring
Javaweb之SpringBootWeb案例之事务进阶的详细解析
Javaweb之SpringBootWeb案例之事务进阶的详细解析
11 0
|
2月前
|
人工智能 算法 Java
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1005 数字游戏
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1005 数字游戏
56 0
|
2月前
|
Java C语言 C++
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1000 kAc给糖果你吃
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1000 kAc给糖果你吃
38 0
|
2月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-999 数的潜能
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-999 数的潜能
38 0

推荐镜像

更多