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

一、题目

二、代码

#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;                        //使能定时器T0
    EA = 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;            //启动定时器T1
    
    SCON = 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.mfbz.cn/a/166145.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

012 C++ AVL_tree

前言 本文将会向你介绍AVL平衡二叉搜索树的实现 引入AVL树 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序普通的二叉搜索树将退化为单支树&#xff0c;查找元素相当于在顺序表中搜索元素&#xff0c;效率低下。因此&#xff0c;两位俄罗斯的数学家G.M…

【Feign】 基于 Feign 远程调用、 自定义配置、性能优化、实现 Feign 最佳实践

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; SpringCloud MybatisPlus JVM 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 Feign 一、 基于 Feign 远程调用1.1 RestTemplate方式…

PyTorch神经网络-激励函数

在PyTorch 神经网络当中&#xff0c;使用激励函数处理非线性的问题&#xff0c;普通的神经网络出来的数据一般是线性的关系&#xff0c;但是遇到比较复杂的数据的话&#xff0c;需要激励函数处理一些比较难以处理的问题&#xff0c;非线性结果就是其中的情况之一。 FAQ:为什么要…

高精度算法【Java】(待更新中~)

高进度加法 在Java中可以使用BigInteger进行高精度计算&#xff0c;除此也可以仿照竖式相加的计算原理进行计算。 BigInteger 提供所有 Java 的基本整数操作符的对应物&#xff0c;并提供 java.lang.Math 的所有相关方法。另外&#xff0c;BigInteger 还提供以下运算&#xff1…

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

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

【Django-DRF用法】多年积累md笔记,第(4)篇:Django-DRF反序列化详解

本文从分析现在流行的前后端分离Web应用模式说起&#xff0c;然后介绍如何设计REST API&#xff0c;通过使用Django来实现一个REST API为例&#xff0c;明确后端开发REST API要做的最核心工作&#xff0c;然后介绍Django REST framework能帮助我们简化开发REST API的工作。 全…

C++基础从0到1入门编程(三)

系统学习C 方便自己日后复习&#xff0c;错误的地方希望积极指正 往期文章&#xff1a; C基础从0到1入门编程&#xff08;一&#xff09; C基础从0到1入门编程&#xff08;二&#xff09; 参考视频&#xff1a; 1.黑马程序员匠心之作|C教程从0到1入门编程,学习编程不再难 2.系统…

开源与闭源:大模型发展的双重走向

目录 前言开源和闭源的优劣势比较开源的优势闭源的优势 开源和闭源对大模型技术发展的影响对技术发展的影响对数据共享的影响对业务拓展的影响 开源与闭源的商业模式比较开源的商业模式闭源的商业模式 处在大模型洪流中&#xff0c;向何处去&#xff1f;结语 前言 随着人工智能…

python趣味编程-5分钟实现一个俄罗斯方块游戏(含源码、步骤讲解)

Python俄罗斯方块游戏是一款基于GUI的标题匹配益智游戏,非常容易理解和使用。说到游戏玩法,一切都和真实的一样。 用户必须管理俄罗斯方块的随机序列。在这个Python 俄罗斯方块游戏项目中,我将教您如何使用 Python 制作俄罗斯方块游戏。 Python 代码中的俄罗斯方块游戏:项目…

如何在虚拟机的Ubuntu22.04中设置静态IP地址

为了让Linux系统的IP地址在重新启动电脑之后IP地址不进行变更&#xff0c;所以将其IP地址设置为静态IP地址。 查看虚拟机中虚拟网络编辑器获取当前的子网IP端 修改文件/etc/netplan/00-installer-config.yaml文件&#xff0c;打开你会看到以下内容 # This is the network conf…

开源WIFI继电器之硬件电路

