前言
利用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位无符号整数。
效果图:
总结
第一次创作单片机的文章,如有不足,欢迎指出,感谢观看!