C51问题,怎么样在一个程序给P0,P1口一同输出。

作者&投稿:扈货 (若有异议请与网页底部的电邮联系)
51单片机能否P0和P1口同一个数组操作~

我没猜错你的意思的话

for(i=0;i<8;i++)
{
P0=0xfe<<i; //意思就是从P0^0开始一直送低电平到P0^7,0XFE最低位向左移位
}
还有问题再讨论,希望采纳哈

你这个程序是对的。但是有一点忽略了:
P1口作为输入口,应该先置为ff

完整程序:
while(1)
{
P1=0xff;//这个就是忽略的地方
i=P1;
P0=i;
}

另外,下面这个也可以,以经过软件仿真通过。
P1=P0;

51单片机是8位机,数据输出一次最多8位,P0和P1口或P1和P2口是不可能同时输出的。只能采用16位的内部变量管理数据,然后分高8位和低8位分别输出,好在运算并不复杂。比如:
int temp;

P1 = temp%0x100; //得到temp变量的低8位,并从P1口输出
P2 = ((temp/0x100)%0x04); //得到temp变量的高8位,并得到其中的低2位。从P2口输出(另外P2口的高6位如果有用需根据情况特别处理)

由于51单片机是16位寻址,所以P0口和P2口倒是可以同时输出,不过需要外围电路配合,而且只能使用单片机自身的ROM。通过锁存的方式锁存地址信号,输出时比如使用XBYTE[temp]=0的语句,将temp变量内容以地址信号的方式在一条语句中同时送到P0(低8位地址)和P2(高8位地址)。此时其实是输出地址,不是输出数据了。这种方法没什么实用价值,属于钻牛角尖,只是如果能理解就说明对51单片机了解的比较深了。

uint x;//定义一个16位数
//你在程序中对x的值进行修改,之后
P1=x/0xff;//显示高8位
P0=x%0xff//显示低8位
//可以起到连续显示的效果,不知道你问的是这个不是

用2片锁存

关于C51单片机温度报警程序的问题 谁能帮我在每段程序后加汉字解释...
答:sbit led1=P1^7; //设置灯光报警键 sbit DQ=P2^4; //ds18b20端口 void init_ds18b20(void); //ds18b20初始化子程序 void delay(uchar); //ds18b20工作延时子程序 uchar readbyte(void);//向ds18b20读一个字节数据 /***/ void writebyte(uchar);//向ds18b20写一个字节数据 uint retemp();...

我在做一个单片机交通灯程序(c51),要求是控制一个十字路口的两组红...
答:给你一个思路:假设是单纯的红绿灯,无黄灯的话,设红灯30秒,绿灯30秒。需要两个状态量,方向Dir(1:东西,0:南北),东西灯颜色LightcolorEW,南北灯颜色LightcolorNS。此刻,东西方向亮红灯,则Dir=1,LightcolorEW=red,LightcolorNS=green。对相应端口赋值即可。只需要东西方向与南北方向相反。...

c51程序问题
答:P0=0中的0是二进制数,向左移5位并化为十六进制数后是0XOO。把-1化为二进制有符号数为10000001,向左移5为并化位十六进制数后是0XCO。向左移i位即在原来的数的右边加i个0,同理,向右移i位即在原来的数的左边加i个0,所以1向右移i位,永远是00000001。

C51的程序问题,高手请进
答:这是单片机串行口RS232发送程序 void systemstartdis(){ unsigned char i,*chr;//定义一个无符号的字符型i和指针chr chr=&buf_START1;//指针指向buf_START1,这个buf_START1应该是个待发送的数组 //在此函数之前 肯定已经定义了 不知你的原函数到底是什么 //总之,是个待发送的数组 for(i=0...

求一个c51产生500khz方波的程序
答:include <reg51.h>//用单片机产生方波 void InitTimer0(void){ TMOD = 0x01;// 改变方波周其 TH0=(65536-1)/256; //对TH0 TL0赋值1us TL0=(65536-1)%256;EA = 1;ET0 = 1;TR0 = 1;} void main(void){ InitTimer0();while(1); //无限循环 } void Timer0Interrupt(...

c51单片机程序运行顺序的问题?
答:A、当程序进入外部中断1时断开加热,这个时候只有等待到启动加热信号才跳出外部中断,那么其他程序都不执行了吗?比如这个时候收到启动语句6(异步电机正转信号)。是的,主循环在中断执行期间是不会得到执行的。问题:B、怎么样使语句1、for循环、语句6等等是并行运行的?按照你所写,for循环每30分钟才...

单片机C51问题:在中断子程序中产生中断会怎么样,如下描述:
答:在每个机器周期的s5p2期间,cpu对中断源依次采样,若遇到上述情况,会把中断请求锁存在各自的中断标志位中,等下一个机器周期再按顺序查询。也就是同级中断不会被打断,在这里TI已经被清零,这个中断退出后不会再响应了 还有点小问题,中断程序一开始应该执行一个if(RI)条件判断,要不然可能会读入垃圾...

IIC总线的C51程序中的个别指令的问题?
答:IIC总线系统中,任何一个IIC总线接口的外围器件,不论其功能差别有多大,都是通过串行数据线(SDA)和串行时钟线(SCL)连接到IIC总线上。这一特点给用户在设计应用系统中带来了极大的便利性。用户不必理解每个IIC总线接口器件的功能如何,只要将器件的SDA和SCL引脚连到IIC总线上,然后对该器件模块进行独立...

请问C51怎么实现通过定义一个按键,每按一次按键,数码管的值增加1,求C...
答:可以将按键接在一个IO引脚上,按键的另一端要接地或者接高电平。用一个if语句判断引脚的电平,比如P3_0通过一个按键接到地。程序可以如下:if(P3_0==0) //检测到按键按下 { delay(); //加一个延时函数,是为了消除按键抖动 例如for(i=0;i<1000;i++);if(P3_0==0) //...

用C51单片机设计一个指示灯闪烁程序,要求:亮1秒钟,灭2秒钟
答:include <reg51.h> sbit led=P1^0;unsigned char a;void init(){ TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;} void main(){ init();while(1){ if(a==60){ a=0;if(a<=20)led=0; //LED亮 else led=1; //LED灭 } } } void ...