蓝桥杯单片机综合练习——工厂灯光控制

一、题目

二、代码

#include <reg52.h>sfr AUXR = 0x8e;    //定义辅助寄存器sbit S5 = P3^2;     //定义S5按键引脚
sbit S4 = P3^3;     //定义S4按键引脚unsigned char led_stat = 0xff;      //定义LED当前状态
unsigned char count = 0;            //定义50ms定时中断累计变量
unsigned char t_h =  0;             //定义运行时间的时变量
unsigned char t_m =  0;             //定义运行时间的分变量
unsigned char t_s =  0;             //定义运行时间的秒变量
unsigned char command = 0;          //定义串口命令字接受变量//========共阳极数码管的段码表============
unsigned char code SMG_duanma[18]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};
//=======================================//============锁存器选择函数==============
/** * @brief 选择要打通的锁存器* @param channel——要选择的通道* @retval 无**/
void SelectHC573(unsigned char 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;case 0:P2 = (P2 & 0x1f) | 0x00;break;}
}
//=======================================//=================延时函数==============
/** * @brief 延时* @param t--延时长度* @retval 无**/
void Delay(unsigned int t)
{while(t--);
}
//=======================================//===========系统初始化函数==============
/** * @brief 将蜂鸣器、继电器等无关设备关闭* @param 无* @retval 无**/
void InitSystem()
{SelectHC573(5);P0 = 0x00;SelectHC573(4);P0 = led_stat;SelectHC573(0);
}
//=======================================//===========设备检测函数================
/** * @brief 逐个检测工厂灯光的工作状态* @param 无* @retval 无**/
void CheckLED()
{unsigned int i;SelectHC573(4);for(i = 0;i < 8; i++){led_stat = 0xfe << i;P0 = led_stat;Delay(60000);Delay(60000);}for(i = 0;i < 8; i++){led_stat = ~(0xfe << i);P0 = led_stat;Delay(60000);Delay(60000);}
}/** * @brief 逐个检测数码管的工作状态* @param 无* @retval 无**/
void CheckSMG()
{unsigned int i;for(i = 0;i < 8; i++){ SelectHC573(6);P0 = ~(0xfe << i);SelectHC573(7);P0 = 0x00;Delay(60000);Delay(60000);}for(i = 0;i < 8; i++){SelectHC573(6);P0 = 0xfe << i;SelectHC573(7);P0 = 0x00;Delay(60000);Delay(60000);}SelectHC573(0);
}
//=======================================//=========数码管显示函数================
/** * @brief 在数码管指定位置上显示指定内容* @param pos——数码管选位value——数码管显示内容* @retval 无**/
void DisplaySMG(unsigned char pos,unsigned char value)
{P0 = 0xff;SelectHC573(6);P0 = 0x01 << pos;SelectHC573(7);P0 = value;
}/** * @brief 在数码管上显示系统运行时间* @param 无* @retval 无**/
void DisplayTime()
{DisplaySMG(7,SMG_duanma[t_s % 10]);     //秒的个位Delay(500);DisplaySMG(6,SMG_duanma[t_s / 10]);     //秒的十位Delay(500);DisplaySMG(5,SMG_duanma[16]);           //分隔符Delay(500);DisplaySMG(4,SMG_duanma[t_m % 10]);     //分的个位Delay(500);DisplaySMG(3,SMG_duanma[t_m / 10]);     //分的十位Delay(500);DisplaySMG(2,SMG_duanma[16]);           //分隔符Delay(500);DisplaySMG(1,SMG_duanma[t_h % 10]);     //时的个位Delay(500);DisplaySMG(0,SMG_duanma[t_h / 10]);     //时的十位Delay(500);
}
//=======================================//===========定时器函数==================
/** * @brief 将定时器T0设置为16位模式,计数初值为50ms* @param 无* @retval 无**/
void InitTimer0()
{TMOD = 0x21;                    //T0和T1定时器工作模式同时赋值TH0 = (65535 - 50000) / 256;TL0 = (65535 - 50000) % 256;ET0 = 1;                        //使能定时器T0EA = 1;                         //使能总中断TR0 = 1;                        //启动定时器T0
}/** * @brief 进行系统运行时间的处理* @param 无* @retval 无**/
void Timer0() interrupt 1
{TH0 = (65535 - 50000) / 256;TL0 = (65535 - 50000) % 256;count ++;if(count == 20){count = 0;t_s ++;}if(t_s == 60){t_s = 0;t_m ++;if(t_m == 60){t_m = 0;t_h++;}}
}
//=======================================//==============串口函数=================
/** * @brief 将串口初始化为模式一,波特率为9600,允许接收* @param 无* @retval 无**/
void InitUart()
{TMOD = 0x21;        //T0和T1定时器工作模式同时赋值TH1 = 0xfd;         //设置9600波特率的参数TL1 = 0xfd;TR1 = 1;            //启动定时器T1SCON = 0x50;        //8为UART模式,允许接收AUXR = 0x00;        //辅助寄存器设置ES = 1;             //使能串口中断EA = 1;             //使能总中断
}/** * @brief 接收上位机的数据并保存在command变量中* @param 无* @retval 无**/
void Uart() interrupt 4
{if(RI == 1){command = SBUF;     //将接收到的数据保存到command中RI = 0;             //接收完成后,将接收标志位RI清0}
}/** * @brief 串口给上位机发送一个字节* @param dat——串口发送的内容* @retval 无**/
void SendByte(unsigned char dat)
{SBUF = dat;         //把dat中的内容发送给上位机while(TI == 0);TI = 0;             //发送完成后,将发送标志位RI清0
}
//=======================================//========上位机命令解析执行函数=========
/** * @brief 接收上位机的数据并保存在command变量中* @param 无* @retval 无**/
void ExecuteCommand()
{if(command != 0x00)     //接收到上位机命令{switch(command & 0xf0)      //将命令类型取出来{case 0xa0:      //远程控制灯光SelectHC573(4);led_stat = (led_stat | 0x0f) & (~command | 0xf0);P0 = led_stat;SelectHC573(0);command = 0x00;break;case 0xb0:      //读取现场系统运行时间SendByte((t_h / 10 << 4) | (t_h % 10));SendByte((t_m / 10 << 4) | (t_m % 10));SendByte((t_s / 10 << 4) | (t_s % 10));command = 0x00;break;}}
}
//=======================================//==========按键扫描函数=================
/** * @brief 扫描S4与S5按键并执行现场灯光控制* @param 无* @retval 无**/
void ScanKeys()
{if(S4 == 0){Delay(500);             //按键消抖if(S4 == 0)             //确认按键按下{while(S4 == 0)      //等待按键松开{DisplayTime();}SelectHC573(4);led_stat = (led_stat | 0x80) & (~led_stat | 0x7f); P0 = led_stat;      //执行现场灯光控制SelectHC573(0);}}if(S5 == 0){Delay(500);             //按键消抖if(S5 == 0)             //确认按键按下{while(S5 == 0)      //等待按键松开{DisplayTime();}SelectHC573(4);led_stat = (led_stat | 0x40) & (~led_stat | 0xbf); P0 = led_stat;      //执行现场灯光控制SelectHC573(0);}}
}
//=======================================//===============主函数==================
void main()
{InitSystem();CheckLED();CheckSMG();InitTimer0();InitUart();while(1){ExecuteCommand();DisplayTime();ScanKeys();}
}
//=======================================

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/198098.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GitHub如何删除仓库

GitHub如何删除仓库 删除方法第一步第二步第三步 删除方法 第一步 在仓库的界面选择Settings 第二步 选择General,页面拉到最后。 第三步 后续按照导向删除仓库即可。

C++ Qt 学习(十):Qt 其他技巧

1. 带参数启动外部进程 QProcess 用于启动外部进程int QProcess::execute(const QString &program, const QStringList &arguments);QObject *parent; ... QString program "./path/to/Qt/examples/widgets/analogclock"; QStringList arguments; argument…

论文阅读——DiffusionDet

在目标检测上使用扩散模型 前向过程&#xff1a;真实框-->随机框 后向过程&#xff1a;随机框-->真实框 前向过程&#xff1a; 一般一张图片真实框的数目不同&#xff0c;填补到同一的N个框&#xff0c;填补方法可以是重复真实框&#xff0c;填补和图片大小一样的框&a…

教程:使用 Keras 优化神经网络

一、介绍 在 我 之前的文章中&#xff0c;我讨论了使用 TensorFlow 实现神经网络。继续有关神经网络库的系列文章&#xff0c;我决定重点介绍 Keras——据说是迄今为止最好的深度学习库。 我 从事深度学习已经有一段时间了&#xff0c;据我所知&#xff0c;处理…

在Java代码中指定用JAXB的XmlElement注解的元素的顺序

例如&#xff0c;下面的类RegisterResponse 使用了XmlRootElement注解&#xff0c;同时也使用XmlType注解&#xff0c;并用XmlType注解的propOrder属性&#xff0c;指定了两个用XmlElement注解的元素出现的顺序&#xff0c;先出现flag&#xff0c;后出现enterpriseId&#xff0…

python趣味编程-5分钟实现一个蛇梯游戏(含源码、步骤讲解)

蛇梯游戏是用Python编程语言开发的,它是一个桌面应用程序。 这个Python蛇梯游戏可以免费下载开源代码,它是为想要学习Python的初学者创建的。 该项目系统使用了 Pygame 和 Random 模块。 Pygame 是一组跨平台的 Python 模块,专为编写视频游戏而设计。 此游戏包含 Python …

度加创作工具 演示

度加创作工具 功能图功能测试文比润色测试经验分享测试测试输出测试输出工具地址功能图 功能测试 文比润色测试 经验分享测试 测试输出 在人工智能领域,我们一直在追求一个终极目标:让机器能够像人类一样,能够理解、学习和解决各种复杂问题。而要实现这个目标,我们需要将…

torch_cluster、torch_scatter、torch_sparse三个包的安装

涉及到下面几个包安装的时候经常会出现问题&#xff0c;这里我使用先下载然后再安装的办法&#xff1a; pip install torch_cluster pip install torch_scatter pip install torch_sparse 1、选择你对应的torch版本&#xff1a;https://data.pyg.org/whl/ 2、点进去然后&…

【Java 进阶篇】JQuery 事件绑定:`on` 与 `off` 的奇妙舞曲

在前端开发的舞台上&#xff0c;用户与页面的互动是一场精彩的表演。而 JQuery&#xff0c;作为 JavaScript 的一种封装库&#xff0c;为这场表演提供了更为便捷和优雅的事件绑定方式。其中&#xff0c;on 和 off 两位主角&#xff0c;正是这场奇妙舞曲中的核心演员。在这篇博客…

Smart Tomcat的使用

文章目录 Smart Tomcat的作用Smart Tomcat的安装Smart Tomcat的配置Smart Tomcat的启动 Smart Tomcat的作用 我们知道使用Servlet来完成一个项目一共需要七个步骤&#xff0c;即创建maven项目、添加依赖、创建目录结构、编写代码、打包程序、部署程序、验证程序。这样的确是完…

AI机器学习 | 基于librosa库和使用scikit-learn库中的分类器进行语音识别

专栏集锦&#xff0c;大佬们可以收藏以备不时之需 Spring Cloud实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏&#xff1a;https:/…

【LeetCode刷题-树】-- 572.另一棵树的子树

572.另一棵树的子树 方法&#xff1a;深度优先搜索暴力匹配 深度优先搜索枚举root中的每一个节点&#xff0c;判断这个点的子树是否与subroot相等 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right…

Oracle如何快速删除表中重复的数据

方法一&#xff1a; 在Oracle中&#xff0c;你可以使用DELETE语句结合ROWID和子查询来删除重复的记录。以下是一个示例&#xff1a; DELETE FROM your_table WHERE ROWID NOT IN (SELECT MAX(ROWID)FROM your_tableGROUP BY column1, column2, ... -- 列出用于判断重复的列 )…

深度学习:欠拟合与过拟合

1 定义 1.1 模型欠拟合 AI模型的欠拟合&#xff08;Underfitting&#xff09;发生在模型未能充分学习训练数据中的模式和结构时&#xff0c;导致它在训练集和验证集上都表现不佳。欠拟合通常是由于模型太过简单&#xff0c;没有足够的能力捕捉到数据的复杂性和细节。 1.2 模型…

快速搜索多个word、excel等文件中内容

如何快速搜索多个word、excel等文件中内容 操作方法 以win11系统为介绍对象。 首先我们打开“我的电脑”-->“文件夹选项”-->“搜索”标签页,在“搜索内容”下方选择&#xff1a;"始终搜索文件名和内容&#xff08;此过程可能需要几分钟&#xff09;"。然后…

react-router-dom 版本6.18.0中NavLink的api和属性介绍

React Router 是一个基于 React 的路由库&#xff0c;它可以帮助我们在 React 应用中实现页面的切换和路由的管理。而 NavLink 则是 React Router 中的一个组件&#xff0c;它可以帮助我们实现导航栏的样式设置和路由跳转。 在 React Router 版本6.18.0 中&#xff0c;NavLink…

【C++】入门三

接下来我们说一下引用这个概念&#xff0c;那么什么是引用呢&#xff1f;简单来说引用就是取别名&#xff0c;比如有一个变量叫a&#xff0c;现在我给它取了一个别名叫b&#xff0c;那么此时a和b管理的都是一块空间 这个例子就可以很好的体现a和b管理的是同一块空间&#xff0…

iframe渲染后端接口文件和实现下载功能

一&#xff1a;什么是iframe&#xff1f; 1、介绍 iframe 是HTML 中的一种标签&#xff0c;全称为 Inline Frame&#xff0c;即内联框架。它可以在网页中嵌入其他页面或文档&#xff0c;将其他页面的内容以框架的形式展示在当前页面中。iframe的使用方式是通过在HTML文档中插入…

Idea远程debug

Idea远程debug 一、方法 1.1、启动时加参数 java -agentlib:jdwptransportdt_socket,servery,suspendn,address5005 -jar remote-debug-0.0.1-SNAPSHOT.jar1.2、运行时加参数 在没有显式-agentlib:jdwp参数的情况下进行远程调试&#xff1a; 首先&#xff0c;确保您的Sprin…

六.Linux远程登录

1.说明&#xff1a;公司开发的时候&#xff0c;具体的应用场景是这样的 1.linux服务器是开发小组共享 2.正式上线的项目是运行在公网 3.因此程序员需要远程登录到Linux进行项目管理或者开发 4.画出简单的网络拓扑示意图(帮助理解) 5.远程登录客户端有Xshell6、Xftp6&#xff0…