蓝桥杯单片机CT107D初始化程序

蓝桥杯单片机CT107D初始化程序(关闭蜂鸣器、LED、数码管)

void sys_init()	//初始化关闭外设函数
{
	P2 &= 0X1F;//清零P2高三位即P27P26P25 = 0
	
	P2 = P2 & 0X1F | 0XA0;//先清零P2高三位之后再给P27P26P25赋值101,蜂鸣器锁存器
	P0 = 0X00;//关闭蜂鸣器
	P2 &= 0X1F;//关闭蜂鸣器锁存器,释放P0口
	
	P2 = P2 & 0X1F | 0X80;//先清零P2高三位之后再给P27P26P25赋值100,LED锁存器
	P0 = 0XFF;//关闭LED
	P2 &= 0X1F;//关闭LED锁存器,释放P0口
	
	P2 = P2 & 0X1F | 0XE0;//先清零P2高三位之后再P27P26P25赋值111,数码管段锁存器
	P0 = 0XFF;//关闭数码管
	P2 &= 0X1F;//关闭数码管锁存器,释放P0口
}

以下以关闭蜂鸣器为例,分析初始化函数:

蓝桥杯单片机CT107D初始化程序_第1张图片
①图示是74HC138译码器,即由P27P26P25的输入,来决定Y的输出。
当P27P26P25 赋值为101时,输出有效位Y5 = 0;对应程序P2 = P2 & 0X1F | 0XA0;

蓝桥杯单片机CT107D初始化程序_第2张图片

②38译码器选中有效位后,再经过以下或非门,输出YxC。
当P27P26P25 = 101时,Y5 = 0为有效输出位,当WR为0时(默认为0),Y5C = (Y5 | WR)’=1。

蓝桥杯单片机CT107D初始化程序_第3张图片

③之后是锁存器,经过前面的电路,Y5C为1,即对应LE为1,锁存器开启,此时操作P0口,便可对ULN2003(蜂鸣器继电器等)操作:P0 = 0X00;(蜂鸣器继电器高电平开启,低电平关闭)
④并且P0口的值被储存存在锁存器里,此时关掉锁存器(Y5C清0)之后,即使改变P0口的值,也无法改变锁存器储存过的值了,达到解放P0口的目的:P2 & = 0X1F;

蓝桥杯单片机CT107D初始化程序_第4张图片
⑤打开或关闭LED,数码管位选、段选过程同上,参考电路图分析

总结:

P2 = P2 & 0X1F | 0XA0;		//给P27P26P25赋值101,打开蜂鸣器锁存器
P0 = 0X00;					//关闭蜂鸣器
P2 &= 0X1F;				//关闭蜂鸣器锁存器,释放P0口

我更喜欢这样写:

void sys_init()
{
	P2 &= 0X1F;
	
	P0 = 0X00;
	P2 = P2 & 0X1F | 0XA0;
	P2 &= 0X1F;
	
	P0 = 0XFF;
	P2 = P2 & 0X1F | 0X80;
	P2 &= 0X1F;
	
	P0 = 0XFF;
	P2 = P2 & 0X1F | 0XE0;
	P2 &= 0X1F;
}

你可能感兴趣的:(蓝桥杯单片机CT107D初始化程序)