硬件图
编程实现
图中 ,用Y5C控制ULN2003芯片。
所以要选通Y5C ;
ULN2003芯片是个反相放大,IN口是1,OUT口出来是0;IN口是0,出来是1;
蜂鸣器和继电器,都是0点亮,发声;那么对应的ULN2003的输入应该是输入1;
所以操作思路:
选择Y5C;
P04负责继电器,P06负责蜂鸣器;
如果点亮继电器的M2灯;那么需要让P04这一位等于1,其他位保持不变,不然会影响蜂鸣器。
ULNbuf =ULNbuf | 0x10 ;//0001 0000
P0=ULNbuf;
关闭Y5C,选择Y0;
熄灭m2的LED灯,就是让P04=0,其他位保持不变的话,那么
ULNbuf= ULNbuf &0xEF ;//1110 1111
P0=ULNbuf;
就可以了。
同理,打开蜂鸣器,就是P06=1,
ULNbuf =ULNbuf |0x40;//0100 0000
关闭就是,P06=0;
ULNbuf=ULNbuf &0xbf ;//1011 1111
综上,代码是
#include <stc15.h>
#include <intrins.h>
void delay1ms(int tms) //@11.0592MHz
{
unsigned char i, j;
for(tms;tms>0;tms--)
{
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
}
#define LED 4
#define ULN 5
#define COM 6
#define ABC 7
void choose573(unsigned char x)
{
switch(x)
{
case 0:
P2 =P2&0x1F;//0x1F ====0001 1111
break;
case LED: //Y4---LED
P2= (P2&0x1F) | 0x80;break; //1000 0000
case ULN://Y5---蜂鸣器
P2 =(P2&0x1F) | 0xA0;break; //1010 0000
case COM: //Y6---数码管
P2= (P2&0x1F) | 0xC0;break; //1100 0000
case ABC://Y7 ---数码管
P2 =(P2&0x1F) | 0xE0;break; //1110 0000
default:break;
}
}
//全局变量
unsigned char LEDbuf;
unsigned char ULNbuf;
void main()
{
//关闭外部设备,LED,蜂鸣器等等;
//关闭LED
choose573(LED);
LEDbuf=0xFF;
P0=LEDbuf;
choose573(0);
//关闭fengmignqi
choose573(ULN);
ULNbuf=0x00;//ULN2003是反相的放大,1--0,0--1
P0=ULNbuf;
choose573(0);
//关闭数码管
choose573(COM);
P0=0x00;
choose573(0);
choose573(ABC);
P0=0xFF;
choose573(0);
while(1)
{
choose573(ULN); //点亮m2;P04=1,
ULNbuf=ULNbuf |0x10 ;//0001 0000
P0=ULNbuf;
choose573(0);
delay1ms(500);
choose573(ULN); //熄灭m2;P04=0,
ULNbuf=ULNbuf &0xEF ;//1110 1111
P0=ULNbuf;
choose573(0);
delay1ms(500);
choose573(ULN); //打开蜂鸣器;P06=1,
ULNbuf=ULNbuf |0x40 ;//0100 0000
P0=ULNbuf;
choose573(0);
delay1ms(500);
choose573(ULN); //熄灭蜂鸣器;P06=0,
ULNbuf=ULNbuf &0xBF ;//1011 1111
P0=ULNbuf;
choose573(0);
delay1ms(500);
}
}