LED基本控制
在蓝桥杯实训平台上LED并非直接接到I/O口
两种开发模式:
I/O扩展
存储器映射
引脚1和2接通,存储器映射模式
引脚2和3接通,I/O的开发模式
关键内容
138译码器
如下:138译码器的输出情况
573锁存器
如图,573锁存器的引脚分为三类
LE:控制引脚,LE=1打通;LE=0锁存(无论D端怎么变,Q端都不受影响 )
LED指示灯电路原理
为使LED亮起,则要使DQ两段打通,则要使LE=1
为使LE=1,则要使Y4C=0,则要使Y4=0,则要使138译码器输出100
通过移位操作,使LED依次点亮,依次熄灭
WR已经是0,如图为或非门(先或之后再取反输出)
引脚定义
蜂鸣器和继电器的基本控制
如图,N BUZZ和N RELAY 为0时,蜂鸣器和继电器分别开始工作
达林顿管,其中含有非门。
内部结构
非门
关键内容
初始化系统
之所以让P0=0x10 可以实现让P04输出低电平是因为
0x10=0001 0000 从右往左数就是第五个位置为1,而经过达林顿管就取反。
锁存器选择函数
选择Y4,Y5…
选择哪个锁存器,写入什么内容同时进行
通过特殊操作选择锁存器
共阳数码管的静态显示
com口是公共端
abcdef 是数码管每一段的段码
Y6控制公共端(位选)
Y7控制段码
共阳数码管所有阳极接在一起,要想让它发光,就要让该数码管的阴极接到低电平
com口必须要接高电平
关键内容
段码表(存放在code中)
位选段选
通过移位来改变数码管显示的位置
通过双重循环实现数码管显显示的位置和内容都变化
选中所有com口实现所有数码管都点亮
每做一个必须要延时一下,否则看不到结果
将Delay中多写了一个While,终于变慢了
发现闪的特别快,将Delay(60000)改成Delay(120000)没用,后来将Delay中多写了一个While,终于变慢了(原来只有一个while)
共阳数码管的动态显示
- 实现数码管各位显示不同内容
- 将数据的个位和十位分别显示到数码管上,进而拓展到三位整数、四位乃至浮点数的数码管显示
静态显示只能做到所有点亮的数码管都显示同一内容
关键内容
延时一小段,利用余辉效应使得肉眼看上去同时显示
在主函数中操作使月增加,超额时恢复1
Delay里也要执行扫描数码管函数Display_Dynamic
如果Delay(用于显示变化的月份)里什么都不做(空语句),动态显示便无法扫描无法显示
所以在Delay里也要执行扫描数码管函数Display_Dynamic
独立按键
stat_k 状态锁定:=0 时S7和S6均未按下
可以用于判断到底是S7按下还是S6按下
S7按下,stactic=1;
S6按下,stactic=0;
可以看到在S6按下时if else if 里并没有判断S7是否按下的选项,通过这样的方式实现按下S6时S7被锁定
Question: 看这个样子,明明是S7按下后,L1亮一下就熄灭,为什么实际是S7按下后L1一直亮,再按一下L1熄灭
Answer: if(stat_k0)是选择结构,选择完了之后跳出if(s70),而非继续执行else if(stat_k==1 )
idea
学完一节仔细分析这节最重要的内容,一个新的小技巧或者功能,模块化,这样一节一节连起来,就像珍珠串起了项链,而且以后再碰到类似的还可以把模块或者制作模块的思维拿出来用。
关键内容:
1. 使用static_k 实现按下S7后,S6不响应操作。
本质上是利用static记录键码,根据static的数值来判断各个按键的状态(有没有按下)
按键点灯的两种形式
-
按住按键灯一直亮,松手熄灭
-
按一下按键灯亮,再按一下熄灭
2.利用while实现按住按钮一直亮灯,松开熄灭
3.位声明
bug修复
矩阵键盘
1.
上方为独立按键,一端接地,一端接I/O
下方为矩阵键盘,两端都接I/O
(接通之后两端读到的电平相同)
2.扫描时每次只能扫描一行
关键内容
1. IAP单片机电路图有差异
P37——>P44
P36——>P42
2. 位定义
3. 扫描+返回键码+显示键码
中断
一般来说,51单片机有5个中断,分两个优先级
中断系统结构
中断号:一个中断号代表一个中断源
记住每一个中断源对应的中断号
中断服务函数编写规范
关键内容
1. 中断初始化函数
IT0 控制外部中断的触发方式(1下降沿触发)(按下S5触发外部中断)
EX0=1 (外部中断的中断使能打开)
EA=1 总中断打开
2.直接在中断服务函数中延时
3.定义一个外部中断标志
stat_int = 1;
当外部中断产生时,stat_int=1
做完之后记得清零
4.在外部执行延时
每次执行完一次working便查询一次LEDINT有没有中断产生,所以中断执行时L1刚好熄灭
这种写法使用于先完整完成一个任务再去执行中断
注意在中断服务函数中少做事情
Bug修复
发现按下S5L8不亮,即不产生中断,后来发现其实是忘了初始化。