13.初始化程序

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的初始化程序的前两句

扫描二维码关注公众号,回复: 11387892 查看本文章
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);
}

猜你喜欢

转载自blog.csdn.net/qq_44628230/article/details/104334044