说得通俗uln2003相当于继电器的作用,例如7个继电器的一端连某电压[也即uln2003电源电压](<50)在一起,而另一端作为则作为输出,又好如一个二极管,只不过因电路集成功能的因素,输出的电压等同于uln2003的电压罢了,常用于步进电机。
l298/7可以为负载提供双向的电流。适合驱动2相或4相的步进电机和直流电机,特是当驱动电机的方向要改变时,只须把原来电机方向的电位置反即可(如下图port1/port2电平一高一低控制电机B;port3/port4电平一高一低控制电机A,电平改变时电机的方向也随即改变,而A?pwm/B?pwm?则分别控制电机AB的速度),而uln2003则须要重新改变电图上的接线或外加器件接成h桥电路才行。

#include <reg52.h>
#define c(x) (x*110592/120000)
sbit Ir_Pin=P2^2;
unsigned char Ir_Buf[4];
unsigned char code fangxiang[]={0xA0,0X14,0XB4,0X6C,0X60,0X0C,0X00};
unsigned int Ir_Get_Low()
{
TL1=0;
TH1=0;
TR1=1;
while(!Ir_Pin && (TH1&0x80)==0);
TR1=0;
return TH1*256+TL1;
}
//=============================================================
unsigned int Ir_Get_High()
{
TL1=0;
TH1=0;
TR1=1;
while(Ir_Pin && (TH1&0x80)==0);
TR1=0;
return TH1*256+TL1;
}
//==============================================================
main()
{
unsigned int temp;
unsigned char i,j;

TMOD=0x11;
EA=1;
do{
restart:
while(Ir_Pin);
temp=Ir_Get_Low();
if(temp<c(8500) || temp>c(9500)) continue;//9000
temp=Ir_Get_High();
if(temp<c(4000) || temp>c(5000)) continue;//4500
for(i=0;i<4;i++) //4
for(j=0;j<8;j++) //8?
{
temp=Ir_Get_Low();
if(temp<c(200) || temp>c(800)) goto restart;
temp=Ir_Get_High();
if(temp<c(200) || temp>c(2000)) goto restart;
Ir_Buf[i]>>=1;
if(temp>c(1120)) Ir_Buf[i]|=0x80;
}
switch(Ir_Buf[3])
{
case 0x53:P1=fangxiang[0];break;
case 0x43:P1=fangxiang[1];break;
case 0x4f:P1=fangxiang[2];break;
case 0x5f:P1=fangxiang[3];break;
case 0x63:P1=fangxiang[4];break;
case 0x3f:P1=fangxiang[5];break;
case 0x3b:P1=fangxiang[6];break;
default:break;

}
}
while(1);
}
已发请查收


