蓝桥杯单片机组——国赛1 各模块的基础模板

本文为续写个人专栏:蓝桥杯单片机组基础专栏

由于国赛代码体量较为庞大,各个模块涉及时序、消影、去鬼影、消冲突等操作

因此本文基于小蜜蜂老师代码风格编写,并根据实际有改动

本文用于汇总基础的模块程序,更进阶的操作请查看本专栏下其他文章


0.编程风格

        变量命令规则用“类型_流动方向”组合:value_led 表示这是一个变量的值,要传入led函数;key_value表示这是一个变量,从key函数中获取出来;flash_SMG表示这是一个刷新标志位,为1时刷新数码管;time5s_flag表示这是一个指示标志位,指示达到5s的时间间隔。

        函数命令规则主要分为两类。一类是,实时的运行函数,如value_running(),ds18b20_running()等,直接放入主函数的死循环中运行。另一类是功能性函数,如,flash_SMG()是不放入主函数,而是在其他函数中用于直接调用的。

        定时器0用于产生50us的中断,定时器1用于产生5ms的中断。对于标志位,直接在中断里改变其值,对于数据计算部分单独建立一个value_running()函数用于处理。

        51单片机处理负数可以定义“int”类型,普通变量定义“unsigned char”类型,标志变量定义“bit”类型。除了555定时计数器,其他所有的外设都要设置刷新的标志位,可以提升系统运行效率,以一定的时间间隔刷新,555定时器,除了要短接引脚,还要用RB3调节频率的数值。

        光敏电阻数字跳动太大:加1ms延时,加中断标志间隔时间后刷新,加最后一步等待应答,加临时变量判断数据正确再写入。
        ds1302,最好用中断,每隔1s提取一遍时间到变量中,再用数码管显示,减少资源占用。对于刷新频率为1s为单位的变量,可以直接读取ds1302的秒位,判断是否达到1s的整数倍
        对于led的操作。当led的变化有规律时——建立数组存放led的状态。当led没有规律时——一定要学会位运算,直接对变量value_led进行位操作,然后利用中断传入led处理函数。对于继电器的操作,也不要定义继电器的一个引脚,直接对P0口进行操作。对于io编程模式,要注意对锁存器常关闭。同时采用先赋值P0端口,再打开锁存器方式,这样有效防止数据冲突。
        定时计数器,选择12T模式!!!

编程流程:

  1. 搭建底层文件:把题目的外设添加好,数码管窗口切换做好
  2. 直接给SMG_flag变量赋值,逐个测试数码管各个窗口是否正常
  3. 开始运行各个外设,并挨个验证查看数值是够正确
  4. 逐个编写按键逻辑,并挨个检查界面变化、数值显示是否正常
  5. 测试按键逻辑是否正常,有没有影响其他部分
  6. 添加led,继电器等次要外设部分内容

1.基础代码

//锁存器通道选择函数
void select_HC573 ( unsigned char channal )
{switch ( channal ){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;}
}
//初始化系统,关闭继电器和蜂鸣器
void init_sys ()
{select_HC573 ( 0 );P0 = 0xff;	select_HC573 ( 4 );select_HC573 ( 0 );P0 = 0x00;select_HC573 ( 5 );select_HC573 ( 0 );
}

2.led操作代码

//led灯光控制函数
void state_led ( unsigned char value_led )
{select_HC573 ( 0 );P0 = 0xff;select_HC573 ( 4 );P0 = value_led;select_HC573 ( 4 );	select_HC573 ( 0 );
}

3.数码管操作代码

SMG_flag为使用定时计数器设置的数码管刷新时间间隔

//单位数码管显示函数
void state_SMG ( unsigned char pos_SMG , unsigned char value_SMG )
{select_HC573 ( 0 );P0 = 0x01 << pos_SMG;	select_HC573( 6 );select_HC573 ( 0 );P0 = value_SMG;select_HC573( 7 );select_HC573 ( 0 );
}//全位数码管静态显示
void state_SMG_all ( unsigned char value_SMG_all )
{select_HC573 ( 0 );P0 = 0xff;	select_HC573( 6 );select_HC573 ( 0 );P0 = value_SMG_all;select_HC573( 7 );select_HC573 ( 0 );
}void SMG_flash ()
{state_SMG_all ( 0xff );if ( SMG_flag == 0 ){switch ( flash_count ){case 0:				state_SMG ( 0 , duanma[1] );break;case 1:				state_SMG ( 1 , duanma[1] );break;case 2:				state_SMG ( 2 , duanma[1] );break;case 3:				state_SMG ( 3 , duanma[1] );break;case 4:				state_SMG ( 4 , duanma[1] );break;case 5:				state_SMG ( 5 , duanma[1] );break;case 6:				state_SMG ( 6 , duanma[1] );break;case 7:	state_SMG ( 7 , duanma[1] );break;}}else if ( SMG_flag == 1 ){switch ( flash_count ){case 0:				state_SMG ( 6 , duanma[2] );break;case 1:				state_SMG ( 7 , duanma[2] );break;}}	
}

