51单片机__LED相关

51单片机__LED相关

单片机介绍

单片机,英文Micro Controller Unit,简称MCU

内部集成了CPU、RAM、ROM、定时器、中断系统、通讯接口等一系列电脑的常用硬件功能

单片机的任务是信息采集(依靠传感器)、处理(依靠CPU)和硬件设备(例如电机,LED等)的控制

单片机跟计算机相比,单片机算是一个袖珍版计算机,一个芯片就能构成完整的计算机系统。但在性能上,与计算机相差甚远,但单片机成本低、体积小、结构简单,在生活和工业控制领域大有所用

同时,学习使用单片机是了解计算机原理与结构的最佳选择

单片机应用

单片机的使用领域已十分广泛,如智能仪表、实时工控、通讯设备、导航系统、家用电器等。各种产品一旦用上了单片机,就能起到使产品升级换代的功效,常在产品名称前冠以形容词------"智能型",如智能型洗衣机等。

STC89C52单片机

开发板原理图和复位单路

创建工程并实现LED控制

1)点亮LED灯

观察原理图,LED灯低电平点亮,下面开始编写代码:

c 复制代码
#include <REGX52.H>

void main()
{
	P2 = 0;
}

// 现象:所有LED灯均被点亮

2)实现LED_1灯闪烁

延时方法与实现:

通过单片机驱动外围显示电路,为了能够让人眼识别到所显示内容的变化,需要保证所显示的内容有所停留。在单片机中,实现这一效果有两种方式,一种是通过C语言编写一段延时效果的程序或者子程序,实现该目的。另一种是调用单片机自带的定式/计数器,这里暂时使用第一种方式。

使用单片机烧录软件AiCube-ISP-v6.96A,生成一段500ms的延时函数。

c 复制代码
// 延时500ms
void Delay500ms(void)	//@11.0592MHz
{
	unsigned char data i, j, k;

	_nop_();
	i = 4;
	j = 129;
	k = 119;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}
c 复制代码
#include <REGX52.H>
#include <INTRINS.H>  // 解决 _nop_ 报错

// 延时500ms
void Delay500ms(void)	//@11.0592MHz
{
	unsigned char data i, j, k;

	_nop_();
	i = 4;
	j = 129;
	k = 119;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void main()
{
	while(1)
	{	
		P2 = 0xFE;     // 1111 1110
		Delay500ms();  // 延时0.5s
		P2 = 0xFF;     // 1111 1111
		Delay500ms();  // 延时0.5s
	}
}

// 现象: LED_1 闪烁,其他LED灯不亮

3)实现LED流水灯

第一种方式:使用数组实现流水灯效果

c 复制代码
#include <REGX52.H>
#include <INTRINS.H>  // 解决 _nop_ 报错


