控制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;
}
}
}
}
51单片机高电平触发求改低电平触发
如果你不想动代码,可以从硬件上修改。第一种,修改连接继电器的电路,如果是直接驱动继电器的话,直接修改驱动方式就可以,比如原来一端电源,一端接控制口,你可以改成一端接控制口,另一端接地。第二种,其他啥都不改,在I\/O口出来后加一个反向器就可以了。
51单片机怎么初始化io口为低电平?
1、首先注意51单片机上电的时候会有个复位的操作,复位的时候不执行单片机内部程序,复位之后51单片机的所有IO口都为高电平;\\x0d\\x0a\\x0d\\x0a2、在单片机复位之后在main函数里执行程序,如果要使Io口初始化为低电平,就要在while循环的上方把IO置低;例如:\\x0d\\x0a一般程序的结构是这样的:\\...
51单片机中断的触发方式问题
有两种触发方式:低电平触发和下降沿触发。低电平触发:当检测到外部引脚为低电平触发中断的为低电平触发。下降沿触发:当检测到外部引脚由高电平变以低电平的瞬间时触发中断的为下降沿触发。注意:选择低电平触发中断后,要撤去低电平信号,否则单片机不断检测引脚为低电平就会不断发生中断。而下降沿则不...
51单片机中高低电平问题
解决办法:加大电阻R1到1k-10k即可 通过PNP三极管放提高IO灌电流能力(50mA直接加在三极管上会导致发热)
51单片机输入高低电平,输出怎么变成一个电平?
3.将P1.0、P1.1、P1.2都设为低电平输出,使C1放电至放完。4.再将P1.0、P1.2设置为输入状态,P1.1设为高电平输出,通过RT电阻对C1充电,单片机内部计时器清零并开始计时,检测P1.2口状态,当P1.2口检测为高电平时,单片机计时器记录下从开始充电到P1.2口转变为高电平的时间T2。单片机...
为什么51单片机高电平输出口接上马达就直接变成低电平了
首先,确定你的9110是好的,是否你接的那个引脚对地短路了 其次,你确定你接的L9110的引脚是对的,不是接到其他输出低电平的引脚了 这两个问题都解决了,那可能就是单片机驱动能力不够了,说明你的原理有问题
51单片机C语言程序:当P1^0口输入为高电平的时候,P2^4也输出高电平,当P1...
include <AT89X51.H> sbit P1.0=P1^0;sbit P2.4=P2^4;\/\/延时0.5秒子程序 void delay500ms(void){ unsigned char i,j,k;for(i=15;i>0;i--)for(j=202;j>0;j--)for(k=81;k>0;k--);} void main( ){ while(1){ if(P1.0=1){ P2.4=1;delay(60);P2.4=0;}...
为什么51单片机io端口输出库信号一般选择低电平有效?
因为51单片机的IO口在复位后的默认状态为1,也就是高电平\/输入状态。如果以高电平作为有效信号,单片机复位到程序初始化之间会有一个时间窗口,那么很容易在上电时造成噼里啪啦一堆误动作、甚至由于瞬态负载过重导致电源无法启动。因此在设计时应当将各种输出信号设计成低电平有效\/低电平触发动作。
51单片机引脚检测高电平输入的问题
在网上看到这样的一句话 “51单片机的I\/O 口检测高低电平是需要首先让该端口置为1的。此时这个引脚才被设置为输入”,--正确。也就是说如果上面的设计可以做到的话,那么就需要一开始的时候给高电平吗?--必须先给端口置一。--你的电路,是做不到的。--你的电路,按键、不按键,送到引脚...
51单片机IO读高电平
因为单片机的I\/O口在读信号时只能读低电平(你看看书上介绍IO口的部分就会明白,他们是集电极开路方式)所以当把某个IO设为低电平时,内部三极管导通相当于直接把外部信号接地了,所以出现你的这个现象,要是外部信号是高电平的话应该加个反向器使起要动作时发低电平,而IO应该设为高电平读取,另外把IO...