51单片机之流水灯(左移和右移)

文章目录


前言

利用51单片机,通过对CPU相关(特殊)寄存器的改写,说白了就是通过改变单片机的P2端口的高低电平进行改写,从而实现LED灯闪烁及流水灯的实现。


介绍

本次实验的目的是LED灯的点亮及实现流水灯左移和右移。

实验对象:一块普中51开发板

各个模块的原理图

 LED灯模块:

引脚从上到下依次是:P2.0~P7一共8个LED灯,LED灯洋阳极接电源电压VCC(+5V),阴极接的是上拉电阻,起到的是限流的作用,即电阻带着了部分电流,防止LED灯因通过的电流过大而烧坏。

51单片机最小系统:

这里选用最小系统的原因是因为完整的原理图有很多器件,而且都用不到,其次是因为避免与别的文章雷同。 所谓最小系统,即具有完整的功能,而且简洁。包括复位电路,晶振电路。

左移右移的思路

首先,我们必须得先知道,P2端口是一个8位的寄存器,相对应的也就是P2.0~P2.7共8个引脚,也就是说,这个8位寄存器里面的8个位置就分给了外面的8个引脚,而且是一一对应的关系。关键的部分来了,既然我们想控制这8个灯实现流水的功能,那我们就直接控制这个8位的寄存器不就行了吗?是吧,通过控制这个8位的寄存器,就可以控制LED灯,从而得到我们想要的结果。而我们还知道,想要一个LED实现灯亮,不就是改变LED灯引脚的电平不久行了嘛。实现LED灯亮的条件是什么,那不就是阳极给它一个高电平,阴极给它一个低电平吗。

完整代码

右移:

#include <reg52.h>	   //头文件
#define LED	P2;//将p2端口进行宏定义
typedef unsigned char u8;	//声明8位无符号无符号整形的变量
void delay(unsigned int i) //延时函数
{
 while(i--);
}
void main()		//主函数
{						   			
     u8 i=0;
     while(1)
     {
     		 for(i=0;i<8;i++) //循环流水
			 {
			   P2=~(0x01<<i); //0000 0001左移并取反,即右移
			   delay(50000);  //延时时间
			 } 
     }
}  

左移: 

#include <reg52.h>	   //头文件
#define LED	P2;//将p2端口进行宏定义
typedef unsigned char u8;	//声明8位无符号无符号整形的变量
void delay(unsigned int i) //延时函数
{
 while(i--);
}
void main()		//主函数
{						   			
     u8 i=0;
     while(1)
     {
     		 for(i=0;i<8;i++) //循环流水
			 {
			   P2=~(0x80>>i); //1000 0000右移并取反,即左移
			   delay(50000);  //延时时间
			 } 
     }
}  

使用库函数(#include <intrins.h> )来进行左移和右移

#include <reg52.h>	   //头文件
#include <intrins.h>    //左移右移库函数
#define LED	P2;//将p2端口进行宏定义
typedef unsigned char u8;	//声明8位无符号无符号整形的变量
void delay(unsigned int i) //延时函数
{
 while(i--);
}
void main()		//主函数
{						   			
     u8 i=0;	//赋值
	 P2=~0x01; //定义led灯
	 delay(50000);//延时
     while(1)
     {
     		 for(i=0;i<7;i++) //因为上面已经定义一个灯了,所以i<7而不是i<8
			 {
			   P2=_crol_(P2,1);//左移,对应单词left 
			   delay(50000);  //延时时间
			 }
			 	 for(i=0;i<7;i++) //循环流水
			 {
			   P2=_cror_(P2,1); //右移,对应单词right
			   delay(50000);  //延时时间
			 }  
     }
}  

 补充:

在Keil中,unsigned char u8是一种常见的数据类型定义方式,通常用于简化代码编写和提高代码的可移植性。具体来说:

u8的含义:

u8是一个自定义的数据类型,通常通过typedef`定义为`unsigned char。它表示一个8位无符号整数,范围是0 到 255。

定义方式:

在Keil环境中,u8通常是通过以下方式定义的: typedef unsigned char u8;
这种定义方式使得代码中可以直接使用u8来声明8位无符号整数类型的变量。

使用场景:

u8在嵌入式开发中非常常用,特别是在单片机编程中,用于表示较小的数值范围,节省内存。

它也便于代码的移植,因为u8的定义可以统一修改,而不需要逐个修改变量声明。

兼容性:

 在某些情况下,如果工程中没有定义u8,可能会导致编译错误。此时需要确保在工程中正确引入了包含u8定义的头文件。总的来说,unsigned char u8在Keil中是一种方便的类型定义方式,用于表示8位无符号整数。

效果图:


总结

第一次创作单片机的文章,如有不足,欢迎指出,感谢观看!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值