51单片机高低电平问题

2025-04-13 16:22:51
推荐回答(5个)
回答1:

粗心大意或概念错误造成的问题,看看你是怎么移位的~~首先从0xef移位到0xfe,也就是说从P3.4开始,一直到P3.0,都有被单片机置0的情况,正确的做法应该是P3.7-P3.4依次置0,从0x7f移位到0xef结束(把你switch语句中case条件数值的高4位转成二进制你就知道了),do。。while只循环4次,低4位永远不执行写0操作,只用来返回键值!
另外。楼上两位看清楚,那个是上拉电阻,虽然做实验可以不用(AT89C51除了P0口,其它口内部都有上拉电阻),但是实际应用中这4个上拉电阻是必要的,作用表现在抗干扰能力的加强上。

回答2:

你的编程思想没有错,真 有这种情况出现的话,一般是你的硬件引起的
第一你的下拉电阻可以不用
第二,估计你的P3.0接到电源5V上了

回答3:

给你个建议,把下拉电阻换成10K以下的,你现在的是47K吧!!

回答4:

我这里有一个 是已经用PROTUES7.1 测试OK的
#include
unsigned char code tab[4][4]={{'1','4','7','#'},
{'2','5','8','0'},
{'3','6','9','*'},
{'A','B','C','D'}}; //0到F的16个键植

void delay(unsigned char a)
{
unsigned char i;
while(a--)
for(i=100;i>0;i--)
;
}

char kbscan() //键盘扫描
{
unsigned char hang,lie;
if(P3!=0x0f)
delay(5);
if(P3!=0x0f)
{
switch(P3&0xf0)
{
case 0x10:hang=0;break;
case 0x20:hang=1;break;
case 0x40:hang=2;break;
case 0x80:hang=3;break;
}
P3=0xf0;
P3=0xf0;
switch(P3&0x0f)
{
case 1:lie=0;break;
case 2:lie=1;break;
case 4:lie=2;break;
case 8:lie=3;break;
}
P3=0x0f;
while(P3!=0x0f);
return (tab[hang][lie]);
}
return 0;
}

回答5:

这问题我以前也碰到过 直接把电阻和电源都去掉 利用电路的线与特性就可以了