蓝桥杯单片机备战笔记
一、温度读取会影响ADC读取
可以延长他们的读取时间
二、 按键冲突问题
假如你使用了NE555,p34引脚会冲突,造成按键不灵敏
解决:把有关P34的检测改掉。把下面那一行注释掉就行。
三、条件判断问题
不能这样子判断:
正确判断:
四、在 switch 语句中,所有的 case 值必须是唯一的
也就是说case不能嵌套,不然会出现编译错误
五、数码管显示不全,后面几位没有数据或者乱码
显示器只有 1357,后面几位没有数据或者乱码
原因:extern u8 smg_buf[8] 少了u8
六、两个u8相减,造成回绕的问题
· 在 C 语言中,当两个无符号整数相减时,如果结果本应为负数,由于模运算(基于 u8 的 256 范围),结果会“回绕”。
· 举例:
- 如果 before_adc_value = 30,now_adc_value = 40,那么 30 - 40 = -10。作为 u8,这会回绕:-10 + 256 = 246。
- 如果 before_adc_value = 100,now_adc_value = 60,那么 100 - 60 = 40,这在 u8 范围内,不会回绕。
解决一:或者改为s32
解决二:
C 语言中的 &&(逻辑与)运算符具有短路求值的特性,这意味着:
- 条件 before_adc_value >= now_adc_value && (before_adc_value - now_adc_value) >= 50 是从左到右求值的。
- 如果左边的条件 before_adc_value >= now_adc_value 为假(即 before_adc_value < now_adc_value),整个表达式的结果直接为假,右边的 (before_adc_value - now_adc_value) >= 50 根本不会被执行。
七、按键出现重复跳过的问题
忘记加 cnt_key=0了
八、51硬件仿真出现断连的情况
原因:按键操作控制影响的P30和P31
把P30和P31置为一,不要影响到他
九、硬件仿真无法进入中断问题,运行正常
没有勾选硬件仿真
十、读取ds1302的时间为零
第二个是对的,第一个的参数是局部变量,传不到外面
十一、keil5突然编译输出框build output 不见了
十二、bit和sbit
Bit:定义: bit 是 C 语言中的一种数据类型,通常由特定编译器(如 Keil C51 或 SDCC)扩展支持,用于声明一个单比特变量。
sbit定义:sbit 是“special bit”的缩写,是特定编译器(如 Keil C51)提供的关键字,用于声明直接映射到硬件寄存器(如端口、控制位)的单比特变量。
十三、u8 i 和 int i 在for循环中引起的区别
在这个代码中,数码管不亮,而我把u8 i 改为int i数码管就显示正常了
原因:
在 for (i = 4; i >= 0; i--) 中:
- 初始时,i = 4。
- 每次循环,i-- 递减 1。
- 当 i 从 0 递减到 -1 时,由于 u8 和 u16 是无符号类型,-1 会回绕:
- 对于 u8,-1 回绕为 255。
- 对于 u16,-1 回绕为 65535。