实验介绍:利用51单片机,通过对CPU中相关寄存器的改写,实现对开发板上的LED灯实现控制。
实验设备:普中51-实验开发板
实验目录:
1、点亮一个LED灯;
2、闪烁LED灯;
3、LED流水灯;
一、硬件部分
涉及LED灯的基本介绍,发光二极管,简称为LED,是一种常用的发光器件,其特点是单向导通,意思就是在LED两端形成压差,就能够使得LED发光。
下图为LED的符号图:当LED灯的正极接正电压,负极接负电压或接地时,LED便能够发光。
下图为开发板中LED模块,其中8个LED灯,采用的是贴片LED灯,其原理是与上面的相同。
二、原理图
下图为开发板上LED模块的电路图,如图所示,8个LED灯左端(正极)接入VCC,右端(负极)各接入一个电阻,此处的电阻起到的作用是限流,防止通路上的电流过大而烧毁LED,在电阻的右端,分别连接P20-P27接口。
在原理图的单片机核心部分,我们可以看到上述的P20-P27端,与单片机的P2.0-P2.7连接。
通过分析电路硬件图以及原理图,我们得到相应的操作,要是LED(以D1为例)发亮,现在正极已经接上VCC,只要使得负极接地(0V)处于低电平就能够点亮,其负极与单片机的P2.0相连。那么现在的目标就是使P2.0端口输出低电平即可,将问题转化为控制单片机引脚输出高低电平的问题。
在单片机中,CPU通过控制相关寄存器,寄存器通过驱动器来控制某个端子的高低电平,这也就是说,我们只要配置相应的CPU寄存器(P2寄存器)来实现我们的功能。
P2寄存器是一个八位寄存器,每个位分别控制一个LED灯,当某个位为0时(低电平)相应的LED灯就会发亮。
三、代码分享
1、点亮一个LED灯;
代码分享:
#include <REGX52.H>//52单片机头文件
void main()//定义一个主函数
{
P2=0xFE;//为P2寄存器赋值,采用16进制,其中0x为16进制标志,F为1111 E为1110
while(1);//while为一个循环,使代码始终停在这,不然单片机的运行速度很快,将代码跑完我们肉眼都看不清现象。
}
此处,代码如果看不懂,请参考我前面分享的C语言相关内容博客。
实验现象:
2、 闪烁LED灯;
在点亮一个LED灯后,我们提出稍微高的要求,使一个LED灯闪烁发光。其实原理一样,只需要在代码中修改一下,一会使它的输出口为0,一会使它的输出口为1(此处我们先不对闪烁的时间进行要求)。
代码分享:
#include <REGX52.H>//定义51单片机的头文件
int i;//定义整型变量i;
void main()//主函数
{
while(1)//使程序一直执行
{
i=50000;//定义i的大小,用于控制间隔时间
P2=0xFE;//点亮D1;
while(i--);
i=50000;
P2=0xFF;//使D1熄灭;
while(i--);
}
}
实验现象:
WeChat_20230924114417
3、LED流水灯
在使一个LED灯闪烁发光后,我们再提出稍微高的要求,使8个LED连续点亮。其实原理一样,只需要在代码中修改一下,分别使8个LED的接口输出低电平。
代码分享:
#include <REGX52.H>//定义52开发板头文件
#include <intrins.h>//定义包含左移函数的头文件
char c;//定义一个字符变量
int i;//定义一个整型变量
void main()//定义主函数
{
c=0xFe;//使字符变量中的值为1111 1110
while(1)//程序循环执行;
{
P2=c;//令P2寄存器为1111 1110
i=50000;//定义延迟时间
while(i--);
c=_crol_(c,1);//采用左移函数执行一次,1111 1110向左移一位
}
}
实验现象:
WeChat_20230924114353
此处,我们解释一下左移函数,_crol_是循环左移,_cror_是循环右移,后面写上变量的名称,以及移动的位数, c=_crol_(c,1),刚开c=1111 1110,执行一次后,循环左移c=1111 1101,执行两次后c=1111 1011;
本次为51单片机最基本的实验,大家阅读完后一定要自己尝试的做一做,这是最关键的,学习单片机一定要多试多做。加油!!!
创作不易,还请大家多多点赞支持。