目录
1、M74HC573M1R锁存器基本介绍
跟其他开发板不同的,这块开发板控制数码管、LED、蜂鸣器和继电器的是锁存器和P0。所以在学习之前我们先介绍一下锁存器相关的概念。
1.1、RS锁存器(RS latch)
真值表:
R(赋零) | S(置) | Q | 解释 |
---|---|---|---|
0 | 0 | Q | 保持 |
0 | 1 | 1 | |
1 | 0 | 0 | |
1 | 1 | X | 不允许这种情况 |
1.2、D锁存器(D latch)
原理图:
EN= 0时,输出状态保持不变。(锁住)
EN =1时,输出随输入状态而改变。当D=0,Q=0,当D=1,Q=1 。
1.3、M74HC573M1R
74HC573的八个锁存器都是透明的D型锁存器.当使能 (LE)为高 时,Q输出将 随数据(D)输入而变。当使能 (LE)为低时,输出将锁存在已建立的数据电平上。
74hc573的OE引脚在使用时 通常与GND连接在一起,通过LE来选择锁存器的锁存与使用状态。
1.4、应用(以LED灯为例)
原理图:
LE
决定是否能透过去改变灯亮灭的状态,即Y4C
决定(1透0不透)所以这里我们提出疑问Y4C如何控制 ?
Y4控制Y4C
内部逻辑图:
WR
通过这个跳线帽默认相当于接地,再通过一个或非门对于Y4C
没有影响
所以Y4C
由Y4
控制 ,它们两个是相反的关系。那么Y4
又如何控制呢?
74HC138译码器控制Y4
被选中的Y为0其他的都为1。
总结:Y4C
由Y4
控制并且相反所以Y4C
被选中时为1,即可以透过相应的锁存器改变值,没选选中的就被锁存器锁住,不能改变相应的值。可以得出结论可以通过P25
P26
P27
选择相应的锁存器工作状态。
1.5、锁存器操作总结
这张表需要背下来:
功能 | Y | P27 | P26 | P25 | 对应十六进制值 |
---|---|---|---|---|---|
LED | Y4 | 1 | 0 | 0 | 0X80 |
数码管-位选 | Y6 | 1 | 1 | 0 | 0XC0 |
数码管-段选 | Y7 | 1 | 1 | 1 | 0XE0 |
外设(继电器、蜂鸣器) | Y5 | 1 | 0 | 1 | 0XA0 |
关闭 | 0 | 0 | 0 | 0X00 |
1.6、 锁存器打开关闭代码
在蓝桥杯单片机实训板上操作上述4个外设必须满足两个条件:
- 锁存器选通控制某个外设的通道
- P0被赋予相应的值。
操作顺序:对P0赋值->打开锁存器->关闭锁存器
方法一:
P0=0XFF; //关闭所有LED灯
P2=0X80; //打开锁存器控制LED灯
P2=0; //关闭锁存器
方法二(严谨写法):
P0=0xFF; //准备的数据
P2=P2 & 0x1F | 0x80;//选择的锁存器
/*
解释:&0x1F : & 0001 1111 将前三位清0其他未不变
(&有0为0常用来位清零 需要清零位为0其他不变位为1)
|0x80 : | 1000 0000 将第一位置1其他未不变
(1有1为1常用来位置1 需要置1位为1其他不变位为0)
*/
P2 &= 0x1F; //关闭锁存器
2、LED灯
2.1、LED灯怎么才能发光?
满足如图所示阳极为1
阴极为0
即可(具体原理可以百度搜索)
而开发板上的LED是共阳极,所以对应IO口为低电平时候LED灯才能点亮。
2.2、LED灯操作封装成函数
led显示函数
void Led_Disp(unsigned char ucLed)
{
P0 = (~ucLed);
P2 = P2 & 0X1F | 0x80;//led
P2 &= 0X1F;
}
led处理函数
void Led_Proc(void)
{
if(Led_Slow_Down) return;
Led_Slow_Down = 1;
//具体实现逻辑
}
//定时器中加入
Led_Disp(ucLed);//用于LED显示
2.3、LED灯操作练习
习题:对于LED灯L1~L8
起始让奇数灯点亮偶数灯熄灭,1s后奇数灯熄灭偶数灯点亮。
#include <STC15F2K60S2.H>
void Delayms(int ms) //@12.000MHz
{
unsigned char i, j;
while(ms--)
{
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
}
void main()
{
//关闭LED,蜂鸣器,继电器
P0=0xff;
P2=0x80;
P2=0x00;
P0=0x00;
P2=0xa0;
P2=0x00;
while(1)
{
P00=0;
P01=1;
P02=0;
P03=1;
P04=0;
P05=1;
P06=0;
P07=1;
P2=0x80;
P2=0x00;
Delayms(1000);
P00=1;
P01=0;
P02=1;
P03=0;
P04=1;
P05=0;
P06=1;
P07=0;
P2=0x80;
P2=0x00;
Delayms(1000);
}
}
3、蜂鸣器
3.1、蜂鸣器怎么才能发声?
3.2、蜂鸣器操作练习
习题:让蜂鸣器每隔1s响一次。
#include <STC15F2K60S2.H>
void Delayms(int ms) //@12.000MHz
{
unsigned char i, j;
while(ms--)
{
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
}
void main()
{
//关闭LED,蜂鸣器,继电器
P0=0xff;
P2=0x80;
P2=0x00;
P0=0x00;
P2=0xa0;
P2=0x00;
while(1)
{
P06=1;
P2=0xa0;
P2=0x00;
Delayms(1000);
P06=0;
P2=0xa0;
P2=0x00;
Delayms(1000);
}
}
4、继电器
4.1、继电器如何使L10点亮?
4.1、继电器操作练习
习题:继电器吸合一秒后关闭一直循环下去
#include <STC15F2K60S2.H>
void Delayms(int ms) //@12.000MHz
{
unsigned char i, j;
while(ms--)
{
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
}
void main()
{
//关闭LED,蜂鸣器,继电器
P0=0xff;
P2=0x80;
P2=0x00;
P0=0x00;
P2=0xa0;
P2=0x00;
while(1)
{
P04=1;
P2=0xa0;
P2=0x00;
Delayms(1000);
P04=0;
P2=0xa0;
P2=0x00;
Delayms(1000);
}
}
附:常用模板(一)
主函数
void main()
{
//关闭外设
P0=0xff;
P2=0x80;
P2=0x00;
P0=0x00;
P2=0xa0;
P2=0x00;
while(1)
{
}
}
delay
void Delayms(int ms) //@12.000MHz
{
unsigned char i, j;
while(ms--)
{
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
}
注释模板(考试用不上,但以后写工程养成好习惯)
/**
* @brief 这里写简介
* @param 输入参数
* @retval 返回值
*/
常用简短定义
typedef unsigned char uchar;
typedef unsigned int uint;