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

一、题目

二、代码

#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.mzph.cn/news/153485.shtml

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

相关文章

【Docker】从零开始:2.Docker三要素

【Docker】从零开始&#xff1a;2.Docker三要素 DockerDocker支持的系统CentOS DockerDocker三要素Docker镜像(Image):Docker容器(Container):1.从面向对象角度2.从镜像容器角度 Docker仓库(Repository) 总结 Docker docker官网&#xff1a;http://www.docker.com 仓库-Docker…

leetcode 每日一题复盘(11.20~11.26)

leetcode 746 使用最小花费爬楼梯 虽然是简单题但还是要说一下,感觉做题的思路还是不够清晰,好的是知道状态是最低花费,知道围绕所求的目标进行展开,倒推出递推公式 一开始写的递推公式是dp[i]dp[i-1]min(cost[i-2],cost[i-1]),写出了一个类似贪心算法的东西,归根结底还是对dp…

Android13 新增 Stable AIDL接口

问题描述&#xff1a; 我需要在netd aidl 中添加新的接口&#xff1a; 设置网卡MAC地址&#xff1a; void setHardwareAddress(in utf8InCpp String iface, in utf8InCpp String hwAddr); 背景&#xff1a; Android 10 添加了对稳定的 Android 接口定义语言 (AIDL) 的支持&…

机器学习:十大算法快速回顾

一、说明 对于机器学习的是个经典算法&#xff0c;本篇将展示一个回顾&#xff0c;注意&#xff0c;本篇不是具体原理信息介绍&#xff0c;没有代码&#xff0c;但是对于初学者是一个有益的导读。 二. 线性回归 2.1 算法描述 有没有想过数据奇才如何预测未来&#xff1f;输入线…

Linux安装rabbitMq(亲测可用)解决只能本地访问的问题

安装er https://blog.csdn.net/laterstage/article/details/131513793?spm1001.2014.3001.5501下载mq wget --content-disposition "https://packagecloud.io/rabbitmq/rabbitmq-server/packages/el/7/rabbitmq-server-3.10.0-1.el7.noarch.rpm/download.rpm?distro_v…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《氢耦合区域综合能源系统集群双层博弈随机优化调度策略》

这个标题涉及到复杂的领域&#xff0c;主要包括氢能源、能源系统集群、双层博弈、随机优化和调度策略。我将分步解读这个标题&#xff1a; 氢耦合区域综合能源系统集群&#xff1a; 氢能源&#xff1a; 这指的是使用氢作为能源的系统&#xff0c;可能是指氢燃料电池等。区域综合…

TensorFlow实战教程(二十六)-什么是生成对抗网络GAN?基础原理和代码普及

