此篇文章的优点:原理解释,记忆方法,代码简单易用但功能完整
蓝桥杯此款单片机对LED,蜂鸣器,数码管位选,数码管段选,锁存器关闭的控制过程:是由74LS138(38译码器)通过控制74hc02(或非门)进而控制M74HC573M1R(八位锁存器芯片)形成的。
1.对38译码器及其电路的解释:在单片机中的74ls138译码器的电路如图1.1所示;74ls138译码器的真值表如表1.1所示。可以大致看一下以下的两图后再进行阅读。(补充:图1.1中A输入对应表1.1中的A0;)
图1.1
表1.1
对以上图表的解释:由io口P25,P26,P27控制三个输入引脚,这三个io口一共有8(2的3次方)种不同的输入的选择,这八种不同的输入对应输出端的八种不同输出,每种输出情况下只有八个输出引脚中只有一个有效(高电平)。综上所述即可根据需要给三个输入引脚不同的电平,来从输出端八中选一个有效端口设为高电平。(实质:用三条线控制8条线)
2.74hc02为或非门,其逻辑可简述为输入有1输出就为0。其应用的原理图如图1.2所示。假设在74ls138中选择的输出Y4为高电平有效(Y4有效时给的的输入为P27=1;P26=0;P25=0;),则输出Y4C的电平为低电平0。
图1.2
3.M74HC573M1R(八位锁存器芯片)
在此简述其逻辑功能:
①当LE引脚为低电平时,左端的Dn的输入状态可以同步到右端的Qn的输出引脚(可以理解为Dn与Qn是直接连通的)。
②当LE引脚由低电平变为高电平时,此时刻左端的Dn的输入状态即为以后LE保持低电平时右端的Qn的输出引脚的转态(可以理解为当LE由低变高时,锁存器对输出状态进行了锁存,锁存的输出状态与LE电平改变时的输入状态相同)。
③当LE引脚为高电平时,右端的Qn的输出引脚的状态与输入无关(可以理解为Dn与Qn是断开的)。
在理解其逻辑功能后,不难理解当Y4C为低电平时即可通过P0口来控制LED的亮灭。
(重点)以LED为例解释其控制过程:
① 要想控制LED,即要M74HC573M1R的控制引脚Y4C为低电平;
②Y4C为低电平,即74hc02或非门的输入Y4为高电平;
③Y4为高电平,即74ls138的有效输出为Y4=1的情况;
④要想Y4=1,即74ls138的输入为P27=1;P26=0;P25=0;综合到P2口就为P2=0x80;
⑤当P2=0x80时就可以通过P0口控制LED的亮灭。
以下为代码部分:
//此处的代码作用是led_c=0;buzzer_c=1;利用枚举类型,变量的值依次+1进行赋值
//优点:用语言代替数字有利于记忆,方便调用。
typedef enum //枚举类型变量
{
led_c = 0, //led灯控制 使能
buzzer_c, //蜂鸣器控制 使能
wei_c, //数码管位选控制 使能
duan_c, //数码管段选控制 使能
off_c, //锁存器关闭
}channel;
//此函数的作用是通过参数channel值的不同打开不同的锁存器来进行赋值
//channel的参数选择都在上面的枚举类型定义过
//channel的参数 led_c ,buzzer_c,wei_c,duan_c,off_c,
void Select38 (unsigned char channel)
{
switch(channel)
{
case led_c:
P2=(P2&0x1f)|0x80;//led
break;
case buzzer_c:
P2=(P2&0x1f)|0xa0;//蜂鸣器
break;
case wei_c:
P2=(P2&0x1f)|0xc0;//位选
break;
case duan_c:
P2=(P2&0x1f)|0xe0; //段选
break;
case off_c:
P2=(P2&0x1f)|0x00; //关闭
break;
default:
break;
}
}
对代码的补充说明:
①对代码中的与或运算的解释:
以P2=(P2&0x1f)|0x80;为例P2里面有P20、P21、P22、P23、P24、P25、P26、P27八个io口控制,P2&(与)0x1f可以实现对P20、P21、P22、P23、P24状态的保持不变,而对P25、P26、P27进行清零处理,之后或上0x80可以实现P20、P21、P22、P23、P24状态的保持不变,而对P25、P26、P27进行赋值P27=1;P26=0;P25=0;。
②打开不同锁存器的P2的值的记忆方法:
对不同的赋值之间0x80,0xa0,0xc0,0xe0,高四位为16进制一次加2。