在c51中P1 = temp; temp = _cror_(temp,1);为什么要用temp而不直接用P1

在c51中P1 = temp; temp = _cror_(temp,1);为什么要用temp而不直接用P1,第1张

虽然你的程序没有全部弄上来

但根据这几句可以分析出,temp是一个字符型变量

其功能可以理解为:跑马灯电路

temp可以被赋值为十六进制数,而十六进制数则是单片机中二进制数的表达方式

例如二进制 1111 1110,对应十六进制 FE,单片机中写法为 0xfe,点亮右边第一个发光管

二进制中的这8个数据位,则对应P1的8个IO端口

在你的程序中,开头的部分应该有一句 P1=0xfe 之类的语句

temp = _cror_(temp,1)

cror应该是移位函数,此句的意思为,将变量temp左移移位或右移移位

假设是左移,那么temp的值就变为 0xfd,即 1111 1101,则点亮右边第二个发光管

或temp的值变为 0xfc,即 1111 1100 ,点亮右边第一个和第二个发光管

再调用一次此函数,则又会移一位,temp变为0xfb或0xf8,即 1111 1011 或 1111 1000

点亮右边第三个或同时点亮第一二三个发光管,剩下的以此类推

所以直接用数值数据 1,无法达到此效果

#include<reg51h>

#define uchar unsigned char

uchar led=0xfe;

sbit kr=P3^2;

sbit kl=P3^3;

uchar key;

void delay(uchar a)

{

uchar i;

while(a--)for(i=0;i<120;i++);

}

void ext0() interrupt 0

{

key=1;

while(kr==0);

}

void ext1() interrupt 2

{

key=2;

while(kl==0);

}

main()

{

EX0=1;

EX1=1;

IT0=1;

IT1=1;

EA=1;

while(1)

    {

    if(key==1){P1=led;led=_cror_(led,1);}

    else if(key==2){P1=led;led=_crol_(led,1);}

    else P1=0xff;

    delay(200);

    }

}

org 0000h

ajmp start

org 0030h

start:

mov a,#0ffh ;

clr c ;

mov r2,#08h ;循环八次。

loop: rlc a ;带进位左移。

mov p1,a ;输出到P1口。

call delay ;延时一段时间

djnz r2,loop ;反复循环

mov r2,#07h ;再往回循环。

loop1: rrc a ;带进位右移

mov p1,a ;输出到P1口。

call delay ;延时一段时间

djnz r2,loop1 ;反复循环

jmp start ;重新开始

delay: mov r3,#20 ;延时子程序

d1: mov r4,#20

d2: mov r5,#248

djnz r5,$

djnz r4,d2

djnz r3,d1

ret

end

这段程序就是一个流水灯的程序,我只拣重要的给你大概解释一下:

这段程序的主要是先是循环7次左移,每次1位,然后右移,每次两位

P2=0×01 //给P2口赋初值

Delay MS (150) //这是一个延时子程序调用,这里延时150毫秒

P2=_crol-(P2,1); //这一句是 P2口的值左移1位

P2=_cror_(P2,2) //P2口的值右移2位

另外,你的这段代码错误不少,肯定无法通过编译,应改为:

#inclule<reg52h>

#inclule<intrinsh>

#define uchar unsigned char

#define uint unsigned int

void Delay MS (uint x)

{

uchar t;

while(x--)

{

for(t=120;t>0;t--);

}

}

void main()

{

uchar i;

P2=0x01;

while(1)

{

for(i=7;i>0;i--)

{

P2=_crol_(P2,1);

Delay MS(150);

}

for(i=7;i>0;i--)

{

P2=_cror_(P2,2);

Delay MS (150);

}

}

}

写程序时一定要养成良好的习惯,从你的代码中可以看出你仍不够认真,因为你在许多语句后面就丢掉了一个字符“;”,这很重要。

以上就是关于在c51中P1 = temp; temp = _cror_(temp,1);为什么要用temp而不直接用P1全部的内容,包括:在c51中P1 = temp; temp = _cror_(temp,1);为什么要用temp而不直接用P1、求一个程序,两个独立按键控制流水灯左右循环的程序,谢谢、单片机跑马灯程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9758745.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存