蓝桥杯之单片机学习(十四)——基础技能综合实训案例解析

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 蓝桥杯之单片机学习(十四)——基础技能综合实训案例解析

一、训练任务


在CT107D单片机综合训练平台上,设计程序,用于本地和远程控制现场灯光的开关,并能通过串口远程读取工厂的系统运行时间。


二、训练要求


1.设计系统初始化函数,关闭蜂鸣器和继电器等无关设备。

2.设计设备检测函数,首先检测LED指示灯,从L1~L8依次逐个点亮,再依次逐个熄灭;然后检查数码管,从左到右依次点亮数码管的所有段码,再依次从左到右熄灭。

3.系统从上电开始显示系统运行时间,从00时00分00秒开始,显示格式:

0a2653c851af460fa595bd959398a8f1.png

4.八个LED指示灯分为2组: L1-L4为远程控制组,L7-L8为本地控制组。远程控制组的指示灯由上位机通过串口发送命令控制开关,本地控制组的指示灯由独立按键控制开关。按键检测需做去抖动处理,松开有效,按键S5控制L7,按键S4控制L8。


三、通信规约


串口工作在8位UART模式,波特率为9600BPS

上位机通过串口控制下位机的L1~L4指示灯和读取系统运行时间。

控制命令为一一个字节, 高4位为命令类型,低4位为执行参数。

控制灯光开关命令中,低4位每1位控制一个LED灯 的开关,无返回值。

读取运行时间命令中,低4位保留,各位为0,返回3个字节的时间数据,用16进制的BCD码表示,先发时,再发分,后发秒。如果系统运行的时间为12时24分16秒,收到读取时间命令字后,返回: 0x12 0x24 0x16。

4cebaac233b3433da32a72337a77fc60.png


代码展示


