蓝桥杯单片机第十届省赛-电压频率测量装置

九层妖塔 起于垒土

在这里插入图片描述


改编自国信长天蓝桥杯官方蓝皮书例程,按照自己的习惯进行了补充和修改


2021.3.31
在这里插入图片描述
 第十届省赛例程在官方蓝皮书上也有,由于模板用的就是官方的,也就没有粘贴一大段代码的必要性了。仅记录刷题过程中的感悟,和对比官方给出的第十届代码后自己写的代码的不足。

源码题目0积分下载

Notes1:NE555频率测量基本模板更新

 完全改用官方例程。
 👉NE555定时器&频率测量


Notes2:程序结构优化:看到某一功能后,能够知道该在程序的哪一部分实现

 在写第十届LED的指示功能时候,出现了BUG,发现指示功能的led之间相互干扰。比如按照题意要求按下S6禁用或开启LED指示功能,实际上并不能完全实现。原因归结如下:led的控制代码分散到了各个部分,按下按键后,led对按键的响应并不是一起执行的。

改进:如果题目对LED的功能要求不强,比如只使用一两个led亮灭,可以将led的控制代码分散到按键或者其他部分。
 如果对led指示功能要求较多,建议使用LED_Proc() 函数统一一块处理led。其他部分通过操作全局变量uc_led传递led状态值====,在LED_Proc() 函数统一处理全局变量uc_led,====。


Notes3:只有0和1两种值的状态变量State的状态转换

 先写下官方例程的写法:
 定义的状态值是无符号整形,初始值为0。代表一个状态。
 进行反转时,是与1进行异或: 0000 0000 ^ 0000 0001 = 1111 1110; 1111 1110 ^ 0000 0001 = 0000 00000 即State的两个状态分别是状态一0000 00000和状态二1111 1110
 判断时,应该判断State是否为0,即,是否为False

uchar uc_State;     //全局变量默认为0

//反转写法
if(……)
{
  uc_State ^= 1;
}

//判断
if(uc_State)
{
 ……
}
else
{

}

//或
if(!uc_State)
{
 ……
}

 一般情况下只有两个值0和1的情况一般定义为bit型变量。bit型变量进行异或时只会在0和1两个状态间进行反转。同样适用于if判断。但却无法使用switch进行选择。使用switch进行选择bit型变量时会报错,如下:
switch expression has illegal type
switch表达式具有非法类型

switch 语句 switch(表达式) { } 这个表达式如果是个bit变量,编译将出现"switch expression has illegal type"错误

终究还是c语言基础不过关,查证《C Primer Plus》
switch在圆括号中的测试表达式的值应该是一个整数值(包括char类型),case标签必须是整数类型(包括char类型)的常量或者整型常量表达式。浮点数,bit型都不行。

  
  
  
  
彩 蛋

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

#法外狂徒张三

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值