51单片机高电平触发求改低电平触发

控制8路继电器,买了低电平触发的继电器,但是51写的是高电平触发,我不懂单片机编程,谁帮我改改代码,代码如下:
/*
一、头文件与宏定义
*/

#include<reg52.h> //包含头文件,一般情况不需要改动
#define uchar unsigned char//宏定义无符号字符型,以后直接可以用uchar 替代unsinged char
#define uint unsigned int //宏定义无符号整型

#define RELAY_ON 0
#define RELAY_OFF 1

/*
二、全局变量
*/
uchar g_rec[50],g_offset=0,g_send[10],g_send2[20];
uchar OutReg[4]={0};

/*
三、函数与外部变量声明
*/

/*
四、函数体部分
*/

/********************************************************************
函数功能:串口初始化函数,波特率9600,晶振11.0592M
参数说明:
返回值:
*********************************************************************/
void UartInit()
{
PCON&=0x7f;//SMOD=0
SCON = 0x40;//
TMOD &= 0x0F;
TMOD |= 0x20;//
TH1=0xfd;
TL1=0xfd;
TR1 = 1;//
REN = 1;//
ES = 1;//
EA=1;

}

void UartSendChar(uchar dat)
{
SBUF = dat;
while(!TI);
TI = 0;
}

void UartSendBuffer(uchar *dat,uchar len)
{
uchar i=0;
for(i=0;i<len;i++)
UartSendChar(dat[i]);
}

void UartInt() interrupt 4
{
if(RI)
{
RI=0;
g_rec[g_offset++]=SBUF;//
if(g_rec[0]!=0xaa)
g_offset=0;

}
}
void delayms(uchar t)//误差0.434028 us
{
unsigned char i=0,j=0,k=0;
for(k=t;k>0;k--)
for(i=7;i>0;i--)
for(j=64;j>0;j--);
}

void OutSet(void)
{
P0=OutReg[0];
P1=OutReg[1];
P2=OutReg[2];
}

void HexToString(uchar *src,uchar *dst,uchar len)
{
uchar i=0,h=0,l=0;
for(i=0;i<len;i++)
{
h=src[i]/16;
l=src[i]%16;
if(h<=9)
dst[2*i]=h+'0';
else
dst[2*i]=h-10+'a';
if(l<=9)
dst[2*i+1]=l+'0';
else
dst[2*i+1]=l-10+'a';
}

}
/********************************************************************
函数功能:
参数说明:
返回值:
*********************************************************************/

void main (void)
{
uchar i=0;
for(i=0;i<3;i++)
OutReg[i]=0;
P0=OutReg[0];
P1=OutReg[1];
P2=OutReg[2];
g_send2[0]=0x02;//发送标志

UartInit();
while(1)
{
if(g_offset!=0)
{
delayms(20);
g_offset=0;
switch(g_rec[1])
{
case 0x02://读取
g_send[0]=0xaa;
g_send[1]=0x02;
g_send[2]=OutReg[0];
g_send[3]=OutReg[1];
g_send[4]=OutReg[2];
g_send[5]=0x00;
g_send2[1]=12;
HexToString(g_send,g_send2+2,6);
UartSendBuffer(g_send2,14);
break;
case 0x01://设置
for(i=0;i<3;i++)
OutReg[i]=g_rec[i+2];
OutSet();
g_send2[1]=12;
HexToString(g_rec,g_send2+2,6);
UartSendBuffer(g_send2,14);
break;
default:
break;
}
}
}
}

如果你不想动代码,可以从硬件上修改。第一种,修改连接继电器的电路,如果是直接驱动继电器的话,直接修改驱动方式就可以,比如原来一端电源,一端接控制口,你可以改成一端接控制口,另一端接地。第二种,其他啥都不改,在I/O口出来后加一个反向器就可以了。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-12-04
void OutSet(void)
{
P0=~OutReg[0];
P1=~OutReg[1];
P2=~OutReg[2];
}

void main (void)
{
uchar i=0;
for(i=0;i<3;i++)
OutReg[i]=0;
P0=~OutReg[0];
P1=~OutReg[1];
P2=~OutReg[2];
........

本回答被提问者和网友采纳