单片机C语言中: 定义a1=P0^1; a2=P0^2; …… a8=P0^7;b=P2^0; 。a1~a8不断随机为1。

我要用指针数组来顺序扫描P0口,当检测到3个1的时候,使能P2^0口,应该怎么写?
int *p[8]={''a1'',''a2''…''a8''};
main()
{
for(i=0;i<8;i++)
{
if(&p[8]==1)
{
m=m+1;
}
}
if(m==3)
{
b=1;
m=0;
}
}
这样写对不对?
主函数忘记写WHILE。

第1个回答  2012-07-14
如果是C51单片机
#include <reg52.h>
void main()
{
int i;
while(1)
{
for(i=0;i<7;i++)
{
//用移位和位与的方式来判断P0中是否有一位是高位
if(P0&(0x01<<i)
{ //P0有一位是高位时用count计数
count++;
if(count>=3)
{
//计到3时使能P2。0
count=0;
//使能P2
P2^0=1;
return ;
}
}

}
//如果找完一次P0口后都不够三个1 则进行下一次找描
P0=0x00; //

i=0;
}//while's end
}//main's end
思想就是不断的循环移位和位与的方式判断P0口,直到P0口有加到三个一的时候才跳出,写得不怎么好你自己根据需要去修改!本回答被网友采纳
第2个回答  2012-07-14
这样实现:
sbit P20=P2^0;
char ConSum=0;
char i,BitFlag=0x01;
for(i=0;i<8;i++)
{
if(P0&BitFlag) ConSum++;
BitFlag<<=1;
}
if(ConSum==3) P20=1;

希望我的回答对你有帮助,有什么问题欢迎一起探讨,谢谢。追问

谢谢你的回答,但是我有一个疑问:假如我是P0^1为1,只要这个P0^1维持一段时间,那么这个检测程序在这段时间内不断检查到的都为P0^1口的值,我是不是需要补上一个上端口状态的排除?如果需要我应该怎么写?

追答

留个联系方式,不太理解你的意思

追问

已留。

本回答被提问者采纳
第3个回答  2013-02-13
#include <reg52.h>
sbit P2_0 = P2^0;
void main()
{
unsigned char i, count;
while(1) {
count = 0;
for(i = 0; i < 8; i++) if(P0 & (1 << i)) count++; //P0有高位, count计数
P2_0 = (count >= 3);
}
}
第4个回答  2012-07-13
我认为你把有3个1的数都列出来组成数组,
TAB[a]={0X07,0X0E,0X1C,0X38,0X70,0XE0……}
然后再用for函数去查询对比。追问

每次P0口中只有一个为1,这个数组不行。另外数组要如何与P0对应起来,这也是个问题。

追答

你有没有做过流水灯,P0-=00001110这个是只有一个一吗。00000111.

追问

我的意思是:要求是只有一个为1,另外题目我简化了。实际上每个状态要对应的情况要复杂得多,用数组是一个优化方向,但是确实不好使。

第5个回答  2012-07-13
你的题目本身错误太多。
另外,你这种方法是不可行的。追问

我确实是个菜鸟……
题目是简化的,大意也是P0中总有一个为1,这个1是顺序流动的经过不断扫描,扫到3次1就使能给P2^0。
这个方法为什么不行,如果不行应该怎么写?

追答

C51中位变量不可被指针引用。所以不行。

正确的做法是每次取P0全端口值进行判断。

相似回答