● 改编自国信长天蓝桥杯官方蓝皮书例程,按照自己的习惯进行了补充和修改
蓝桥杯单片机第十届省赛-电压频率测量装置
2021.3.31
第十届省赛例程在官方蓝皮书上也有,由于模板用的就是官方的,也就没有粘贴一大段代码的必要性了。仅记录刷题过程中的感悟,和对比官方给出的第十届代码后自己写的代码的不足。
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型都不行。