蜂鸣器+继电器
据B站视频而完成的题目:
在CT107D单片机综合训练平台上实现蜂鸣器与继电器的基本控制,
首先让8路LED指示灯闪烁3遍后熄灭,接着依次点亮LED指示灯,
继电器吸合一会后断开,然后依次熄灭LED灯,蜂鸣器鸣叫一会儿后关闭
程序循环实现上述功能。
#include <REGX52.H>
#include <intrins.h>
void InitHC138(unsigned char i);//74HC138模块
void output_P0(unsigned char channel, unsigned char date);
void Delay(unsigned char t); //@11.0592MHz
void Running();
void Init();
void main()
{
Init();
while(1)
{
Running();
}
}
void InitHC138(unsigned char i)
{
switch(i)
{
case 4: P2 = (P2 & 0x1f) | 0x80; break;//(1111 1111) & 0001 111 = 0001 1111 ,0001 1111 | 1000 0000 = 1001 1111,选择Y4置低电平,通过或非门,来将锁存器LE(使能端)打开。
case 5: P2 = (P2 & 0x1f) | 0xa0; break;//(1111 1111) & 0001 111 = 0001 1111 ,0001 1111 | 1011 0000 = 0101 1111
case 6: P2 = (P2 & 0x1f) | 0xc0; break;//(1111 1111) & 0001 111 = 0001 1111 ,0001 1111 | 1101 0000 = 0101 1111
case 7: P2 = (P2 & 0x1f) | 0xe0; break;//(1111 1111) & 0001 111 = 0001 1111 ,0001 1111 | 1111 0000 = 0101 1111
}
}
void output_P0(unsigned char channel, unsigned char date)
{
InitHC138(channel);//控制打开锁存器。
P0 = date;//灯怎么亮。
}
void Delay(unsigned char t) //@11.0592MHz
{
unsigned char i, j;
while(t)
{
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
t--;
}
}
void Running()
{
unsigned int i;
//LED闪烁3遍后熄灭
for(i = 0; i <= 2; i++)
{
output_P0(4, 0x00);
Delay(500);
output_P0(4, 0xff);
Delay(500);
}
//依次点亮LED指示灯
for(i = 1; i <= 8; i++)
{
output_P0(4, (0xff << i));
Delay(500);
}
//继电器吸合一会后断开
output_P0(5, 0X10);
Delay(1000);
output_P0(5, 0X00);
Delay(1000);
//依次熄灭LED灯
for(i = 1; i <= 8; i++)
{
output_P0(4, ~(0xff << i));
Delay(500);
}
output_P0(5, 0X40);
Delay(1000);
output_P0(5, 0X00);
Delay(1000);
}
void Init()
{
InitHC138(5);
//选择Y5置低电平,通过或非门,来将锁存器LE(使能端)打开。
P0 = 0x00;//通过ULN2003变成0xff,使蜂鸣器和继电器关闭
}