新闻  |   论坛  |   博客  |   在线研讨会
端口测试程序技术解析
tvb2058 | 2008-01-15 19:17:03    阅读:2346   发布文章


现以P2端口测试为例:
/*------------------------------------
              P2端口测试
主要测试管脚接电源或地及相临管脚的短路
-------------------------------------*/
unsigned char Port2Test(void)
{
unsigned char testval;
  P2 = 0x55;//奇数管脚发低电平
  _nop_();//延时
  testval = P2 ^ 0x55;//比较发送及接收结果
  P2 = 0xaa;//偶数管脚发低电平
  _nop_();//延时
  testval |= P2 ^ 0xaa;//比较发送及接收结果(2次的)
  P2 = 0xff;//释放P1口,防止外部接入电源
  return testval;//测试成功返回0
}

技术解析:
    由于51的IO地址不能间接寻址,故直接寻址逼迫写出不同的测试函数PortXTest().
对于每个IO口的8个IO管脚,发送0x55或0xaa实际就是测试相邻管脚或任意管脚(见我其他相关程序)的短接情况.

1) P2 = 0x55;//奇数管脚发低电平
   即奇数管脚为输出,偶数管脚为输入.
   如果某一奇数管脚与某一偶数管脚短接时,就如同键扫描一样,偶数管脚接收
到高电平时,表示"无键压下"即奇数管脚肯定没与偶数管脚短接!!!
但一旦收到低电平时,问题就复杂了.
若P2口用于外接RAM的地址总线时,P2肯定为输出.故判定地址总线错误.

2)  _nop_();//延时
  相当与"键盘消抖"...

3)  testval = P2 ^ 0x55;//比较发送及接收结果
  在1)中,P2口发送的是0x55,那么接收回来的应该也是0x55.则0x55 ^ 0x55 == 0x00.
  若出错,则P2 ^ 0x55的结果testval肯定非零.

4) P2 = 0xaa;//偶数管脚发低电平
  由于1)~3)只测试了偶数管脚,必须再测试奇数管脚.
  测试奇数管脚当然是偶数管脚发低电平了.

5) testval |= P2 ^ 0xaa;//比较发送及接收结果(2次的)
  同3)但合并了2次结果.
  既testval非零必错!!!

深度探索:
  在各IO测试程序中,IO管脚接地出错很好理解---就认为是"有键压下"!!!
但IO管脚接电源又该如何呢???

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客