51单片机控制继电器问题

我想用单片机控制3个继电器,分别用p2.3 ,p2.4和p2.5控制,12V供电,通过键盘切换不同的继电器。我遇到的问题是,只有当单片机复位后的第一次才能按我的要求都能切换,当循环一次之后,第一个继电器就不工作了,第二第三个是正常的,我量了下第一个继电器两端的电压只有2.5v左右。如果我单独测第一个继电器的开断时,又是好使的。程序如下:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit cs=P3^5;
sbit wr=P3^6;
sbit s1=P2^0;
sbit s2=P2^1;
sbit s3=P2^2;
sbit x1=P2^3;
sbit x2=P2^4;
sbit x3=P2^5;
uchar temp=128,s1num;
void delay(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void keyscan()
{
if(s2==0)//DAC0832输出电压选择
{
delay(10);
if(s2==0)
{
while(!s2);
temp++;
if(temp>256)
temp=128;
}
}
if(s1==0)
{
delay(10);
if(s1==0)
{
while(!s1);
/*//单独测第一个继电器 有的是: x1=~x1; */
s1num++;
if(s1num==4)
s1num=1;
}
}
}
void xiangying()
{
switch(s1num)

{ case 1: x1=1;x2=0;x3=0;break;
case 2: x1=0;x2=1;x3=0;break;
case 3: x1=0;x2=0;x3=1; break;
}
}
void main()
{
cs=0;
wr=0;
x1=0;x2=0;x3=0;
while(1)
{
keyscan();
xiangying();
P0=temp;
}
}

检查了下你单片机程序部分应该问题不大,我怀疑你是12V高压串过去影响单片机了,像你这种应用通过光耦隔离下才好
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-01-11
51的P2端口是弱上拉,高电平输出电流能力很弱,用来驱动NPN三极管有点勉强,你试试在P2口上拉一个2K的上拉电阻,另外R6可以换个稍小点的电阻,比如1K的。追问

R6我用的是4.3K的,我觉得这个应该不是原因所在吧,因为第一次都能驱动,就是循环到第二次是不行,其他两个继电器都是可以用的,就第一个继电器有点问题。

追答

P2口驱动能力弱,工作会不可靠的。

第2个回答  2014-01-11
dingyigela
第3个回答  2014-01-11
我也想知道啊,还不会