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

news2024/11/15 4:58:55

一、题目

二、代码

#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.coloradmin.cn/o/1228384.html

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

相关文章

我又开始贩卖焦虑了,机器视觉兄弟们,打工这生意盘不活了?让人逃离北上广深,是毒鸡汤吗?

我想大多数人和我想的一样&#xff0c;不要质疑自己的出身&#xff0c;也不必用一生去改变出身而获得融入感&#xff0c;思想富足这是我们留给自己一生最珍贵的礼物。也许一线城市容不下肉身&#xff0c;二三线城市容不下灵魂。那我回到生我养我的十八线小县城&#xff0c;这不…

【Linux】冯诺依曼体系结构、操作系统、进程概念、进程状态、环境变量、进程地址空间

目录 一、冯诺依曼体系结构二、操作系统(OS)1. 操作系统是什么2. 操作系统如何做管理3. 系统调用和库函数概念 三、进程1. 进程是什么&#xff1f;2. 描述进程-PCB3. 查看进程的方法 四、进程状态1 运行、阻塞和挂起状态2 Linux中的进程状态 五、进程优先级1. 什么是优先级2.查…

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

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

云原生专栏丨基于服务网格的企业级灰度发布技术

灰度发布&#xff08;又名金丝雀发布&#xff09;是指在黑与白之间&#xff0c;能够平滑过渡的一种发布方式。在其上可以进行A/B testing&#xff0c;即让一部分用户继续用产品特性A&#xff0c;一部分用户开始用产品特性B&#xff0c;如果用户对B没有什么反对意见&#xff0c;…

函数式编程框架 functionaljava 简介

文章目录 一、函数式编程起源二、functionaljava 框架简介 一、函数式编程起源 ​ 函数式编程起源于数理逻辑&#xff08;范畴论&#xff0c;Category Theory&#xff09;&#xff0c;起源于λ演算&#xff0c;这是一种演算法&#xff0c;它定义一些基础的数据结构&#xff0c…

人力资源小程序

人力资源管理对于企业的运营至关重要&#xff0c;而如今随着科技的发展&#xff0c;制作一个人力资源小程序已经变得非常简单和便捷。在本文中&#xff0c;我们将为您介绍如何通过乔拓云网制作一个人力资源小程序&#xff0c;只需五个简单的步骤。 第一步&#xff1a;注册登录乔…

【开源】基于Vue.js的智能教学资源库系统

项目编号&#xff1a; S 050 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S050&#xff0c;文末获取源码。} 项目编号&#xff1a;S050&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 课程档案模块2.3 课…

黑马程序员 计算机网络(笔记)

参考文章&#xff1a;【黑马程序员】计算机网络概述~ 程序员必须掌握的入门基础知识&#xff01; 参考文章&#xff1a;黑马程序员Linux运维工作场景解决方案零基础到就业 参考文章&#xff1a;网络安全运维进阶教程&#xff0c;运维工程师深度学习教程 文章目录 linux入门到…

Windows核心编程 静态库与动态库

资源文件 .rc 文件 会被 rc.exe 变成 .res 文件(二进制文件) 在链接时链接进入 .exe 文件 一、如何保护源码 程序编译链接过程 不想让别人拿到源代码&#xff0c;但是想让其使用功能&#xff0c;根据上图观察&#xff0c;把自己生成的obj给对方&#xff0c;对方拿到obj后&…

nodejs+vue实验室上机管理系统的设计与实现-微信小程序-安卓-python-PHP-计算机毕业设计

用户&#xff1a;管理员、教师、学生 基础功能&#xff1a;管理课表、管理机房情况、预约机房预约&#xff1b;权限不同&#xff0c;预约类型不同&#xff0c;教师可选课堂预约和个人&#xff1b;课堂预约。 在实验室上机前&#xff0c;实验室管理员需要对教务处发来的上机课表…

Spring 配置

配置文件最主要的目的 : 解决硬编码的问题(代码写死) SpringBoot 的配置文件,有三种格式 1.properties 2.yaml 3.yml(是 yaml 的简写) SpringBoot 只支持三个文件 1.application.properties 2.application.yaml 3.application.yml yaml 和 yml 是一样的,学会一个就行…

SpringCloud微服务注册中心:Nacos介绍,微服务注册,Ribbon通信,Ribbon负载均衡,Nacos配置管理详细介绍

微服务注册中心 注册中心可以说是微服务架构中的”通讯录“&#xff0c;它记录了服务和服务地址的映射关系。在分布式架构中&#xff0c;服务会注册到这里&#xff0c;当服务需要调用其它服务时&#xff0c;就这里找到服务的地址&#xff0c;进行调用。 微服务注册中心 服务注…

PyTorch神经网络-激励函数

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

LV.12 D18 中断处理 学习笔记

一、ARM的异常处理机制及工程代码结构 1.1异常概念 处理器在正常执行程序的过程中可能会遇到一些不正常的事件发生 这时处理器就要将当前的程序暂停下来转而去处理这个异常的事件 异常事件处理完成之后再返回到被异常打断的点继续执行程序。 1.2异常处理机制 不同的处…

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

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

nodejs微信小程序-实验室上机管理系统的设计与实现-安卓-python-PHP-计算机毕业设计

用户&#xff1a;管理员、教师、学生 基础功能&#xff1a;管理课表、管理机房情况、预约机房预约&#xff1b;权限不同&#xff0c;预约类型不同&#xff0c;教师可选课堂预约和个人&#xff1b;课堂预约。 目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 …

容斥 C. Strange Function改编题

补题&#xff1a; 题目详情 - 9.段坤爱取模%%% - SUSTOJ 本题或许是参考 Problem - C - Codeforces 根据题意&#xff0c;f(i)就是不能被整除的最小的一个质因子。 打表发现&#xff0c;当15个质因子相乘后&#xff0c;长度就大于18。 因此可以知道小于等于1e16内的正整数x…

(动手学习深度学习)第13章 计算机视觉---微调

文章目录 微调总结 微调代码实现 微调 总结 微调通过使用在大数据上的恶道的预训练好的模型来初始化模型权重来完成提升精度。预训练模型质量很重要微调通常速度更快、精确度更高 微调代码实现 导入相关库 %matplotlib inline import os import torch import torchvision f…

java文件压缩加密,使用流的方式

使用net.lingala.zip4j来进行文件加密压缩。 添加依赖net.lingala.zip4j包依赖&#xff0c;这里使用的是最新的包2.11.5版本。 <dependency><groupId>net.lingala.zip4j</groupId><artifactId>zip4j</artifactId><version>${zip4j.versi…

丹麦能源袭击预示着更关键的基础设施成为目标

5 月&#xff0c;22 个丹麦能源部门组织在与俄罗斯 Sandworm APT 部分相关的攻击中受到损害。 丹麦关键基础设施安全非营利组织 SektorCERT 的一份新报告描述了不同的攻击者群体利用合勤防火墙设备中的多个关键漏洞&#xff08;包括两个零日漏洞&#xff09;侵入工业机械&…