从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前一篇文章分享了Keras实现经典的深度学习文本分类算法,包括LSTM、BiLSTM、BiLSTM+Attention和CNN、TextCNN。这篇文章将详细介绍生成对抗网络GAN的基础知识,包括什么是GAN、常用算法(CGAN、DCGAN、…

护眼灯买哪种好?考研必备的护眼台灯推荐

家里顶灯太暗了且高度太高&#xff0c;还是原始的LED灯&#xff0c;晚上用着眼睛都有点难受&#xff0c;还好遇到了儿童护眼灯。下面小编为大家介绍下儿童护眼灯哪个牌子好&#xff1f;什么护眼台灯比较专业 1、色温 台灯的色温也是一个需要考虑的因素&#xff0c;所谓的色温其…

【数据结构】图的存储结构及实现(邻接表和十字链表)

一.邻接矩阵的空间复杂度 假设图G有n个顶点e条边&#xff0c;则存储该图需要O&#xff08;n^2) 不适用稀疏图的存储 二.邻接表 1.邻接表的存储思想&#xff1a; 对于图的每个顶点vi&#xff0c;将所有邻接于vi的顶点链成一个单链表&#xff0c;称为顶点vi的边表&#xff08…

海外服务器相较于国内服务器有何特点?亚马逊海外服务器为何零跑全球

随着数字时代的迅猛发展&#xff0c;云计算基础设施的重要性愈发凸显。在这个信息爆炸的全球化时代&#xff0c;很多企业的海外业务的成功往往取决于是否拥有安全、可靠、高性能、可扩展、灵活且全球覆盖的云基础设施&#xff0c;因此对很多企业来说&#xff0c;选择一款优质的…

Selenium IDE录制脚本

文章目录 1.环境搭建1.1 Chrome浏览器安装1.2 Chrome驱动安装1.3 Selenium IDE插件的安装 2.Selenium IDE插件介绍2.1 初始化界面2.2 菜单栏2.3 工具栏2.4 地址栏2.5 测试用例窗口2.6 测试脚本窗口2.7 日志和引用窗口 3.元素定位3.1 通过id进行元素定位3.2 通过name进行元素定位…

笔记本散热怎么做?学会4招,快速散热!

“不知道为什么&#xff0c;我的笔记本总是用着用着就会发热。有时候还会非常的烫。这是为什么呢&#xff1f;应该怎么解决笔记本散热的问题呢&#xff1f;” 随着笔记本性能的提高&#xff0c;散热变得尤为重要。合理的散热不仅可以保持笔记本的稳定性能&#xff0c;还能延长其…

对一个Series序列内的元素逐个扩展同一聚合操作一个序列中共有m个元素,从指定的第n个元素开始,对前i元素进行聚合计算Series.expanding()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 一个序列中共有m个元素 从指定的第n个元素开始 对前i元素进行聚合计算 其中&#xff1a;n < i < m 聚合计算&#xff1a;求最大、平均值等 Series.expanding(n).max() Series.expanding(…

什么是加工制造业ERP系统?加工制造业ERP软件有哪些作用

化工、电子、五金、来料加工等不同性质的加工企业有差异化的业务特点&#xff0c;传统的管理模式难以解决多仓库、多工厂、多门店、多渠道信息统一和实时共享等问题。 另外如何实时掌握车间产能、科学制定生产计划、多门店数据统一和实时同步等问题&#xff0c;是很多加工制造…

【Linux】基本指令

Linux现在已经是绕不开的操作系统&#xff0c;其开源导致的稳定性&#xff0c;安全性等方面遥遥领先。今天我们开始学习Linux操作系统的基本指令 目录 lspwdcdtouchmkdirrmdir && rmmancp ls 语法&#xff1a; ls [选项][目录或文件] 功能&#xff1a;对于目录&#xf…

在回调之间共享数据

可以在 App 中为 UI 组件编写回调函数&#xff0c;以指定用户与其交互时的行为方式。 在具有多个相互依赖的 UI 组件的 App 中&#xff0c;回调函数通常必须访问主 App 函数中定义的数据&#xff0c;或与其他回调函数共享数据。例如&#xff0c;如果创建一个具有列表框的 App&a…

关于WhatsApp群发营销价值、类型、优劣势……这里一次性讲清楚

01 社交销售互动&#xff1a;全球营销新趋势 当下&#xff0c;全球品牌的营销销售互动都步入了社交销售新时代&#xff0c;相比原来任何一种形式的互动沟通来说&#xff0c;其沟通效率、体验、效果都是无与伦比的。 企业与销售的互动&#xff0c;与通讯信息技术发展息息相关。…

电容搞搞”振“,PDN有帮衬

高速先生成员--姜杰 聊电容&#xff0c;不能只聊电容&#xff0c;还要聊电阻和电感。看似很简单&#xff0c;其实&#xff0c;一点都不难。 因为去耦电容的模型基本都可以用下面三种元素的简单组合来表示。 理想电容C的阻抗是随频率的增加而逐渐减小的一条斜线&#xff0c;实际…

脱离form表单校验input(校验单个input输入框)提交时边框变红

把需要自定义校验的数据放在一个对象中&#xff0c;方便以后多个字段校验 customVerifyInps:{communityInp2:"",asPathInp:"",}, 在输入框中绑定id <el-inputid"communityInp2"placeholder""v-model"customVerifyInps.commu…

基于STM32设计的(无人)智慧超市-2023改进版

改进的内容: 增加了一个智慧超市登录入口,整个上位机只有一个APP文件。 可以选择顾客或者管理员的身份进去。优化了界面的显示。 一、项目背景 智慧超市是一种新型的零售形式,它将人工智能、物联网、云计算等技术应用到超市运营中,为消费者提供更加便捷、快捷、个性化的购…