首先让8路LED指示灯闪烁3遍后熄灭,接着依次点亮LED指示灯,继电器吸合一会后断开,然后依次熄灭LED指示灯,蜂鸣器鸣叫一会后关闭,程序循环实现上述功能。
目录
1、蜂鸣器与继电器电路
1、ULN2003(约等于放大倍数较大的三极管)
2、继电器
3、蜂鸣器
2、程序代码
1、自己写的:
2、标准代码
1、蜂鸣器与继电器电路
WR低,Y5低-->Y5C高(或非,锁存器连通)
CBA = 101(选Y5)
1、ULN2003(约等于放大倍数较大的三极管)中间是非门!!
2、继电器N_RELAY接低(OUT5-->(非门)IN5-->Y5C)--->线圈通电,继电器吸合
OUT5低,IN5高,P04高(Y5C高)P0 = 0001 0000 = 0x10
3、蜂鸣器N_BUZZ接低(叫),IN7高,P06高 ,P0 = 0100 0000 = 0x40
2、程序代码 1、自己写的:#include "reg52.h" sbit HC138_A = P2^5; sbit HC138_B = P2^6; sbit HC138_C = P2^7;//位定义 void Delay (unsigned int t)//延时函数 { while(t--); while(t--); } void BUZZER()//蜂鸣器 { HC138_C = 1; HC138_B = 0; HC138_A = 1;//选Y5 P0 = 0x40;//P06高 = 0100 0000,蜂鸣器叫 Delay(60000); Delay(60000); P0 = 0x00;//蜂鸣器关闭 } void DIODE()//继电器 { HC138_C = 1; HC138_B = 0; HC138_A = 1;//选Y5,Y5C高 锁存器连通 P0 = 0x10;//P04高 = 0001 0000,继电器吸合 Delay(60000); Delay(60000); P0 = 0x00;//继电器断开 } void LEDRunning()//灯 { unsigned char i; HC138_C = 1; HC138_B = 0; HC138_A = 0;//选Y4,Y4C高 锁存器连通 for (i = 1; i <= 3; i++)//闪烁3遍 { P0 = 0x00;//全亮 Delay(60000); Delay(60000); P0 = 0xff;//全灭 Delay(60000); Delay(60000); } for (i = 1; i <= 8; i++)//熄灭,接着依次点亮 { P0 = 0xff << i;//全灭;位移一位,添一个0(亮),左移 Delay(60000); Delay(60000); } DIODE();//继电器 for (i = 1; i <= 8; i++)//依次熄灭 { P0 = ~(0xff << i); Delay(60000); Delay(60000); } BUZZER();//蜂鸣器 } void main()//主函数 { while(1) { LEDRunning(); } }
运行后存在问题:
1、初始时继电器和蜂鸣器都在运行(改进:写一个初始化系统函数,放在主函数中while之前)
2、继电器吸合并断开后,灯无法依次熄灭(被跳过),蜂鸣器叫,然后接着闪烁循环。
3、Y4、Y5的选择繁琐,需简化代码(switch)。
分析代码:
void DIODE()//继电器 { HC138_C = 1; HC138_B = 0; HC138_A = 1;//选Y5,Y5C高 锁存器连通 P0 = 0x10;//P04高 = 0001 0000,继电器吸合 Delay(60000); Delay(60000); P0 = 0x00;//继电器断开 } //引用继电器之和的程序 DIODE();//继电器 for (i = 1; i <= 8; i++)//依次熄灭 { P0 = ~(0xff << i); Delay(60000); Delay(60000); } BUZZER();//蜂鸣器
DIODE(继电器)函数引用后,CBA = 101(选Y5)
而灯依次熄灭则需要CBA = 100(选Y4)
2、标准代码#include "reg52.h" sbit HC138_A = P2^5; sbit HC138_B = P2^6; sbit HC138_C = P2^7; void Delay(unsigned int t)//延时函数 { while(t--); while(t--); } void InitHC138(unsigned char n)//简化选择 { switch(n) { case 4: HC138_C = 1; HC138_B = 0; HC138_A = 0;//选Y4 break; case 5: HC138_C = 1; HC138_B = 0; HC138_A = 1;//选Y5 break; case 6: HC138_C = 1; HC138_B = 1; HC138_A = 0;//选Y6 break; case 7: HC138_C = 1; HC138_B = 1; HC138_A = 1;//选Y7 break; } } //void OutPutP0(unsigned char channel, unsigned char dat)简化 //{ // InitHC138(channel); // P0 = dat; //} void InitSystem()//初始化系统(关闭继电器与蜂鸣器) { InitHC138(5);//选Y5 P0 = 0x00; //关闭继电器与蜂鸣器 } void LEDRunning() { unsigned char i; InitHC138(4);//选Y4 //LED指示灯闪烁3遍 for(i = 0; i < 3; i++) { P0 = 0x00;//D1~8为低,LED点亮 Delay(60000); Delay(60000); P0 = 0xff;//D1~8为高,LED熄灭 Delay(60000); Delay(60000); } //然后熄灭,接着依次点亮LED指示灯(i初始不能为0->移0位) for (i = 1; i <= 8; i++) { P0 = 0xff << i;//0xff:全灭(然后熄灭) 移1位,补充一个0(亮) Delay(60000); Delay(60000); } //继电器吸合一会后断开 InitHC138(5);//选Y5 CBA=101 P0 = 0x10;//吸合,P04高-->P0=0001 0000=0x10 Delay(60000); Delay(60000); P0 = 0x00;//断开 //选Y4!!!!!!! InitHC138(4);//选Y4:CBA = 100(C为高位);(Y4C得高) //依次熄灭指示灯 for (i = 1; i <= 8; i++) { P0 = ~(0xff << i);//取反 Delay(60000); Delay(60000); } //蜂鸣器鸣叫一会后关闭 InitHC138(5);//选Y5 CBA=101 P0 = 0x40;//叫,P06高-->P0=0100 0000=0x40 Delay(60000); Delay(60000); P0 = 0x00;//关闭 } void main()//主函数 { InitSystem(); while(1) { LEDRunning(); } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)