其他单片机
单片机I/O口控制一个设备或者有跳线帽
蓝桥杯单片机开发板复杂之处
- P0端口控制LED、数码管、蜂鸣器、继电器、步进电机、点阵屏、LCD1602、LCD12864
- AVR、8255
LED、数码管、蜂鸣器、继电器的控制原理
整体控制框图
数电还没学,凑合记笔记
以P0控制8个LED为例,介绍下面的元件
74HC573 锁存器
OE:output_enable,输出使能;
LE:latch_enable,数据锁存使能,latch是锁存的意思;
Dn:第n路输入数据;
On:第n路输出数据;
再看这个真值表,意思如下:
第四行:当OE=1是,无论Dn、LE为何,输出端为高阻态;
第三行:当OE=0、LE=0时,输出端保持不变;
第二行第一行:当OE=0、LE=1时,输出端数据等于输入端数据;
结合下面的波形图,在实际应用的时候是这样做的:
a. OE=0;
b. 先将数据从单片机的口线上输出到Dn;
c. 再将LE从0->1->0
d. 这时,你所需要输出的数据就锁存在On上了,输入的数据在变化也影响不到输
出的数据了;实际上,单片机现在在忙着干别的事情,串行通信、扫描键盘……单
片机的资源有限啊。
74HC573(蓝桥杯单片机开发板U6)控制LED
Y4C给高电平1,就能用P0口控制8个LED
Y4C口由74HC02芯片(蓝桥杯单片机开发板U25))控制
74HC02 四路或非门
上图中给Y4和WR都是低电平0,Y4C会输出高电平1,这样P0口就会控制LED
WR由J13跳线帽决定,接到上面俩排针,就是接地(IO标识)
接下面俩排针就是MM模式,等于接到P36/WR
实际应用是将跳线帽接到上面
Y4由74HC138译码器控制,通过控制P25\P26\P27三个IO口来控制Y4的电平状态
74HC138 译码器
三线控八线,节省单片机I/O口占用
参考51单片机的138译码器控制8位LED程序
138译码器真值表
H = 高电平 L = 低电平
这个左侧CBA是啥呢 ?
看下15单片机原理图就知道了
- A = P25
- B = P26
- C = P27
我们通过给P25\P26\P27这三个I/O口赋值,实现输出8种状态
每个I/O都只有两种状态,非0即1,一共三个IO口,对应有2*2*2 = 8种状态
用0或1翻译一下上面的一部分真值表
之前想让Y4的电平状态置低,就需要给对应IO口赋值了,查阅上表可知
- A = P25 = 0
- B = P26 = 0
- C = P27 = 1
138译码器右边Y0...Y7每一种状态只有一个引脚输出0,所以能实现每次只打开一个锁存器
简单来说就是控制LED时不能控制数码管,控制数码管时,不能控制LED
15单片机开发板就是这么设计的(牛的牛的),就得这么用呀
ULN2003 7路达林顿管
ULN2003是一个单片高电压、高电流的达林顿晶体管阵列集成电路。它是由7对NPN达林顿管组成的,它的高电压输出特性和阴极箝位二极管可以转换感应负载。单个达林顿对的集电极电流是500mA。达林顿管并联可以承受更大的电流。此电路主要应用于继电器驱动器,字锤驱动器,灯驱动器,显示驱动器(LED气体放电),线路驱动器和逻辑缓冲器。ULN2003的每对达林顿管都有一个2.7kΩ串联电阻,可以直接和TTL或5V CMOS装置。
单片机通过74HC573芯片控制引脚,输出5V,但是电流比较小,不足以驱动蜂鸣器鸣叫,可以加达林顿管增大电流,增强单片机的驱动能力
- 单片机开发板使用达林顿管,取代了三极管
- STEPA\STEPB\STEPC\STEPD可以驱动步进电机
- N RELAY可以驱动继电器
- N MOTOR可以驱动直流电机
- N BUZZ可以驱动蜂鸣器
这个达林顿管有反相的作用,输入0输出1,输入1输出0
蜂鸣器控制
上面的引脚已经接VCC了,BUZZ引脚给0就导通了,给1蜂鸣器就关闭 不鸣叫
蜂鸣器不鸣叫 ---> N BUZZ引脚输出1 ---> P06输入0,同时Y5C引脚给1
看原理图,Y5和WR共同控制Y5C
并且Y5和WR同时为低电平0,Y5C才能输出高电平1
Y5又是138译码器控制的
P25 = 1; P26 = 0; P27 = 1;这样Y5输出0
这样配置就能用P06口控制蜂鸣器状态了
了解一点原理呢,剩下的会用代码就好咯
复制之前简单流水灯的程序测试
用这三句控制LED
P25 = 0; P26 = 0; P27 = 1;
1. #include <STC15F2K60S2.H> 2. 3. long a; 4. 5. void main() 6. { 7. // P2 = 0xA0; P0 = 0x00; P2 = 0x80; P0 = 0xFF;//初始化,防止蜂鸣器乱叫 8. P25 = 0; P26 = 0; P27 = 1; //控制LED 9. 10. while(1) 11. { 12. P00 = 0; P01 = 1; P02 = 1; P03 = 1; 13. for (a = 80000; a > 0; a --); 14. P00 = 1; P01 = 0; P02 = 1; P03 = 1; 15. for (a = 80000; a > 0; a --); 16. P00 = 1; P01 = 1; P02 = 0; P03 = 1; 17. for (a = 80000; a > 0; a --); 18. P00 = 1; P01 = 1; P02 = 1; P03 = 0; 19. for (a = 80000; a > 0; a --); 20. } 21. }
LED 效果与之前效果一致,因为我们没有将蜂鸣器关闭,它会一直鸣叫
改成控制蜂鸣器的程序
1. #include <STC15F2K60S2.H> 2. 3. long a; 4. 5. void main() 6. { 7. // P2 = 0xA0; P0 = 0x00; P2 = 0x80; P0 = 0xFF;//初始化,防止蜂鸣器乱叫 8. // P25 = 0; P26 = 0; P27 = 1; //控制LED 9. P25 = 1; P26 = 0; P27 = 1; //控制蜂鸣器 10. while(1) 11. { 12. P06 = 1; //on 13. for (a = 80000; a > 0; a --); 14. P06 = 0; //off 15. for (a = 80000; a > 0; a --); 16. for (a = 80000; a > 0; a --); 17. for (a = 80000; a > 0; a --); 18. } 19. }
由实验效果可以验证给P06 = 0是关闭蜂鸣器
P06低电平的信号经过达林顿管处理输出高电平,使蜂鸣器关闭。可以验证达ULN2003有反相的作用
上电初始化---关闭蜂鸣器&关闭继电器
1. #include <STC15F2K60S2.H> 2. 3. void main() 4. { 5. P25 = 1; P26 = 0; P27 = 1; 6. P06 = 0; //off关闭蜂鸣器 7. P04 = 0; //关闭继电器 8. while(1) 9. { 10. } 11. }
烧录程序可以看到继电器右侧的LED灭了,代表继电器关闭
简化关闭蜂鸣器继电器的初始化代码
一位一位的赋值操作比较繁琐,用整个端口赋值来代替
1. #include <STC15F2K60S2.H> 2. 3. void main() 4. { 5. P2 = 0xA0; P0 = 0x00; 6. while(1) 7. { 8. } 9. }
15单片机初始化程序
1. #include <STC15F2K60S2.H> 2. 3. //关闭 蜂鸣器继电器LED数码管 4. void All_Init(void) 5. { 6. P2 = 0xA0; // 1010 0000 7. P0 = 0x00; //off蜂鸣器继电器 8. 9. P2 = 0x80; // 1000 0000 10. P0 = 0xFF; //offLED 11. 12. P2 = 0xC0; //使能锁存器U8 1100 0000 13. P0 = 0xFF; //选择所有数码管 14. P2 = 0xFF; //使能锁存器U7 1111 1111 15. P0 = 0xFF; //关闭所有数码管 16. } 17. 18. void main() 19. { 20. All_Init(); 21. 22. while(1) 23. { 24. } 25. }