// 延时500ms
void Delay500ms(void)	//@11.0592MHz
{
	unsigned char data i, j, k;

	_nop_();
	i = 4;
	j = 129;
	k = 119;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

// 定义流水灯数组
unsigned char LedCode[] = {0xFE,0xFD,0xFB,0xF7,0Xef,0xDF,0xBF,0x7F};

void main()
{
	unsigned char i;
	while(1)
	{	
		for(i = 0;i < 8;i ++)
		{
			P2 = LedCode[i];
			Delay500ms();
		}
	}
}

// 现象:LED灯从低到高依次点亮

//附加内容:
//0xFE  1111 1110
//0xFD  1111 1101
//0xFB  1111 1011
//0xF7  1111 0111
//0Xef  1110 1111
//0xDF  1101 1111
//0xBF  1011 1111
//0x7F  0111 1111

第二种方式:左右移运算符实现

c 复制代码
#include <REGX52.H>
#include <INTRINS.H>  // 解决 _nop_ 报错


// 延时500ms
void Delay500ms(void)	//@11.0592MHz
{
	unsigned char data i, j, k;

	_nop_();
	i = 4;
	j = 129;
	k = 119;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


void main() {
    unsigned char Led = 0x01; // 0000 0001
    
    while(1) {
        P2 = ~Led;      // 取反,输出到P2端口
        Delay500ms();   // 延时500ms
        
        // 使用左移运算符
        Led = Led << 1;
        
        // 如果移到最右边,重新从最左边开始
        if(Led == 0x00) {
            Led = 0x01;
        }
    }
}

// 现象:LED灯从低到高依次点亮

第三种方式:循环左右移函数的调用

1. cror() - 循环右移函数

头文件: #include <intrins.h>
原型: unsigned char _cror_(unsigned char val, unsigned char n);

功能: 将 8 位数据循环右移 n 位,移出的位从左边补入

示例:

c 复制代码
unsigned char data = 0x81;  // 二进制:10000001
data = _cror_(data, 1);     // 结果:0xC0 (11000000)
// 原:10000001 → 右移1位 → 11000000

2. crol() - 循环左移函数

头文件: #include <intrins.h>
原型: unsigned char _crol_(unsigned char val, unsigned char n);

功能: 将 8 位数据循环左移 n 位,移出的位从右边补入

示例:

c 复制代码
unsigned char data = 0x81;  // 二进制:10000001
data = _crol_(data, 1);     // 结果:0x03 (00000011)
// 原:10000001 → 左移1位 → 00000011

流水灯应用示例:

c 复制代码
#include <REGX52.H>
#include <INTRINS.H>  // 解决 _nop_ 报错


// 延时500ms
void Delay500ms(void)	//@11.0592MHz
{
	unsigned char data i, j, k;

	_nop_();
	i = 4;
	j = 129;
	k = 119;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


void main() 
	{
		unsigned char aa;
		aa = 0xFE;  // 1111 1110
		
		while(1)
		{
			P2 = aa;
			Delay500ms();
			aa = _crol_(aa,1);  // 循环左移函数
		}

	}

// 现象:LED灯从低到高依次点亮

注意: 这两个函数是 C51 编译器特有,仅适用于 51 单片机开发。

综合练习:双向流水灯

c 复制代码
#include <REGX52.H>
#include <INTRINS.H>  // 包含移位函数头文件

// 延时500ms
void Delay500ms(void)	//@11.0592MHz
{
	unsigned char data i, j, k;

	_nop_();
	i = 4;
	j = 129;
	k = 119;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void main() 
{
    unsigned char aa;
    unsigned char direction = 0;  // 0:左移, 1:右移
    unsigned char counter = 0;    // 计数左移/右移的次数
    
    aa = 0xFE;  // 1111 1110,第一个灯亮
    
    while(1)
    {
        P2 = aa;
        Delay500ms();
        
        // 左移8次后改为右移
        if(direction == 0)
        {
            aa = _crol_(aa, 1);  // 循环左移
            counter++;
            
            if(counter >= 7)  // 左移7次后(共8个状态)
            {
                direction = 1;  // 改为右移方向
                counter = 0;    // 计数器清零
            }
        }
        // 右移8次后改为左移
        else
        {
            aa = _cror_(aa, 1);  // 循环右移
            counter++;
            
            if(counter >= 7)  // 右移7次后(共8个状态)
            {
                direction = 0;  // 改为左移方向
                counter = 0;    // 计数器清零
            }
        }
    }
}

// 现象:LED左右依次点亮
相关推荐
小郭团队3 分钟前
未来PLC会消失吗?会被嵌入式系统取代吗?
c语言·人工智能·python·嵌入式硬件·架构
Aaron15883 分钟前
全频段SDR干扰源模块设计
人工智能·嵌入式硬件·算法·fpga开发·硬件架构·信息与通信·基带工程
The_superstar610 分钟前
视觉模块与STM32进行串口通讯(匠心制作)
stm32·嵌入式硬件·mongodb·计算机视觉·串口通讯·视觉模块
Dillon Dong24 分钟前
STM32嵌入式:如何使用VSCode EIDE来获取flash块数据并转换成可视化的数据 来判断源头数据是否错误
vscode·stm32·嵌入式硬件
恒锐丰小吕24 分钟前
屹晶微 EG3113 600V高压、2A/2.5A驱动、自举半桥栅极驱动芯片技术解析
嵌入式硬件·硬件工程
小灰灰搞电子1 小时前
STM32L4 使用低功耗串口唤醒休眠状态源码分享
stm32·单片机·嵌入式硬件
不脱发的程序猿1 小时前
SPI、DSPI、QSPI技术对比
单片机·嵌入式硬件·嵌入式
金线银线还是铜线?10 小时前
米德方格MF9005/MF9006:低功耗光能利用的PMIC芯片解析
嵌入式硬件·物联网·iot·太阳能
Arciab11 小时前
51单片机_数码管显示
单片机·嵌入式硬件·51单片机
qq_4017004111 小时前
FreeRTOS用事件组替代全局变量实现同步
单片机