#include <reg52.h>
typedef unsigned int uint;
typedef unsigned char uchar;
sfr AUXR = 0X8e;
sbit S5 = P3^2;
sbit S4 = P3^3;
sbit L7 = P0^6;
sbit L8 = P0^7;
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 time_005s = 0;
uchar time_s = 0;
uchar time_m = 0;
uchar time_h = 0;
void SMGDisplay();
//配置HC138
void SelectHC138(uchar channel)
{
  switch(channel)
  {
  case 4:    //LED
    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;
  case 0:    //锁住所有寄存器
    P2 = (P2 & 0X1F) | 0X00;
  break;
  }
}
//在pos位码上,显示value段码
void DisplaySMG_Bit(uchar pos, uchar value)
{
  SelectHC138(6);
  P0 = 0X01 << pos;
  SelectHC138(7);
  P0 = value;
}
void Initsys()
{
  SelectHC138(5);
  P0 = 0X00;//关闭蜂鸣器和继电器
  SelectHC138(4);
  P0 = 0XFF;//关闭LED
}
void Delay_CL_CSMG(uint t)
{
  while(t--);
  while(t--);
}
void CheckSys()
{
  //检测LED
  uchar i;
  SelectHC138(4);
  for(i = 1; i <= 8; i++)
  {
  P0 = 0XFF << i;
  Delay_CL_CSMG(60000);
  Delay_CL_CSMG(60000);
  }
  for(i = 1; i <= 8; i++)
  {
  P0 = ~(0XFF << i);
  Delay_CL_CSMG(60000);
  Delay_CL_CSMG(60000);
  }
  //检测数码管
  for(i = 0; i < 8; i++)
  {
  DisplaySMG_Bit(i, 0X00);
  Delay_CL_CSMG(60000);
  Delay_CL_CSMG(60000);
  }
  P0 = 0XFF;
}
//*********************************
//本地控制
void Delay_K(uint t)
{
  while(t--);
}
void LocalCheck()
{
  SelectHC138(4);
  if(S4 == 0)
  {
  Delay_K(100);
  if(S4 == 0)
  {
    L8 = 0;
  }
  while(S4 == 0)
  {
    SMGDisplay();
  }
  L8 = 1;
  }
  if(S5 == 0)
  {
  Delay_K(100);
  if(S5 == 0)
  {
    L7 = 0;
  }
  while(S5 == 0)
  {
    SMGDisplay();
  }
  L7 = 1;
  }
}
//*********************************
//*********************************
//定时器
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;
  time_005s++;
  if(time_005s == 20)
  {
  time_005s = 0;
  time_s++;
  if(time_s == 60)
  {
    time_s = 0;
    time_m++;
  }
  if(time_m == 60)
  {
    time_m = 0;
    time_h++;
  }
  if(time_h == 99)
  {
    time_h = 0;
  }
  }
}
//*********************************
//数码管显示
void Delay_SMG(uint t)
{
  while(t--);
}
void SMGDisplay()
{
  DisplaySMG_Bit(0, SMG_duanma[time_h / 10]);
  Delay_SMG(500);
  DisplaySMG_Bit(1, SMG_duanma[time_h % 10]);
  Delay_SMG(500);
  DisplaySMG_Bit(2, SMG_duanma[16]);
  Delay_SMG(500);
  DisplaySMG_Bit(3, SMG_duanma[time_m / 10]);
  Delay_SMG(500);
  DisplaySMG_Bit(4, SMG_duanma[time_m % 10]);
  Delay_SMG(500);
  DisplaySMG_Bit(5, SMG_duanma[16]);
  Delay_SMG(500);
  DisplaySMG_Bit(6, SMG_duanma[time_s / 10]);
  Delay_SMG(500);
  DisplaySMG_Bit(7, SMG_duanma[time_s % 10]);
  Delay_SMG(500);
  P0 = 0XFF;
}
//************************************
//串口通信
uchar command = 0;
void InitUart()
{
  TMOD = 0X20;
  TH1 = 0XFD;
  TL1 = 0XFD;
  TR1 = 1;
  SCON = 0X50; //模式1
  AUXR = 0X00;
  ES = 1;
  EA = 1;
}
void ServiceUart() interrupt 4
{
  if(RI == 1)
  {
  command = SBUF;
  RI = 0;
  }
}
void SendByteUart(uchar dat)
{
  SBUF = dat;
  while(TI == 0);
  TI = 0;
}
void UartWorking()
{
  if(command != 0)
  {
  SelectHC138(4);
  switch(command & 0XF0)
  {
    case 0xA0:
     P0 = (P0 | 0X0F) & (~command | 0XF0); //保留高4位,反转低四位
     command = 0X00;
    break;
    case 0xB0:
     SendByteUart((time_h / 10 << 4) | (time_h % 10));
      SendByteUart((time_m / 10 << 4) | (time_m % 10));
      SendByteUart((time_s / 10 << 4) | (time_s % 10));
     command = 0X00;
    break;
  }
  }
}
//************************************
void main()
{
  Initsys();
  CheckSys();
  InitTimer0();
  InitUart();
  InitUart();
  while(1)
  {
  LocalCheck();
  SMGDisplay();
  UartWorking();
  }
}
相关文章
|
1月前
|
缓存 网络协议 Linux
DNS解析工具使用案例
关于如何在Windows和Linux操作系统下使用DNS解析工具的案例,包括查看和清空DNS缓存、使用whois查询工具以及安装和使用dig工具进行DNS记录查询。
19 2
DNS解析工具使用案例
|
2月前
|
人工智能 PyTorch 算法框架/工具
Xinference实战指南:全面解析LLM大模型部署流程,携手Dify打造高效AI应用实践案例,加速AI项目落地进程
【8月更文挑战第6天】Xinference实战指南:全面解析LLM大模型部署流程,携手Dify打造高效AI应用实践案例,加速AI项目落地进程
Xinference实战指南:全面解析LLM大模型部署流程,携手Dify打造高效AI应用实践案例,加速AI项目落地进程
|
2月前
|
JavaScript 前端开发 UED
Javaweb之javascript的小案例的详细解析
通过上述步骤,我们得到了一个动态更新的实时时钟,这个简单的JavaScript案例展示了定时器的使用方法,并讲解了如何处理日期和时间。这个案例说明了JavaScript在网页中添加动态内容与交互的能力。对于涉足JavaWeb开发的学习者来说,理解和运用这些基础知识非常重要。
36 11
|
2月前
|
JSON 数据管理 关系型数据库
【Dataphin V3.9】颠覆你的数据管理体验!API数据源接入与集成优化,如何让企业轻松驾驭海量异构数据,实现数据价值最大化?全面解析、实战案例、专业指导,带你解锁数据整合新技能!
【8月更文挑战第15天】随着大数据技术的发展,企业对数据处理的需求不断增长。Dataphin V3.9 版本提供更灵活的数据源接入和高效 API 集成能力,支持 MySQL、Oracle、Hive 等多种数据源,增强 RESTful 和 SOAP API 支持,简化外部数据服务集成。例如,可轻松从 RESTful API 获取销售数据并存储分析。此外,Dataphin V3.9 还提供数据同步工具和丰富的数据治理功能,确保数据质量和一致性,助力企业最大化数据价值。
115 1
|
2月前
|
C# 开发者 Windows
震撼发布:全面解析WPF中的打印功能——从基础设置到高级定制,带你一步步实现直接打印文档的完整流程,让你的WPF应用程序瞬间升级,掌握这一技能,轻松应对各种打印需求,彻底告别打印难题!
【8月更文挑战第31天】打印功能在许多WPF应用中不可或缺,尤其在需要生成纸质文档时。WPF提供了强大的打印支持,通过`PrintDialog`等类简化了打印集成。本文将详细介绍如何在WPF应用中实现直接打印文档的功能,并通过具体示例代码展示其实现过程。
135 0
|
2月前
|
开发者
告别繁琐代码,JSF标签库带你走进高效开发的新时代!
【8月更文挑战第31天】JSF(JavaServer Faces)标准标签库为页面开发提供了大量组件标签,如`&lt;h:inputText&gt;`、`&lt;h:dataTable&gt;`等,简化代码、提升效率并确保稳定性。本文通过示例展示如何使用这些标签实现常见功能,如创建登录表单和展示数据列表,帮助开发者更高效地进行Web应用开发。
32 0
|
2月前
|
UED 存储 自然语言处理
【语言无界·体验无疆】解锁Vaadin应用全球化秘籍:从代码到文化,让你的应用畅游世界每一个角落!
【8月更文挑战第31天】《国际化与本地化实战:构建多语言支持的Vaadin应用》详细介绍了如何使用Vaadin框架实现应用的国际化和本地化,提升用户体验和市场竞争力。文章涵盖资源文件的创建与管理、消息绑定与动态加载、日期和数字格式化及文化敏感性处理等方面,通过具体示例代码和最佳实践,帮助开发者构建适应不同语言和地区设置的Vaadin应用。通过这些步骤,您的应用将更加灵活,满足全球用户需求。
35 0
|
2月前
|
前端开发 API 开发者
【React状态管理新思路】Context API入门:从零开始摆脱props钻孔的优雅之道,全面解析与实战案例分享!
【8月更文挑战第31天】React 的 Context API 有效解决了多级组件间状态传递的 &quot;props 钻孔&quot; 问题,使代码更简洁、易维护。本文通过电子商务网站登录状态管理案例,详细介绍了 Context API 的使用方法,包括创建、提供及消费 Context,以及处理多个 Context 的场景,适合各水平开发者学习与应用,提高开发效率和代码质量。
25 0
|
5月前
|
编译器 C语言 开发者
单片机原理与应用:探索微型计算机世界
单片机原理与应用:探索微型计算机世界
46 1
|
5月前
|
数据采集 数据处理 C语言
单片机:探索其原理、应用与编程实践
单片机:探索其原理、应用与编程实践
68 1

热门文章

最新文章

推荐镜像

更多
下一篇
无影云桌面