在 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();
}
}