4.按键操作代码

void keyrunning ()
{C1 = 0;C2 = H1 = H2 = 1;if ( H1 == 0 ){Delay4ms();if ( H1 == 0 )//S4{while ( H1 == 0 );}}else if ( H2 == 0 ){Delay4ms();if ( H2 == 0 )//S5{if ( SMG_flag != 1 ){}while ( H2 == 0 );	}}C2 = 0;C1 = H1 = H2 = 1;if ( H1 == 0 ){Delay4ms();if ( H1 == 0 )//S8{while ( H1 == 0 );}}else if ( H2 == 0 ){Delay4ms();if ( H2 == 0 )//S9{while ( H2 == 0 );}}
}

5.ds18b20代码

bit flash_ds18b20 = 0;
unsigned char pld_temperature = 0;
unsigned int temperature = 0;
unsigned int set_temperature =  300;
void flash_temperature ()
{if ( flash_ds18b20 == 1 ){unsigned char LSB,MSB;old_temperature = temperature;init_ds18b20();Write_DS18B20(0xcc);	Write_DS18B20(0x44);Delay700ms();init_ds18b20();Write_DS18B20(0xcc);	Write_DS18B20(0xbe);LSB = Read_DS18B20();MSB = Read_DS18B20();temperature = MSB;temperature = ( temperature << 8 ) | LSB;temperature = (temperature >> 4)*10 + (LSB & 0x0f)*0.625;flash_ds18b20 = 0;}}

6.ds1302代码

void init_ds1302 ()
{unsigned char i;Write_Ds1302_Byte ( 0x8e , 0x00 );for ( i=0 ; i<7 ; i++ ){Write_Ds1302_Byte ( Write_address[i] , date_ds1302[i] );}Write_Ds1302_Byte ( 0x8e , 0x80 );}bit flash_ds1302 = 0;
void flash_date()
{if ( flash_ds1302 == 1 ){unsigned char i;for ( i=0 ; i<7 ; i++ ){date_ds1302[i] = Read_Ds1302_Byte ( Read_address[i] );}flash_ds1302 = 0;}
}

7.pcf5951操作

bit flash_rd1 = 0;
unsigned char rd1_value = 0;
void rd1running()
{unsigned char tmp = 0;if ( flash_rd1 == 1 ){I2CStart();I2CSendByte(0x90);I2CWaitAck();I2CSendByte(0x01);I2CWaitAck();I2CStop();Delay1ms();I2CStart();I2CSendByte(0x91);I2CWaitAck();tmp = I2CReceiveByte();I2CWaitAck();I2CSendAck(1);I2CStop();flash_rd1 = 0;}if ( tmp<220 && tmp>0 ){rd1_value = tmp;}
}unsigned char rb2_value = 0;
void rb2running()
{I2CStart();I2CSendByte(0x90);I2CWaitAck();I2CSendByte(0x03);I2CWaitAck();I2CStop();Delay2ms();I2CStart();I2CSendByte(0x91);I2CWaitAck();rb2_value = I2CReceiveByte();I2CSendAck(1);I2CStop();}void dacrunning ( unsigned char value_dac )
{if ( flash_dac == 1 ){I2CStart();I2CSendByte( 0x90 );I2CWaitAck();I2CSendByte( 0x43 );I2CWaitAck();I2CSendByte( value_dac );I2CWaitAck();I2CStop();}
}

8.at24c02

void write_at24c02 ( unsigned char addr_write , unsigned char value_write )
{I2CStart();I2CSendByte(0xa0);I2CWaitAck();I2CSendByte(addr_write);I2CWaitAck();I2CSendByte(value_write);I2CWaitAck();I2CStop();
}unsigned char read_at24c02 ( unsigned char addr_read )
{unsigned char power_count_temp;I2CStart();I2CSendByte(0xa0);I2CWaitAck();I2CSendByte(addr_read);I2CWaitAck();I2CStart();I2CSendByte(0xa1);I2CWaitAck();power_count_temp = I2CReceiveByte();I2CSendAck(1);I2CStop();return power_count_temp;
}

9.555定时计数器

void init_timer(void)		//50毫秒@11.0592MHz
{AUXR &= 0xBF;		//定时器时钟12T模式TMOD &= 0x00;		//设置定时器模式TMOD |= 0x16;		//设置定时器模式TL1 = 0x00;		//设置定时初始值TH1 = 0x4C;		//设置定时初始值TH0 = 0xff;TL0 = 0xff;TF1 = 0;		//清除TF1标志TF0 = 0;TR1 = 1;		//定时器1开始计时TR0 = 1;EA = 1;ET1 = 1;ET0 = 1;
}unsigned int count_timer0 = 0;
void timer0_service () interrupt 1
{count_timer0++;
}unsigned int count_fre = 0;
unsigned char count_50ms = 0;
void timer1_service () interrupt 3
{count_50ms++;TL1 = 0x00;		//设置定时初始值TH1 = 0x4C;		//设置定时初始值if ( count_50ms == 20 ){count_50ms = 0;count_fre = count_timer0;count_timer0 = 0;}
}

10.超声波传感器

void send_sonic ()
{unsigned char i;for ( i=0 ; i<8 ; i++ ){TX = 1;Delay14us();TX = 0;Delay14us();}
}unsigned int value_distance = 0;
void read_sonicrunning ()
{TL0 = 0x00;TH0 = 0x00;send_sonic ();TR0 = 1;//当超声波未接受到返回信号,且计时器没有溢出while ( (RX ==1) && (TF0 == 0) );TR0 = 0;if ( TF0 == 0 )    //如果接收到了返回信号,且定时器未溢出{value_distance = TH0;value_distance = (value_distance<<8) | TL0;value_distance = value_distance * 0.0184;}else    //如果定时器溢出,却还没返回信号{TF0 = 0;value_distance = 999;}
}

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

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

相关文章

Elasticsearch查看集群信息,设置ES密码,Kibana部署

Elasticsearch查看集群信息&#xff0c;设置ES密码&#xff0c;Kibana部署 查看集群信息查看节点信息查看集群健康状态查看分片信息查看其他集群信息 Kibana部署安装设置ES密码 查看集群信息 查看节点信息 curl http://127.0.0.1:9200/_cat/nodes?v 参数说明&#xff1a; ip…

研究生学习---找工作

规划 研一~研二上学期完成小论文&#xff0c;实习&#xff0c;秋招 竞赛&#xff1a;kaggle&#xff1f; 面试题一般简单且为原题&#xff0c;笔试题目很难&#xff0c;不会出原题 项目 找工作软件

SwiftUI中三大渐变色的介绍

在SwiftUI中&#xff0c;渐变色是一种常用的视觉效果&#xff0c;用于创建平滑过渡的颜色变化。通过使用渐变色&#xff0c;我们可以实现丰富多彩的界面设计&#xff0c;增强用户体验。 1. 渐变色的种类和用途 种类&#xff1a; 线性渐变&#xff08;Linear Gradient&#x…

【时隙ALOHA,CSMA(载波侦听多路访问)carrier sense mltiple access,无线局域网: CSMA/CA】

文章目录 时隙ALOHA时隙ALOHA的效率( Efficiency )纯ALOHA(非时隙)----效率低CSMA(载波侦听多路访问)carrier sense mltiple accessCSMA冲突CSMA/CD(冲突检测)边说边听&#xff08;提高了信道利用率&#xff09;以太网就是用的这个无线局域网: CSMA/CA无线局域网中的 MAC&#…

Transformer+Classification学习笔记

论文名称&#xff1a;An Image is Worth 16x16 Words:Transformers for Image Recognition at Scale [2112.11010] MPViT: Multi-Path Vision Transformer for Dense Prediction (arxiv.org) 参考博客与视频&#xff1a; Vision Transformer 超详细解读 (原理分析代码解读) …

2024年了,Covid19怎么发?PANoptosis程序性死亡,抓紧上车!

说在前面 大家众所周知的新冠&#xff0c;其实早在19年末&#xff0c;20年初的时候很多人都抓住了这个热点发到了好文章&#xff0c;Covid-19&#xff0c;这玩意可以做到让一个期刊从2分飙升到20分&#xff0c;且非预警期刊&#xff0c;不过现在退火了&#xff0c;今年是12.7分…

数据结构(十四)----排序算法(1)

目录 一.排序的基本概念 二.插入排序 1.直接插入排序 2.折半插入排序 三.希尔排序&#xff08;Shell Sort&#xff09; 四.交换排序 1.冒泡排序 2.快速排序 快速排序算法的效率&#xff1a; 快速排序算法的稳定性&#xff1a; 这一篇博客的重点主要是快速排序&#x…

2024小红书电商实战营,养号打造IP/选爆品/开店铺/爆款笔记/等等(24节)

我们非常荣幸地为大家带来2024小红书电商实战营的第一期&#xff0c;在这里我们将带领大家一起深入学习如何利用小红书平台&#xff0c;实现个人品牌的发展和商业利益的增长。 首先&#xff0c;我们将讨论养号的重要性以及如何打造个人品牌。无论是建立自己的受众群体还是提高…

微信小程序知识点归纳(一)

前言&#xff1a;适用于有一定基础的前端开发同学&#xff0c;完成从网页开发到小程序开发的知识转换。 先立框架&#xff0c;后砌墙壁 回顾&#xff1a;了解微信小程序开发流程-CSDN博客 初始页面结构&#xff0c;三部分pages、utils、配置&#xff0c;分别存放页面、工具类…

拜登的iCloud被黑了? | 安全事件19

NEWS YOU 亨特拜登的iCloud疑似被黑&#xff0c;事件已得到美国特勤局的关注&#xff08;cnBeta&#xff09; 美国特勤局表示&#xff0c;该局和其他联邦机构都知道亨特拜登&#xff08;第46任美国总统乔拜登的次子&#xff09;的iCloud账户疑似被黑&#xff0c;但不清楚他们…

【解决】Unity Build 应用程序运行即崩溃问题

开发平台&#xff1a;Unity 2021.3.7f1c1   一、问题描述 编辑器 Build 工程结束&#xff0c;但控制台 未显示 Build completed with a result of Succeeded [时间长度] 信息。该情况下打包流程正常&#xff0c;但应用程序包打开即崩溃。   二、问题测试记录 测试1&#xf…

try/except/else/finally块的作用。

在许多编程语言中&#xff0c;try/except/else/finally块是用来处理异常的重要结构&#xff0c;它们允许程序在遇到错误时以一种更为可控和预期的方式进行响应。以下是这些块的详细解释和作用&#xff1a; ### try 块 try块是用于包围可能引发异常的代码的区域。当执行流程进…

百面算法工程师 | 传统图像处理——OpenCV

本文给大家带来的百面算法工程师是传统图像处理的面试总结&#xff0c;文章内总结了常见的提问问题&#xff0c;旨在为广大学子模拟出更贴合实际的面试问答场景。在这篇文章中&#xff0c;我们将总结一些几何变换和图像平滑处理&#xff0c;并提供参考的回答及其理论基础&#…

携手生态伙伴破局产业发展,神州鲲泰驶入信创“深水区”

近年来&#xff0c;面对日趋复杂的竞争形势和日益升级的创新需求&#xff0c;信创产业发展进程不断提速。当下&#xff0c;政企、金融、运营商、能源行业在追求自身业务软硬件的多元化发展。与此同时&#xff0c;信创产业也在逐步向其它行业渗透&#xff0c;带动大信创的万亿级…

C++自定义日期类的精彩之旅(详解)

在学习了C的6个默认成员函数后&#xff0c;我们现在动手实现一个完整的日期类&#xff0c;来加强对这6个默认成员函数的认识。 这是日期类中所包含的成员函数和成员变量&#xff1a; 构造函数 // 函数&#xff1a;获取某年某月的天数 inline int GetMonthDay(int yea…

常见磁盘分区问题

给磁盘分区有几个主要的原因&#xff1a; 组织和管理数据&#xff1a;分区可以帮助用户更好地组织和管理数据。例如&#xff0c;你可以在一个分区上安装操作系统&#xff0c;而在另一个分区上存储个人文件。这样&#xff0c;即使操作系统崩溃或需要重新安装&#xff0c;你的个…

Docker 使用 Fedora 镜像

Fedora 在 Docker 中的使用也非常简单&#xff0c;直接使用命令 docker run -it fedora:latest bash 就可以 pull 到本地的容器中并且运行。 C:\Users\yhu>docker run -it fedora:latest bash Unable to find image fedora:latest locally latest: Pulling from library/fed…

【瑞萨RA6M3】2. UART 实验

https://blog.csdn.net/qq_35181236/article/details/132789258 使用 uart9 配置 打印 void hal_entry(void) {/* TODO: add your own code here */fsp_err_t err;uint8_t c;/* 配置串口 */err g_uart9.p_api->open(g_uart9.p_ctrl, g_uart9.p_cfg);while (1){g_uart9.…

HQChart实战教程72-美股盘前,盘中,盘后分时图

HQChart实战教程72-美股盘前,盘中,盘后分时图 美股交易时间段HQChart效果盘前盘中盘后全部HQChart插件地址实现步骤1. 股票代码增加2级后缀2. 创建交易时间段4. 重载分时图X轴刻度完整示例代码美股交易时间段 在美国东部时间上午9:30至下午4:00的正常交易时间之外,投资者可以…