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

一、题目

二、代码

#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.hqwc.cn/news/195836.html

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

相关文章

C# Winform围棋棋盘

C# Winform简单的围棋棋盘vs2008winform小游戏C#vs2010winform棋盘C#窗体小游戏 这是一个简单的围棋棋盘小游戏&#xff0c;使用C# Winform编写棋盘界面&#xff0c;玩家可以在空白的交叉点上下棋子 项目获取&#xff1a; 项目获取&#xff1a;typora: typora/img (gitee.co…

微机原理练习题_13

一、单项选择题(本大题共15小题,每小题3分,共45分。在每小题给出的四个备选项中,选出一个正确的答案。&#xff09; 1、十六进制数5BF.C8转换成二进制数是(&#xff09; A. 11011100111111101B B. 010111011011.01101B C. 010110111111.11001B D. 010111011011.11001B 2,最适合…

全新酷盒9.0源码:多功能工具箱软件的最新iapp解决方案

全能工具箱软件酷盒&#xff1a;源码提供iapp解决方案&#xff0c;自定义打造个性化体验 酷盒是一款功能丰富的工具箱软件&#xff0c;内置众多实用功能&#xff0c;并实时更新热门功能。该软件还拥有丰富的资源库&#xff0c;用户可以在线畅玩游戏、免费下载音乐等。 我们提…

NSS [鹤城杯 2021]Middle magic

NSS [鹤城杯 2021]Middle magic 源码直接给了。 粗略一看&#xff0c;一共三个关卡 先看第一关&#xff1a; if(isset($_GET[aaa]) && strlen($_GET[aaa]) < 20){$aaa preg_replace(/^(.*)level(.*)$/, ${1}<!-- filtered -->${2}, $_GET[aaa]);if(preg_m…

【NI-DAQmx入门】频率测量

1.频率概述 时域表示给出了信号在采样时刻的幅度。 频率是指循环或周期事件的复现率&#xff0c;对于模拟或数字波形&#xff0c;信号周期的倒数就是频率。快速傅立叶变换 (FFT) 提供了一种检查频域关系的方法。傅里叶定理指出&#xff0c;时域中的任何波形都可以用正弦和余弦的…

2023.11.17使用flask将多个图片文件上传至服务器

2023.11.17使用flask将多个图片文件上传至服务器 实现功能&#xff1a; 1、同时上传多个图片文件 2、验证文件扩展名 3、显示上传文件的文件名 4、显示文件上传结果 程序结构 main.py from flask import Flask, request, jsonify, render_template import osapp Flask(__n…

6 Redis的慢查询配置原理

1、redis的命令执行流程 redis的慢查询只针对步骤3 默认情况下&#xff0c;慢查询的阈值是10ms

node实战——koa实现文件上传

文章目录 ⭐前言⭐koa实现文件上传⭐foxapi测试⭐总结⭐结束⭐前言 大家好,我是yma16,本文分享关于node实战——node实战——koa实现文件上传。 本文适用对象:前端初学者转node方向,在校大学生,即将毕业的同学,计算机爱好者。 node系列往期文章 node_windows环境变量配置…

【Python进阶】近200页md文档14大体系知识点,第4篇:linux命令和vim使用

本文从14大模块展示了python高级用的应用。分别有Linux命令&#xff0c;多任务编程、网络编程、Http协议和静态Web编程、htmlcss、JavaScript、jQuery、MySql数据库的各种用法、python的闭包和装饰器、mini-web框架、正则表达式等相关文章的详细讲述。 全套Python进阶笔记地址…

ICCV2023 Tracking paper汇总(二)(多目标跟随、单目标跟随等)

十六、Integrating Boxes and Masks: A Multi-Object Framework for Unified Visual Tracking and Segmentation paper&#xff1a; https://openaccess.thecvf.com/content/ICCV2023/papers/Xu_Integrating_Boxes_and_Masks_A_Multi-Object_Framework_for_Unified_Visual_ICC…

智慧城市安全监控的新利器

在传统的城市管理中&#xff0c;井盖的监控一直是一个难题&#xff0c;而井盖异动传感器的出现为这一问题提供了有效的解决方案。它具有体积小、重量轻、安装方便等特点&#xff0c;可以灵活地应用于各种类型的井盖&#xff0c;实现对城市基础设施的全方位监控。 智能井盖监测终…

Android 10.0 系统修改usb连接电脑mtp和PTP的显示名称

1.前言 在10.0的产品定制化开发中,在usb模块otg连接电脑,调整为mtp文件传输模式的时候,这时可以在电脑看到手机的内部存储 显示在电脑的盘符中,会有一个mtp名称做盘符,所以为了统一这个名称,就需要修改这个名称,接下来分析下处理的 方法来解决这个问题 2.系统修改usb连…