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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 蓝桥杯之单片机学习(九)——定时器的进阶综合案例解析

一、训练任务


在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();
  }
}


四、一些建议


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

可以画流程图

函数取名

全局变量与局部变量

这个题目多练几遍

相关文章
【期末不挂科-单片机考前速过系列P2】(第二章:搞定寻址方式)经典例题盘点(带图解析)
【期末不挂科-单片机考前速过系列P2】(第二章:搞定寻址方式)经典例题盘点(带图解析)
|
1月前
|
网络协议 数据格式
【通信协议讲解】单片机基础重点通信协议解析与总结之ModBus(五)
【通信协议讲解】单片机基础重点通信协议解析与总结之ModBus(五)
|
1月前
|
IDE 开发工具
【通信协议讲解】单片机基础重点通信协议解析与总结之CAN(四)
【通信协议讲解】单片机基础重点通信协议解析与总结之CAN(四)
|
1月前
【通信协议讲解】单片机基础重点通信协议解析与总结之串口通信(三)
【通信协议讲解】单片机基础重点通信协议解析与总结之串口通信(三)
|
1月前
【通信协议讲解】单片机基础重点通信协议解析与总结之SPI(二)
【通信协议讲解】单片机基础重点通信协议解析与总结之SPI(二)
|
1月前
【通信协议讲解】单片机基础重点通信协议解析与总结之IIC(一)
【通信协议讲解】单片机基础重点通信协议解析与总结之IIC(一)
|
6月前
|
存储
【期末不挂科-单片机考前速过系列P3】(第三章:13题MOV&MOVX&MOVC&数码管速过)经典例题盘点(带图解析)
【期末不挂科-单片机考前速过系列P3】(第三章:13题MOV&MOVX&MOVC&数码管速过)经典例题盘点(带图解析)
【期末不挂科-单片机考前速过系列P6】(第六章:10题速过定时计数器的结构和工作方式例题)经典例题盘点(带图解析)
【期末不挂科-单片机考前速过系列P6】(第六章:10题速过定时计数器的结构和工作方式例题)经典例题盘点(带图解析)
【期末不挂科-单片机考前速过系列P7】(第七章:11题速过串行口基本概念/结构/工作方式/双机通信例题)经典例题盘点(带图解析)
【期末不挂科-单片机考前速过系列P7】(第七章:11题速过串行口基本概念/结构/工作方式/双机通信例题)经典例题盘点(带图解析)
|
4月前
蓝桥杯之单片机学习(终)——关于之前文章的错误及更正(附:第十四届蓝桥杯单片机赛题)
蓝桥杯之单片机学习(终)——关于之前文章的错误及更正(附:第十四届蓝桥杯单片机赛题)

推荐镜像

更多