⑴ 51单片机LED左移完右移为什么不行
22行在while 里面,必然会循环执行,P0=~(1<<8),结果是 0xff,也就是没灯亮。
也就是说,在执行右移的时候,是先灭,亮第1颗,再灭一段时间,再右移下一颗,再灭一段时间,右移下一颗…………
#define LED_Num 8
if(cnt<LED_Num) P0=~(1<<cnt);
else P0=~(1<<(LED_Num-1<<1)-cnt);
for(i=0;i<30000;i++);
cnt=++cnt%(LED_Num-1<<1);
另外,以后不要用 延时函数了。
⑵ 请问C51单片机的循环左移和循环右移函数中的“循环”是指什么
C51单片机的循环左移函数是,_crol_(变量名,n),循环右移函数是,_cror_(变量名,n),函数中的“循环”是指变量的8位二进制数依次向左移一位,或向右移一位。
你比如的,取8位数,让1111 1110循环左移一位,就是在1111 1110、1111 1101、1111 1011、1111 0111、1110 1111,等等,每移位一次,8位数向左或向右移一位。继续移位,就会循环重复的。
⑶ 51单片机数码管右移程序的理解问题
while(1)
{
j++;
if(j==20) //用于移动完成后显示一段时间,这个程序上电时不会立即显示对吧
{
j=0;
if(0==k) //K == 0时,以下程序表示在数据全部移出显示的时候,对数码做清零操作,以便数字能够从左边开始向右移动
{
for(s=0;s<8;s++) //完全循环完成后清零所有缓冲区
TempData[s]=0x00;
}
TempData[7-i]=DuanMa[k]; //把需要显示的字符依次送缓冲区// 第一次 出来一个0,后面类推
TempData[8-i]=0x00; //不需要显示的区域清零//由于上条语句给TempData[7]给了0的断码,那么下次来的时候就要清掉,以保证只有一个数字移动。
i++;
if(i==(8-k)) //这里的不用解释了吧,8个数码管
{
i=0;
k++;
if(k==8)
k=0;
}
}
Display(0,8);//从第一位显示,共显示8位
}
⑷ 51单片机的c语言 左移右移怎么用想用来控制流水灯,请帮忙写个完整的c程序,参考下,端口随意
# include "reg51.h" // 包含头文件
#define uchar unsigned char
void delay02s(void) // 延时0.2s子程序
{
unsigned char i,j,k;
for ( i=2;i>0;i-- )
for (j=200;j>0;j-- )
for (k=250;k>0;k-- );
}
void main (void) // 主函数
{
uchar i,j;
while (1) // 死循环
{
j=0x01; // j初始化为0x01,左移初始值
for(i=0;i<8;i++) // for循环语句,完成8个循环
{
P1= ~ j; // 对变量j 中的值按位取反后,从P1口输出
delay02s( ); // 延时0.2s
j= j<<1; // 左移1位
}
j=0x80; // 设置右移初始值j为0x80
for (i=0;i<8;i++)
{
P1= ~ j;
delay02s( );
j= j>>1; // 右移1位
}
}
}
⑸ 51单片机执行循环右移指令的问题
我是这样想的,每个单元右移8位,然后四个单元右移,就是33H-30H,32H-33H,31H-32H,30H-31H,再左移8位,再单元左移,重复4次。
⑹ 用51单片机循环右移应该怎么实现
你的这个数是
0111
1111
1111
1111
1111
1111
1111
1111
0x7fffffff
已经超过了51单片机的表达范围,所以直接用命令是不行了,用一个算法吧。
⑺ 如何实现51单片机的按键k1按下,LED流水灯向右移动,按键k2被按下,LED流水灯向左移动
51单片机实现方法:
按键控制标志位flag取反。
然后把下面的代码放到循环里:
U8 temp0 = 1。
U8 temp1 = 0x80。
U8 i = 0。
if(flag == 1)。
{。
for(i=0;i<8;i++)。
{。
P1=temp0<<i。
}。
}。
else。
{。
for(i=0;i<8;i++)。
{。
P1=temp1>>i。
}。
}。
}。
对控制LED口的寄存器进行位操作,按k1左移,按K2就是右移了。
51单片机是对兼容英特尔8051指令系统的单片机的统称。51单片机广泛应用于家用电器、汽车、工业测控、通信设备中。因为51单片机的指令系统、内部结构相对简单,所以国内许多高校用其进行单片机入门教学。
51单片机的特点:
同样的一段程序,在各个单片机厂家的硬件上运行的结果都是一样的,如ATMEL的89C51(已经停产)、89S51,PHILIPS,和WINBOND等,我们常说的已经停产的89C51指的是ATMEL公司的AT89C51单片机。
同时是在原基础上增强了许多特性,如时钟,更优秀的是由Flash(程序存储器的内容至少可以改写1000次)存储器取代了原来的ROM(一次性写入),AT89C51的性能相对于8051已经算是非常优越的了。
⑻ 51单片机中,将R4、R5寄存器连接起来循环向右移位一次,怎么编这段程序
MOV A,R5
MOV C,ACC.0 ;先将R5的最低位存到CY
MOV A,R4
RRC A ;将R4带进位右移就可以将CY的值(R5的最低位)移到R4的最高位,同时也将R4的最低位移到CY
MOV R4,A
MOV A,R5
RRC A; 将R5带进位右移就可以将CY的值(R4的最低位)移到R5的最高位(同时也将R5的最低位移到CY)
MOV R5,A
⑼ 单片机 移位操作 右移 C语言
先说第一个问题:
比如用查表法将结果保存到变量i中,查表变量为x,则i=table[x],记住c语言里面数组是从0开始的,比如说上面的0x01就是table[0],0x02是table[1],以此类推。
再说第二个问题:
比如说从p1.0口发送出去,则可以写为
sbitout=p1^0;//定义out为p1.0口,这样今后好写程序
chari;
for(i=0;i<8;i++)
{
out=data&0x80;//因为高位在前,将它写成二进制就明白了
data<<=1;
}
上面的程序就能搞定了;
应该是所有的单片机都有cy位(不知道浮点dsp有没有);
c语言中左移和右移之后低位或高位自动补零,cy位也保持为零(视编译器而定,这个得看编译器手册),有些编译器提供了循环移位的函数;
还有什么不明白的补充问题就是
⑽ 51单片机中右移指令先后区别