【STC15单片机】初始化程序原理

简介: 【STC15单片机】初始化程序原理

其他单片机

单片机I/O口控制一个设备或者有跳线帽

蓝桥杯单片机开发板复杂之处

  • P0端口控制LED、数码管、蜂鸣器、继电器、步进电机、点阵屏、LCD1602、LCD12864
  • AVR、8255

LED、数码管、蜂鸣器、继电器的控制原理

整体控制框图

数电还没学,凑合记笔记

以P0控制8个LED为例,介绍下面的元件


74HC573   锁存器

839ed0db482508ad5eeaddcc7a70b1d9_21bb86e2b02f46b086db16bd18dc6fc6.png

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

8720e1ecf7763e06b18ff4e774234bee_5b32ef1bbf12494f9e5639e5ddedf4d4.png

Y4C给高电平1,就能用P0口控制8个LED

Y4C口由74HC02芯片(蓝桥杯单片机开发板U25))控制


74HC02    四路或非门

8dca3fa9a19f73e58bfebc2451f438ce_2daefb90304549ada49c1158568e75fb.png

5531fee50743c60c4fc18b5dc803b8dd_e48eddf4dbf7481084d5b485092963e2.png

上图中给Y4和WR都是低电平0,Y4C会输出高电平1,这样P0口就会控制LED

WRJ13跳线帽决定,接到上面俩排针,就是接地(IO标识)

接下面俩排针就是MM模式,等于接到P36/WR

实际应用是将跳线帽接到上面

dab2e4d3469c1c0042f429faebb97bbe_33d746723652401c8d7e8ff23224c97e.png

Y4由74HC138译码器控制,通过控制P25\P26\P27三个IO口来控制Y4的电平状态


74HC138   译码器

6928bec4fff8ed2caaea9846aaaf69d7_5a66619e9fe64bfd98c793d5ec523e51.png

三线控八线,节省单片机I/O口占用

参考51单片机的138译码器控制8位LED程序

image.png

138译码器真值表

28ed7d6e039004e7bbcda7531532b885_93a04e08fe084f3a95e3d2c313f11047.png

H = 高电平           L = 低电平

这个左侧CBA是啥呢 ?

看下15单片机原理图就知道了

6928bec4fff8ed2caaea9846aaaf69d7_5a66619e9fe64bfd98c793d5ec523e51.png

  • A = P25
  • B = P26
  • C = P27

我们通过给P25\P26\P27这三个I/O口赋值,实现输出8种状态

每个I/O都只有两种状态,非0即1,一共三个IO口,对应有2*2*2 = 8种状态

用0或1翻译一下上面的一部分真值表

cf22f377e1f5943899f860dbb74b2f3a_d6d660105ad0462e99115a3dbca35bbb.png

之前想让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,但是电流比较小,不足以驱动蜂鸣器鸣叫,可以加达林顿管增大电流,增强单片机的驱动能力

  • 单片机开发板使用达林顿管,取代了三极管
  1. STEPA\STEPB\STEPC\STEPD可以驱动步进电机
  2. N RELAY可以驱动继电器
  3. N MOTOR可以驱动直流电机
  4. N BUZZ可以驱动蜂鸣器

这个达林顿管有反相的作用,输入0输出1,输入1输出0

蜂鸣器控制

929bc5b8c1cf5805e036020d23deeda2_4e749cecc1484e46bea4e80e5739bea9.png

上面的引脚已经接VCC了,BUZZ引脚给0就导通了,给1蜂鸣器就关闭 不鸣叫

c4733f920dd5259f217f41811a7f87f0_9deb4aff125c480ab913aae87fdd71e3.png

蜂鸣器不鸣叫 ---> N BUZZ引脚输出1 ---> P06输入0,同时Y5C引脚给1

30a4db5646e45c91ac413b11a7ec5d4f_edf7156c9a634e24a7d126b1e5550768.png

看原理图,Y5和WR共同控制Y5C

并且Y5和WR同时为低电平0,Y5C才能输出高电平1

Y5又是138译码器控制的

P25 = 1; P26 = 0; P27 = 1;这样Y5输出0

这样配置就能用P06口控制蜂鸣器状态了


了解一点原理呢,剩下的会用代码就好咯

10469203fd40ee7761e37751e9b3426f_a0cb724ca05f45d19430d8d83cf14e5a.jpegba20ef138e5384938442370e5edd159e_78b8c3bf6aa9482892a2981aa53fedcd.gif

复制之前简单流水灯的程序测试

用这三句控制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有反相的作用

19bd3226973f044d128d425ce91dfdb1_5d601edb1f734328af3905023deaf897.jpeg

上电初始化---关闭蜂鸣器&关闭继电器

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. }


相关文章
|
2月前
|
存储 算法 编译器
如何优化单片机程序里面的C代码方法
如何优化单片机程序里面的C代码方法
22 0
|
8月前
|
数据处理 C语言
侃侃单片机的裸奔程序的框架
侃侃单片机的裸奔程序的框架
81 0
|
1天前
|
存储 芯片
【期末不挂科-单片机考前速过系列P11】(第十一章:15题速过串行口的工作原理和应用)经典例题盘点(带图解析)
【期末不挂科-单片机考前速过系列P11】(第十一章:15题速过串行口的工作原理和应用)经典例题盘点(带图解析)
【期末不挂科-单片机考前速过系列P10】(第十章:11题中断系统的工作原理及应用)经典例题盘点(带图解析)
【期末不挂科-单片机考前速过系列P10】(第十章:11题中断系统的工作原理及应用)经典例题盘点(带图解析)
|
1天前
|
C语言 C++
【期末不挂科-单片机考前速过系列P1】(第一章:27题搞定单片机&其工作原理)经典例题盘点【选择题&判断题&填空题】(带图解析)
【期末不挂科-单片机考前速过系列P1】(第一章:27题搞定单片机&其工作原理)经典例题盘点【选择题&判断题&填空题】(带图解析)
|
29天前
基于51单片机的简单交通灯程序
基于51单片机的简单交通灯程序
9 2
|
4月前
|
缓存 编译器 程序员
嵌入式开发环境Vscode开发STM32单片机程序
嵌入式开发环境Vscode开发STM32单片机程序
55 0
|
9月前
【单片机期中测试】9.定时器实现简单的秒表程序
【单片机期中测试】9.定时器实现简单的秒表程序
123 0
|
9月前
【单片机期中测试】1.简单的流水灯程序
【单片机期中测试】1.简单的流水灯程序
62 0
|
11月前
|
消息中间件 Windows
单片机程序构架
单片机程序构架