在 CT107D 单片机综合训练平台上,实现以下功能:

        1、系统上电后,关闭蜂鸣器,关闭继电器,关闭 8 个 LED 灯。

        2、循环实现以下功能:

                首先,8 个 LED 灯同时闪烁 3 次;

                接着,从 L1 灯至 L8 灯依次点亮;

                然后,继电器吸合,延时片刻,继电器断开;

                接着,从 L1 灯至 L8 灯依次熄灭;

                最后,蜂鸣器鸣叫一会后关闭。

以下是详细的程序与注释

#include "reg52.h"  //引用头文件

sbit HC138_A=P2^5;	 //将74HC138的A端口与单片机的P2^5连接起来
sbit HC138_B=P2^6;	 //将74HC138的B端口与单片机的P2^6连接起来
sbit HC138_C=P2^7;	 //将74HC138的C端口与单片机的P2^7连接起来



//延迟函数
void Delay(unsigned int t)
{
	while(t--);
}



//选择锁存器的函数,就是Y几输出低电平,Y4输出高电平控制74HC573锁存器,Y5输出高电平控制继电器蜂鸣器
void initHC138(unsigned char n)
{
	switch(n)
	{
		case 4:	//选择Y4输出高电平
			HC138_A=0;
			HC138_B=0;
			HC138_C=1;
		break;

		case 5: //选择Y5输出高电平
			HC138_A=1;
			HC138_B=0;
			HC138_C=1;
		break;
	}

}



//选择Y几输出高电平,且选择P0端口输出多少
void outputP0(unsigned char channel,unsigned char dat)
{
  initHC138(channel);
  P0=dat;

}




//LED点亮与熄灭	,继电器蜂鸣器打开与关闭
void LEDrunning()
{
	unsigned char i;//定义变量i


	//LED灯闪烁三次
	for(i=0;i<=3;i++)
	{
		outputP0(4,0x00);   //选择Y4输出高电平,P0端口输出十六进制00(二进制的00000000)点亮LED灯
		Delay(60000);
		Delay(60000);
		outputP0(4,0xff);	 //选择Y4输出高电平,P0端口输出十六进制ff(二进制的11111111)熄灭LED灯
		Delay(60000);
		Delay(60000);	
	}



	//LED灯逐个点亮
	for(i=0;i<=8;i++)
	{
		outputP0(4,(0xff<<i));//选择Y4输出高电平,<<左移运算符,将P0从11111111,设置到00000000
		Delay(60000);
		Delay(60000);
	}



	//打开继电器后关闭
	outputP0(5,0x10);//选择Y5输出高电平,P0端口输出00010000,让P04引脚变为1,继电器吸合 
	Delay(60000);
	Delay(60000);
	outputP0(5,0x00); //选择Y5输出高电平,P0端口输出00000000,让P04引脚变为0,继电器断开




	//LED灯逐个熄灭
	for(i=0;i<=8;i++)
	{
		outputP0(4,(~(0xff<<i)));//选择Y4输出高电平,使单片机控制LED灯
		Delay(60000);
		Delay(60000);
	}



	//打开蜂鸣器后关闭
	outputP0(5,0x40);//选择Y4输出高电平(控制蜂鸣器),让P04引脚变为1,打开蜂鸣器
	Delay(60000);
	Delay(60000);
	outputP0(5,0x00);//选择Y4输出高电平,让P04引脚变为0,关闭蜂鸣器
}





void initsystem()
{
	outputP0(5,0x00);//选择Y5输出高电平,让P0引脚全变为0,把所有的无关设备关闭		
}





//在主函数中执行
void main()
{
	initsystem();
  	while(1)//while语句当括号内为1执行大括号内语句,为0停止执行大括号内语句,while(1)括号内一直为1,所以此while循环会一直执行下去
	{
	   LEDrunning();
	}
	
}