一、原理图 源文件 二、原理图说明 1、器件说明 U4&#xff1a;ESP8285模块 U6&#xff1a;触发器 U3&#xff1a;继电器 2、继电器状态检测说明 检测继电器线圈是否通电来判断继电器是否导通&#xff0c;当Q1不导通时&#xff0c;Q1集电极的电压为3.3V&#xff0c;经…

【运维篇】Redis常见运维命令详解

文章目录 1. 前言2. 连接管理命令详解2.1 AUTH命令2.2 PING命令2.3 SELECT命令2.4 QUIT命令 3. 服务器管理命令详解3.1 FLUSHALL命令3.2 SAVE/BGSAVE命令3.3 SHUTDOWN命令 4. 安全管理命令详解4.1 CONFIG命令4.1.1 CONFIG SET命令用法4.1.2 CONFIG GET命令用法 4.2 AUTH命令 5.…

T10 数据增强

文章目录 一、准备环境和数据1.环境2. 数据 二、数据增强&#xff08;增加数据集中样本的多样性&#xff09;三、将增强后的数据添加到模型中四、开始训练五、自定义增强函数六、一些增强函数 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f…

【算法】滑动窗口题单——2.不定长滑动窗口(求最长/最大)

文章目录 3. 无重复字符的最长子串1493. 删掉一个元素以后全为 1 的最长子数组904. 水果成篮1695. 删除子数组的最大得分2841. 几乎唯一子数组的最大和2024. 考试的最大困扰度1004. 最大连续1的个数 III1438. 绝对差不超过限制的最长连续子数组2401. 最长优雅子数组解法1——维…

[AutoSar]导出task mapping 表到excel

目录 关键词平台说明背景实现方法 关键词 嵌入式、C语言、autosar 平台说明 项目ValueOSautosar OSautosar厂商vector芯片厂商TI编程语言C&#xff0c;C编译器HighTec (GCC) 背景 为了做文档输出&#xff0c;要导出task mapping 到excel。 实现方法 1.按住shift&#xf…

IDEA自动注解设置(中文版)

IDEA自动注解设置 1、添加类自动注释 文件 - 设置 - 编辑器 - 文件和代码模板 - Include - File Header /** *description&#xff1a;TODO *author&#xff1a; ${USER} *create&#xff1a; ${DATE} ${TIME} */2、添加类方法自动注释 文件 - 设置 - 编辑器 - 实时模版 - …

NSS [NCTF 2018]小绿草之最强大脑

NSS [NCTF 2018]小绿草之最强大脑 题目要求我们输入一个位数>21的正数&#xff0c;带入表达式并且计算结果。 查看源码发现hint&#xff0c;有源码泄露。 拿dirsearch扫一下。扫到了一个备份文件。 python dirsearch.py -u http://node4.anna.nssctf.cn:28805/访问/index.…

SpringCloud 微服务全栈体系(十四)

第十一章 分布式搜索引擎 elasticsearch 四、RestAPI ES 官方提供了各种不同语言的客户端&#xff0c;用来操作 ES。这些客户端的本质就是组装 DSL 语句&#xff0c;通过 http 请求发送给 ES。官方文档地址&#xff1a;https://www.elastic.co/guide/en/elasticsearch/client/…

H110主板搭配魔改QNCW升级小记

最近搬家完毕&#xff0c;翻出来一块闲置已久的qncw&#xff0c;隐约记得是买的主板套装&#xff0c;现在主板早已不知踪影&#xff0c;剩下孤零零一个CPU&#xff0c;一起翻出来一个G3900T亮机CPU&#xff0c;应该是同时代的产物。 qncw百度上一搜&#xff0c;发现参数还行&am…

iTerm2+oh-my-zsh搭个Mac电脑上好用好看终端

根据苹果网站上介绍&#xff0c;bash是 macOS Mojave 及更早版本中的默认Shell&#xff0c;从 macOS Catalina 开始&#xff0c;zsh(Z shell) 是所有新建用户帐户的默认Shell。 1. 安装Oh my zsh sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzs…
最新文章