有时候我必须选择一个人过冬 习惯在冰天雪地里追梦

从51单片机的读端口及读引脚想到的

上一篇 / 下一篇  2007-10-04 00:39:49 / 个人分类:工作备忘

最近给电路板的电磁阀加入定时功能,在打开电磁阀后,隔一段时间后电磁阀自动关闭。编写软件时,使用定时器1进行定时计算,定时器1每0.5ms中断一次,执行中断服务时变量cup_time++,并检查是否已到预先设置好的时间,如果定时已到,并且电磁阀是打开状态,则关闭电磁阀。判断代码如下:

if ((AV)&&((cup_time/2000)==cuptime)) //如果电磁阀已经打开并且定时已到则
   {
    AV=0;
    cup_time_inc=0;
   }

其中AV=1时,电磁阀打开,AV=0则电磁阀关闭。

乍一看,这段代码并没有逻辑上的错误,而在uvision3里模拟执行时,通过uvision3自带的逻辑分析仪监视AV口电平,定时到达后AV输出0,执行结果和预料分毫不差,但把代码烧录到电路板上执行时,电磁阀打开后,定时到达后却无法关闭。经过反复调试和查资料才发现问题所在,8051在执行读IO口操作时,根据读取指令的不同,存在读引脚及读端口两种情况,读引脚时是直接读取IO引脚上的电平,而读端口是读取IO口寄存器里的内容。以上代码编译后,在判断AV是否为1时,指令是JNB XXX,不为1则跳转,为读引脚的代码而不是读端口代码。在电路板上,AV口接TIP122达林顿三极管的基极,当输出1高电平时,三极管基极对地导通,电磁阀通电而打开。但AV口输出高平后,由于基极的导通(相当于二极管的导通,导通后电阻非常小)关系,AV口的电平不能维持在5V高电平,而被钳定在1V以下。因此当执行到JNB XXX时,虽然AV口端口锁存器里的数值是1,但实际上从AV引脚读到的电平是低电平0,不符合AV==1条件,因此不执行关闭电磁阀的操作。而在uvision3里模拟执行时,模拟环境无法模拟AV口被外部硬件拉低电平的情况,因此代码的执行没问题。知道问题所在后,通过另外设置一个bit变量记录电磁阀的打开/关闭状态,顺利解决问题。

由此而想到的,利用IO口的输出/输入的特性可以进行一些基本的自检功能,如果IO连接的是三极管的基极,通过三极管的放大电流特性来驱动外设,那么在自检时,通过往该IO口输出1,再读回该IO口的电平,如果三极管工作正常那么由于基极对地导通的原因,电平被钳定为低,读到的电平应该为0,若为1则标明该三极管有问题,基极无法导通。而如果IO口连接的是单向输出的数字电路(譬如反相器),通过往该IO口输出1,再读回该口的电平,如果数字电路正常,读到电平应该为1(数字电路的对地电阻非常大),如果为0则标明数字电路可能已经被击穿。

有一点需要注意的是,做这样的自检判断时,往IO口输出1后,需要延时约5ms才能读取该IO口电平进行判断,否则判断结果不可靠。这是因为三极管的基极从加上高电平到PN结的完全导通需要时间,如果输出1后就立即读取该IO口,很可能三极管还没开始动作,此时读取到的数值失去判断意义。


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-12-03  
 123456
78910111213
14151617181920
21222324252627
28293031   

数据统计

  • 访问量: 28546
  • 日志数: 189
  • 图片数: 24
  • 文件数: 6
  • 书签数: 4
  • 建立时间: 2006-04-20
  • 更新时间: 2008-11-30

RSS订阅

Open Toolbar