控制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单片机中断的触发方式问题
有两种触发方式:低电平触发和下降沿触发。低电平触发:当检测到外部引脚为低电平触发中断的为低电平触发。下降沿触发:当检测到外部引脚由高电平变以低电平的瞬间时触发中断的为下降沿触发。注意:选择低电平触发中断后,要撤去低电平信号,否则单片机不断检测引脚为低电平就会不断发生中断。而下降沿则不...
51单片机怎么初始化io口为低电平?
1、首先注意51单片机上电的时候会有个复位的操作,复位的时候不执行单片机内部程序,复位之后51单片机的所有IO口都为高电平;\\x0d\\x0a\\x0d\\x0a2、在单片机复位之后在main函数里执行程序,如果要使Io口初始化为低电平,就要在while循环的上方把IO置低;例如:\\x0d\\x0a一般程序的结构是这样的:\\...
51单片机输入高低电平,输出怎么变成一个电平?
1.先将P1.0、P1.1、P1.2都设为低电平输出,使C1放电至放完。2.将P1.1、P1.2设置为输入状态,P1.0设为高电平输出,通过RK电阻对C1充电,单片机内部计时器清零并开始计时,检测P1.2口状态,当P1.2口检测为高电平时,即C1上的电压达到单片机高电平输入的门嵌电压时,单片机计时器记录下从...
51单片机中高低电平问题
电阻太小,高电流强制拉高了IO口 单片机IO灌电流能力只有10-20mA 解决办法:加大电阻R1到1k-10k即可 通过PNP三极管放提高IO灌电流能力(50mA直接加在三极管上会导致发热)
51单片机的低电平触发 是不是在引脚为高电平之前一直在这个低电平触发的...
执行完这个中断后就退出,但由于外部中断的中断触发条件仍然存在,所以会立即又进入中断,反复进行,直到变为高电平。(前提时只有这一个中断或没有高于它的中断源)
51单片机中如何通过一个端口高低电平,控制另外端口的高低电平? C语言程...
不明白你需要的控制需求,如果你说的“给P1.0口加高电平”这句话理解为给P1.0外加一个高电平,那么编程中只要加一个判断就可以实现你的目的了,可以参考按键程序,(如果是按键判断需要加入防抖动代码)示意代码如下:sbit k=P1^0;\/\/定义一个端口名称 if(k) P2=1;\/\/如果端口为1,P2置1 else...
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单片机高电平输出口接上马达就直接变成低电平了
首先,确定你的9110是好的,是否你接的那个引脚对地短路了 其次,你确定你接的L9110的引脚是对的,不是接到其他输出低电平的引脚了 这两个问题都解决了,那可能就是单片机驱动能力不够了,说明你的原理有问题
51单片机怎么用外部电路让io口变成低电平?
51单片机可在外部IO引脚上接一个按键,按键一端接地,就可以让IO口变成低电平,如下图P3.2引脚上接一个按键,当按键按下,就把P3.2引脚接地,所以检测到了低电平。