P0控制LED、数码管、蜂鸣器、继电器、步进电机、点阵、LCD1602、LCD12864。
由前面的学习可知,我们编写了初始化程序,下面我们将对初始化程序进行讲解。
LED灯的初始化:
P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;
首先看后两句程序:
P2=0X80;P0=0XFF;
由CT107D官方板原理图知,其中74HC573芯片为锁存器,当Y4C=1时,锁存器打开,当Y4C=0时,锁存器关闭。当我们要使用LED时,需要将锁存器打开,即Y4C=1。
如上图,由或非门知识可知,若使Y4C=1,需使Y4=0和WR=0,后者需用J13跳线帽将WR和GND短接即跳到IO,前者涉及到左图的74HC138译码器,由数电知识可知(也可以查看芯片手册)需使C=1,B=A=0,即(100)P27=1,P26=P25=0。于是我们可以写出
P27=1;P25=0;P26=0;
P2口其他几位可以任意0和1,于是原程序中我们设定
P2=0X80;//打开了LED相连的锁存器,默认其他管脚为0
此时LED已经可以进行操作,然而我们不知道此时LED管脚的初始高低电平,因此我们可以将其初始电平设为1,即将LED默认关闭
P0=0XFF;//默认关闭LED
前两句程序的原理(见继电器后边)
蜂鸣器:
ULN2003为达林顿管,由于74HC573的电流不满足蜂鸣器所需要的驱动能力,板子上将74HC573接了一个达林顿管,再连接蜂鸣器,ULN2003起到了增加电流的作用(同时还是一个反相器),如果直接74HC573连接蜂鸣器,可能响声会非常小因为电流很小。
蜂鸣器原理图:
同LED同样的分析,要使蜂鸣器能够被编程操作,首先需要Y5C=1,也即Y5=0,(101)需要
P27=1;P26=0;P25=1;
也即
P2=0XA0; //打开了蜂鸣器相连的锁存器,默认其他管脚为0
打开了锁存器,而要使蜂鸣器工作,还需对N BUZZ的控制,即P06的电平控制(ULN2003可认为是左右相通的反相器),P06=1即N BUZZ=0时响,我们尝试编写蜂鸣器交替响灭的程序如下:(借用LED闪烁程序的基础)
#include<STC15F2K60S2.H>
unsigned int i;
void main(void)
{
P2=0XA0;//蜂鸣器初始化 也可写P27=1;P26=0;P25=1;
//P0=
while(1)
{
P06=0;
for(i=0;i<65535;i++);
P06=1;
for(i=0;i<65535;i++);
}
}
继电器:与蜂鸣器类似,只是由P06改为P04口,P04=1即N RELAY=0时打开
#include<STC15F2K60S2.H>
unsigned int i;
void main(void)
{
P2=0XA0;//继电器初始化
while(1)
{
P04=0;
for(i=0;i<65535;i++);
P04=1;
for(i=0;i<65535;i++);
}
}
程序下载进去可以听到继电器不断闭合断开,同时蜂鸣器也有异响(注)
(接上面LED灯初始化)此时我们再回过头来看LED的初始化程序的前两句
P2=0XA0;P0=0X00;
可以看出,此语句的目的是打开继电器和蜂鸣器等的锁存器,然后关闭继电器和蜂鸣器。
LED的整个初始化程序
P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;
意在打开继电器和蜂鸣器的锁存器开关,关闭其连接设备(用于解决蜂鸣器继电器异响问题,其他的程序也可以先进行此步初始化)打开LED灯的锁存器,关闭所有LED灯。
注:同样,我们也可以在蜂鸣器或继电器的初始化程序中加入
P0=0X00;
这样我们在使用其中一个时,另外的不会发生异常开启。
数码管:
com1-8=1控制哪一个数码管显示,a-dp=0控制该数码管哪一段显示。
同上面一样,我们先处理蜂鸣器和继电器异响问题
P2=0XA0;P0=0X00;
然后关闭LED灯
P2=0X80;P0=0XFF;
打开数码管连接的锁存器,获得数码管的控制权(打开Y6C连接的锁存器,需要哪一个数码管显示,则给com几高电平;打开Y7C连接的锁存器,关闭所有的数码管)
P2=0XC0;P0=0X01;P2=0XE0;P0=0XFF;//以打开第一个数码管为例
例:第一个数码管显示1程序(由于锁存器只与P25,26,27有关,则其他几位可以任意0或1,如下)
#include<STC15F2K60S2.H>
void main(void)
{
P2=0XA0;P0=0X00;P2=0X80;P0=0XFF; //初始化程序
P2=0XC0;P0=0X01;P2=0XFF;P0=0XFF; //数码管初始化程序,打开第一个数码管
P0=0XF9;
while(1);
}