第十届 蓝桥杯 单片机设计与开发项目 省赛

第十届 蓝桥杯 单片机设计与开发项目 省赛

在这里插入图片描述
在这里插入图片描述

输入:

  • 频率信号输入
  • 模拟电压输入

输出(包含各种显示功能):

  • LED显示
  • SEG显示
  • DAC输出

01 数码管显示问题:数据类型

bit Seg_Disp_Mode;//0-频率显示界面 1-电压显示界面
unsigned char Freq = 6000;
/* 键盘处理函数 */
void Key_Proc()
{if(Key_Slow_Down) return;Key_Slow_Down = 1;//键盘减速程序Key_Val = Key_Read();//实时读取键码值Key_Down = Key_Val & (Key_Old ^ Key_Val);//捕捉按键下降沿Key_Up = ~Key_Val & (Key_Old ^ Key_Val);//捕捉按键上降沿Key_Old = Key_Val;//辅助扫描变量}/* 信息处理函数 */
void Seg_Proc()
{if(Seg_Slow_Down) return;Seg_Slow_Down = 1;//数码管减速程序if(Seg_Disp_Mode == 0){Seg_Buf[0] = 11;Seg_Buf[2] = Freq/100000;Seg_Buf[3] = Freq/10000%10;Seg_Buf[4] = Freq/1000%10;Seg_Buf[5] = Freq/100%10;Seg_Buf[6] = Freq/10%10;Seg_Buf[7] = Freq%10;}else{Seg_Buf[0] = 12;}}

这段程序里犯了一个错误:
只要是变量可能大于255的均需要用unsigned int数据类型来声明变量,否则会出现截断现象。
因此此处的unsigned char Freq = 6000;应该修改为unsigned int Freq = 6000;

02 Da_Write()和Ad_Read()

  • Ad_Read()
/* 信息处理函数 */
void Seg_Proc()
{unsigned char i = 2;if(Seg_Slow_Down) return;Seg_Slow_Down = 1;//数码管减速程序Voltage = Ad_Read(0x43)/51.0;if(Output_Mode == 0)Voltage_Output = 2;elseVoltage_Output = Voltage;if(Seg_Mode == 0){Seg_Point[5] = !Seg_Disp_Mode;if(Seg_Disp_Mode == 1){Seg_Buf[0] = 11;Seg_Buf[2] = Freq/100000;Seg_Buf[3] = Freq/10000%10;Seg_Buf[4] = Freq/1000%10;Seg_Buf[5] = Freq/100%10;Seg_Buf[6] = Freq/10%10;Seg_Buf[7] = Freq%10;while(Seg_Buf[i] == 0){Seg_Buf[i] = 10;if(++i == 7) break;}}else{Seg_Buf[0] = 12;//熄灭上一个界面Seg_Buf[2] = 10;Seg_Buf[3] = 10;Seg_Buf[4] = 10;Seg_Buf[5] = (unsigned char)Voltage_Output;Seg_Buf[6] = (unsigned int)(Voltage_Output*100)/10%10;//*100可能会大于255,不转换成int型可能会溢出。Seg_Buf[7] = (unsigned int)(Voltage_Output*100)%10;}}else{Seg_Buf[0] = 10;Seg_Buf[1] = 10;Seg_Buf[2] = 10;Seg_Buf[3] = 10;Seg_Buf[4] = 10;Seg_Buf[5] = 10;Seg_Buf[6] = 10;Seg_Buf[7] = 10;Seg_Point[5] = 0;}}
Voltage = Ad_Read(0x43)/51.0;

Ad_Read() 这个函数用来读取实时电压值,在信息处理函数中调用获取。
函数原型如下:

unsigned char Ad_Read(unsigned char addr)
{unsigned char temp;IIC_Start();IIC_SendByte(0x90);IIC_WaitAck();IIC_SendByte(addr);IIC_WaitAck();IIC_Start();IIC_SendByte(0x91);IIC_WaitAck();	temp = IIC_RecByte();IIC_SendAck(1);IIC_Stop();return temp;
}

在蓝桥杯里addr是不0x40就是0x43,可以试一下,判断哪个是Rb2哪个是Rb4;
这个函数的输出在0-255区间内,要将其转换到0-5v区间内,需要讲输出再/51

  • Da_Write()

使用 PCF8591 测量电位器 RB2 的输出电压,并根据试题要求通过其 DAC 功 能输出该电压值。

这个可以再其他显示函数中完成输出

/* 其他显示函数 */
void Led_Proc()
{Da_Write(Voltage_Output*51);if(Led_Mode == 0){ucLed[0] = !Seg_Disp_Mode;ucLed[1] = Seg_Disp_Mode;ucLed[4] = Output_Mode;//LED3if(Voltage<1.5||(Voltage>=2.5&&Voltage<3.5)){ucLed[2] = 0;}else{ucLed[2] = 1;}//LED4if(Freq<1000||(Freq>=5000&&Freq<100000)){ucLed[3] = 0;}else{ucLed[3] = 1;}}else{ucLed[0] = ucLed[1]=ucLed[2]=ucLed[3]=ucLed[4]=ucLed[5]=ucLed[6]=ucLed[7] = 0;}	
}
	Da_Write(Voltage_Output*51);

需要注意的就是需要将Voltage_Output*51将其转换到0-255区间内。

03 频率信号的读取

在定时器1的中断服务函数中进行:

//定时器1用于中断服务,定时器0用于计数/* 定时器0中断初始化函数 这里要改成计数的模式:中断不需要打开,不需要自动重装载*/
void Timer0Init(void)		//0毫秒@12.000MHz
{AUXR &= 0x7F;		//定时器时钟12T模式TMOD &= 0xF0;		//设置定时器模式TMOD |= 0x05;//一定要记住NE555的底层在计数器初始化的时候一定要加上这句话TL0 = 0x00;		//设置定时初值TH0 = 0x00;		//设置定时初值TF0 = 0;		//清除TF0标志TR0 = 1;		//定时器0开始计时
}/* 定时器1中断服务函数 */
void Timer1Server() interrupt 3
{  if(++Key_Slow_Down == 10) Key_Slow_Down = 0;//键盘减速专用if(++Seg_Slow_Down == 500) Seg_Slow_Down = 0;//数码管减速专用if(++Uart_Slow_Down == 200) Uart_Slow_Down = 0;//串口减速专用if(++Seg_Pos == 8) Seg_Pos = 0;//数码管显示专用Seg_Disp(Seg_Pos,Seg_Buf[Seg_Pos],Seg_Point[Seg_Pos]);Led_Disp(Seg_Pos,ucLed[Seg_Pos]);if(++Timer_1000Ms == 1000)//定时器1用来定时1s{Timer_1000Ms = 0;Freq = TH0 << 8 | TL0;TH0 = 0;TL0 = 0;}
}/* 定时器1中断初始化函数 */
void Timer1Init(void)		//1毫秒@12.000MHz
{AUXR &= 0xBF;		//定时器时钟12T模式TMOD &= 0x0F;		//设置定时器模式TL1 = 0x18;		//设置定时初值TH1 = 0xFC;		//设置定时初值TF1 = 0;		//清除TF1标志TR1 = 1;		//定时器1开始计时ET1 = 1;EA = 1;
}

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

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

相关文章

安卓玩机工具推荐----MTK 高通芯片机型 免权限刷机 备份基带 去除锁类工具操作步骤解析

今天为友友解析一款手机维修的工具_PL&#xff0c;它可以刷写高通芯片 mtk芯片固件。可以备份mtk基带分区和恢复基带分区。带mtk刷写免权限。可以去除一些机型的用户锁【例如用户忘记手机锁屏密码类】以及去除机型的FRP锁等等 工具对于私人用户遇到一些手机故障 例如忘记密码锁…

预印本仓库ArXiv——防止论文录用前被别人剽窃

文章目录 一、什么是预印本二、什么是ArXiv2.1 ArXiv的领域2.2 如何使用 一、什么是预印本 预印本&#xff08;Preprint&#xff09;是指科研工作者的研究成果还未在正式出版物上发表&#xff0c;而出于和同行交流目的自愿先在学术会议上或通过互联网发布的科研论文、科技报告…

云卓LS-01喊话器说明书-新版中文

一: 概述 LS-01 无人机喊话器适用于搭载无人机进行交通管制、现场指挥、应急救援、人群疏导、防疫宣传、景区安防、鱼塘巡视、林业防控等场景。产品具有喊话、警报、播放多媒体文件等多种功能。喊话器外壳采用尼龙加纤材质&#xff0c;具有抗、抗震、轻便灵活、外观新颖、质量稳…

【深入理解Java IO流0x0A】NIO实战-网络聊天室

本篇博客将进行NIO编程实战&#xff0c;实现一个简单聊天室。 我们来通过 SocketChannel 和 ServerSocketChannel 实现一个 0.1 版的聊天室&#xff0c;先说一下需求&#xff0c;比较简单&#xff0c;服务端启动监听客户端请求&#xff0c;当客户端向服务器端发送信息后&#x…

Stable Diffusion之文生图模型训练

1、数据准备 提前准备好一组相关的照片。 在线的图片处理网站 BIRME - Bulk Image Resizing Made Easy 2.0 (Online & Free) 将图片转成统一大小&#xff0c;支持批量处理&#xff0c;效率高 2、生成提示词 进入stable diffusion webui页面 旧版直接使用 train/proproc…

SSH安全设置

今天发现自己的公有云服务器被攻击了 然后查看了登录日志&#xff0c;如上图 ls -sh /var/log/secure vim /var/log/secure然后增加了安全相关的设置 具体可以从以下方面增加安全性&#xff1a; 修改默认SSH端口公有云修改安全组策略及防火墙端口设置登录失败次数锁定用户及限…

简单工厂模式设计实验

实验内容&#xff1a; 楚锋软件公司欲基于Java 语言开发一套图表库&#xff0c;该图表库可以为应用系统提供各种不同外观的图表&#xff0c;例如柱状图、饼状图、折线图等。楚锋软件公司图表库设计人员希望为应用系统开发人员提供一套灵活易用的图表库&#xff0c;而且可以较为…

【Linux学习】初识Linux指令(二)

文章标题 1.rm 指令2.man指令3.nano指令4.cp指令5.mv指令6.alias指令7. cat与8.echo指令 ⚶文章简介 ⚶本篇文章继上篇文章Linux指令讲解&#xff0c;本篇文章主要会涉及到的指令会有&#xff1a;rm指令与 *&#xff08;通配符&#xff09;的搭配使用&#xff0c;man指令&…

找出mongodb的jumbo块并进行分裂

https://www.cnblogs.com/abclife/p/15968628.html 根据这篇文档中的脚本&#xff0c;在我们自己的环境中跑了下&#xff0c;第一次跑的结果如下&#xff1a; 运行完上面跑出的split脚本后&#xff0c;还是存在jumbo块&#xff0c;第二次跑出的结果&#xff1a; 从上面结果可以…

深入探索:Zookeeper+消息队列(kafka)集群

目录 前言 一、Zookeeper概述 1、Zookeeper概念 2、Zookeeper 特点 3、Zookeeper工作机制 4、Zookeeper 选举机制 4.1 第一次启动选举机制 4.2 非第一次启动选举机制 5、Zookeeper 数据结构 6、Zookeeper 应用场景 二、部署 Zookeeper 集群 1、环境部署 2、安装 z…

【HTML】简单制作一个动态变色光束花

目录 前言 开始 HTML部分 效果图 ​编辑​编辑​编辑​编辑总结 前言 无需多言&#xff0c;本文将详细介绍一段代码&#xff0c;具体内容如下&#xff1a; 开始 首先新建文件夹&#xff0c;创建一个文本文档&#xff0c;其中HTML的文件名改为[index.html]&a…

比特币突然暴跌

作者&#xff1a;秦晋 周末愉快。 今天给大家分享两则比特币新闻&#xff0c;也是两个数据。一则是因为中东地缘政治升温&#xff0c;传统资本市场的风险情绪蔓延至加密市场&#xff0c;引发加密市场暴跌。比特币跌至66000美元下方。杠杆清算金额高达8.5亿美元。 二则是&#x…

交流电子负载解决方案

交流电子负载是一种可以模拟真实负载的设备&#xff0c;它可以接收交流电源输入&#xff0c;并以一定的电流和电压进行输出。这种设备在电力系统、电子设备研发、生产和质量控制等多个领域都有广泛的应用。以下是一些关于交流电子负载解决方案的建议。 选择合适的设备&#xff…

锁策略总结

锁策略 悲观锁和乐观锁 乐观锁和悲观锁不是具体类型的锁而是指两种不同的对待加锁的态度&#xff0c;这两个锁面对锁冲突的态度是相反的。 乐观锁&#xff1a;认为不存在很多的并发操作&#xff0c;因此不需要加锁。悲观锁&#xff1a;认为存在很多并发操作&#xff0c;因此需…

FPGA - 以太网UDP通信(二)

一&#xff0c;引言 前文链接&#xff1a;FPGA - 以太网UDP通信&#xff08;一&#xff09; 在上文章中介绍了以太网简介&#xff0c;以太网UDP通信硬件结构&#xff0c;以及PHY芯片RGMII接口-GMII接口转换逻辑&#xff0c;接下来介绍UDP通信结构框图以及数据链路层&#xff…

【详细讲解下Photoshop】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

MySQL练习题

有三个表&#xff0c;表S&#xff08;学生表&#xff09;&#xff0c;C&#xff08;课程表&#xff09;&#xff0c;SSC&#xff08;学生选课表&#xff09; S&#xff08;SNO&#xff0c;SNAME&#xff09;代表&#xff08;学号&#xff0c;姓名&#xff09; C&#xf…

[MySQL]数据库原理8——喵喵期末不挂科

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;大大会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…

NVM的安装与配置

目录 一、简介二、下载2.1、windows环境下载地址2.2、安装 三、配置3.1、查看可安装版本3.2、安装版本3.3、使用和切换版本3.4、模块配置 四、其他4.1、全局安装pnpm4.2、常用nvm命令 一、简介 NVM&#xff0c;全称为Node Version Manager&#xff0c;是一个流行的命令行工具&a…

k8s控制器(五)_____DaemonSet

DaemonSet控制器 DaemonSet控制器是Kubernetes中的一种控制器&#xff0c;用于确保集群中的每个节点都运行一个Pod的副本。它通常用于在整个集群中部署一些系统级别的服务&#xff1a; 在每一个node节点运行一个存储服务&#xff0c;例如gluster&#xff0c;ceph。在每一个no…