Good_time 发表于 2012-12-22 00:09:55

通信控制I/O输出上的问题。


今天刚到的OCROROT-MANGO,跟着前辈教程做了些小实验。突然想用通信控制LED灯,程序如下:
char word;
int i;   
void setup()
{
Serial.begin(9600);
for(i=3;i>=6;i++)
{
pinMode(i,OUTPUT);
}
}
void loop()
{
word=Serial.read();
if(word=='a')                                                                                                                                                            
{
   digitalWrite(3,HIGH);
   }
   else if(word=='b')
{
   digitalWrite(4,HIGH);
    }
   else if(word=='c')
{
   digitalWrite(5,HIGH);
}
   else if(word=='d')
{
   digitalWrite(6,HIGH);
   }
}
程序功能是从串口发送a,b,c,d字母给机器,则相应输出口的LED灯点亮。但这个程序控制的效果是LED灯光不足,测了下输出口电压2V不到。我用这外围电路做流水灯实验,LED灯亮度正常。为什么用通信控制却出现这种情况。以确定外围电路没问题,但不清楚程序有什么问题,请求大师指教。

mxx_xm 发表于 2012-12-22 01:42:59

瞎说,不知道对不对,仅供参考

1、请把串口字符读取放到 Serial.available()判断中
类似以下
if (Serial.available() > 0) {
    //读取传入的字节:
    incomingByte = Serial.read();

    //显示你得到的数据:
    Serial.print("I received: ");
    Serial.println(incomingByte, DEC);
}
不然以你现有程序的逻辑是不管串口是否有新数据都去读缓冲吧。

2、按照以上继续看,你在loop()里没有加一定的延时,事实上执行效果是你在手动重复置电平;
无意中达到了神一般的PWM效果

迷你强 发表于 2012-12-22 19:39:41

打开了led记得关掉啊。。单片机的总功率有限,,你全开了供电不足啊。。。单片机一般全部点led使用的是单位时间只点亮一颗

Good_time 发表于 2012-12-22 20:39:58

谢谢你的指点啊,我按你的方法去试了,能达到控制目的,但输出电压还是很低。
后来我单独去控制一个LED,结果控制电压上去了:lol。这时我就怀疑是不是定义输出引脚这出了问题,然后我一个一个定义输出,不采用循环的方式定义。编译,下载,,,OK,四个LED正常输出,呵呵。
但我还没找到原因,为什么循环定义引脚会出现这情况。做流水灯采用循环定义又是正常的。采用通信就不行了?
loop()里没有加一定的延时,是之前看到资料上说数字输出引脚被置高后不再去重新置位的话就一直保持高,所以不会有神一般的PWM效果。当然加上延时肯定会对程序更有益,起到一个缓冲作用。。。
总之,这个问题能解决还是得非常谢谢你的指点,以后常交流{:soso_e181:}

Good_time 发表于 2012-12-22 20:47:51

迷你强 发表于 2012-12-22 19:39 static/image/common/back.gif
打开了led记得关掉啊。。单片机的总功率有限,,你全开了供电不足啊。。。单片机一般全部点led使用的是单位 ...

我只控制了四个LED,点亮第一个输出都2V不到,所以这问题不是出在这功率上。
问题已经找出来了,呵呵。结果是循环定义输出那里问题。
但其原因还没找到。

Ansifa 发表于 2012-12-22 22:07:37

暗就换成一个LED一个限流电阻

Good_time 发表于 2012-12-22 22:25:50

Ansifa 发表于 2012-12-22 22:07 static/image/common/back.gif
暗就换成一个LED一个限流电阻

这是个办法,但没解决根本原因啊。
页: [1]
查看完整版本: 通信控制I/O输出上的问题。