太原理工大学机器人团队20天学习打卡day20(51单片机初步)
不定期更新
一切随缘(佛系ing)。
控制多个LED左移或者右移的程序1
控制多个LED左移的程序
#include<reg52.h>
void Delay(unsigned int t); //声明一个延时函数,t的范围为0到65535
void main()
{
unsigned char i; //定义一个无符号字符型变量,
P1=0xfe; //给P1口赋值,P1=FEH=11111110B
while(1)
{
for(i=0;i<8;i++)
{
Delay(6000); //将6000赋值给t。
P1=P1<<1; //这是本例子的重点,它表示爸P1端口的数值左移一位
//放在for循环里面,咱们品品就知道左移了8次,进行8次字节操作
P1|0x01; //给P1口最低位补1
}
P1=0xfe;
}
while(1) //一个循环结尾。----------------------①
{
}
}
/*下面是延时函数(也就是对delay声明的解释)*/
void Delay(unsigned int t)
{
while(--t); //当--t的值为0时候 判定为假。
}
现象
接通电源后 P1.0先亮,然后依次亮起(每次只要一个LED亮。)
以此周而复始。
对于①的解释以及一些说明
没有while(1);的话单片机程序执行到最后会从头开始执行。
如果希望程序执行后运行到某处停止,可以采用死循环。while(1);或者while(1){}。
在上面这个程序里面如果删除whlie(1){}
那现象就变为LED逐个点亮的过程不断重复。
控制多个LED左移或者右移的程序2
左移有了,那就再来个右移,它和左移还是有一些区别的。
#include<reg52.h>
void Delay(unsigned int t);
void main()
{
unsigned char i;
P1=0x7f; //给P1口赋值,P1=FEH=11111110B
while(1)
{
for(i=0;i<8;i++)
{
Delay(6000);
P1=P1>>1;
P1=P1|0x80;
}
P1=0x7f; //P1端口赋初值,最高位led点亮
}
while(1)
{
}
}
/*下面是延时函数(也就是对delay声明的解释)*/
void Delay(unsigned int t)
{
while(--t);
}
现象
最左端LED,也就是P1.7的开始逐个点亮(每次只要一个点亮)。
以此周而复始。
一些说明
在右移(高位往低位移动)前,先用P1=0x7f语句将最高位的LED点亮,然后用P1=P1>>1语句将P1的8位数右移一位,执行8次,每次执行后用P1=P1|0x80语句给P1最高位补1,8次执行完后,又用P1=0x7f语句将最高位的LED点亮,接着又执行for语句,如此循环反复。