51单片机学习之LED流水灯

LED模块硬件原理图
点亮LED的原理很简单,只要让P20-P27接入低电平即可。
在此主要记录此实验过程中遇到的问题和注意事项:

1.
#include “reg52.h”

#include “intrins.h”

typedef unsigned char u8;

#define led P2

void delay(u8 i)
{
while(i–);
}
void main()
{
u8 i;
led=0xfe;
delay(50000);
while(1)
{
for(i=0;i<7;i++)
{
led=crol(led,1);
delay(50000);
}
for(i=0;i<7;i++)
{
led=cror(led,1);
delay(50000);
}
}
}
这时实验现象为所有的LED小灯同是点亮,没有流水的效果。
解决方法:是“typedef unsigned char u8;”出了错误,经查阅,unsigned char 的取值范围是0-255,unsigned int 的取值范围是0-65535.而上面代码的delay()中出现了50000,超出了unsigned char的取值范围,所以在定义delay函数时,要将“u8 i”改为“u16 i”.这样就可以实现流水的效果了。
2.
延时函数,i=1时,大约延时10us.
本实验中i=50000;延迟大概是450000us(微妙)=450ms(毫秒)=0.45s
3.
crol(led,1) //led=0xfe=1111 1110*
循环一次led=0xfd=1111 1101
循环二次led=0xfb=1111 1011
和位运算不一样。
左移运算符(<<)规则
  按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。
语法格式:
需要移位的数字 << 移位的次数
  例如: 3 << 2,则是将数字3左移2位
计算过程:
3 << 2
  首先把3转换为二进制数字0000 0000 0000 0000 0000 0000 0000 0011,然后把该数字高位(左侧)的两个零移出,其他的数字都朝左平移2位,最后在低位(右侧)的两个空位补零。则得到的最终结果是0000 0000 0000 0000 0000 0000 0000 1100,则转换为十进制是12。
数学意义:
在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。
右移运算符(>>)规则:
按二进制形式把所有的数字向右移动对应位移位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1。
语法格式:
需要移位的数字 >> 移位的次数
  例如11 >> 2,则是将数字11右移2位
计算过程:
11的二进制形式为:0000 0000 0000 0000 0000 0000 0000 1011,然后把低位的最后两个数字移出,因为该数字是正数,所以在高位补零。则得到的最终结果是0000 0000 0000 0000 0000 0000 0000 0010。转换为十进制是2。
数学意义:
右移一位相当于除2,右移n位相当于除以2的n次方。
总结:相当于右移2位就把这个二进制数的最右侧2位拿掉,在最左端补0;
左移2位就把这个二进制数的最左端2位拿掉,在最右端补0.

猜你喜欢

转载自blog.csdn.net/weixin_43361544/article/details/84785506