0.LED基础控制

典中典之发光二极管,我从小学到大

长脚是正级,断脚是负极 里面大块的是负级,小块的是正极

电阻标注:

  • 若标注102 -> 代表着为1K电阻(10^2)
  • 若标注473 -> 代表着为47K电阻(47 * 10^3)
    以此类推 其他器件标注也为类似模式

RP7 RP9模块为限流电阻
此单片机使用TTL规范(高电平5V 低电平0V)
要让上图LED亮,则引脚端要为低电平

单片机通过CPU访问寄存器,寄存器通过驱动器控制引脚,进而控制LED
单片机控制电路实则就是玩弄寄存器

C语言位运算

1. 点亮一个LED

#include <REGX52.H>

void main()
{
	//P2 = 0xFE;		// 1111 1110 
	P2 = 0x55;	// 0101 0101
	// 对变量进行赋值时使用16进制
	
	// 相当于终止对引脚的操作
	while(1)
	{
		
	}
}

其中0x代表16进制

2. 使LED闪烁

#include <REGX52.H>
#include <INTRINS.H>

// 使程序休眠500ms
void Delay500ms()		//@11.0592MHz
{
	unsigned char i, j, k;

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


void main()
{
	while(1)
	{
		P2 = 0xFE;
		Delay500ms();
		P2 = 0XFF;
		Delay500ms();
	}
}

3. 流水灯设计

#include <REGX52.H>
#include <INTRINS.H>

void Delay500ms()		//@11.0592MHz
{
	unsigned char i, j, k;

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

void main()
{
	 unsigned char i = 0x01;  // 初始化为0x01,即二进制的0000 0001,表示第一个LED先点亮
    while(1)
    {
        P2 = ~i;  // 将i的值输出到P2端口,控制LED灯的状态
        Delay500ms();  // 延时500ms
        i <<= 1;  // 将i左移一位,使下一个LED点亮
        if(i == 0x00)  // 如果i左移后变为0x00,说明已经循环了一圈
        {
            i = 0x01;  // 重新设置为0x01,从第一个LED开始
        }
    }
}

4. 使用独立按键控制LED亮灭

一个按键控制一个:

#include <REGX52.H>

void main()
{
	while(1)
	{
		if(P3_1 == 0)
		{
			P2_0 = 0;
		}
		else
		{
			P2_0 = 1;
		}
	}
}

5. 独立按键控制LED状态

#include <REGX52.H>
#include <INTRINS.H>

void Delay(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;
	while(xms)
	{
		_nop_();
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}
	

void main()
{
	while(1)
	{
		if(P3_1 == 0)
		{
			Delay(10);
			while(P3_1 == 0);
			Delay(10);
			P2_0 = ~P2_0;
		}
	}
}

在触发按键前后加上延时,可以去除按键抖动,使按键更加跟手
(低延迟男孩)

实现二进制计数

按一下按键记一次数

#include <REGX52.H>
#include <INTRINS.H>

void Delay(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;

	while(xms)
	{
		_nop_();
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}

void main()
{
	unsigned int ledNum = 0;
	while(1)
	{
		if(P3_1 == 0)
		{
			Delay(20);
			while(P3_1 == 0);
			Delay(20);
			
			ledNum++;
			P2 = ~ledNum;
		}		
	}	
}

6.实现按键控制LED移动

#include <REGX52.H>
#include <INTRINS.H>

void Delay(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;

	while(xms)
	{
		_nop_();
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}

void main()
{
	unsigned int ledNum = 0x01;
	while(1)
	{
		if(P3_1 == 0)
		{
			Delay(20);
			while(P3_1 == 0);
			Delay(20);
			
			P2 = ~ledNum;
			ledNum <<= 1;
			// 移至超出时复位
			// 0000 0001 -> 1000 0000 -> 0000 0001
			if(ledNum > 0x80)
			{
				ledNum = 0x01;	
			}
		}		
	}	
}

长脚是正级,断脚是负极 里面大块的是负级,小块的是正极

电阻标注:

  • 若标注102 -> 代表着为1K电阻(10^2)
  • 若标注473 -> 代表着为47K电阻(47 * 10^3)
    以此类推 其他器件标注也为类似模式

![[Pasted image 20250114171745.png]]
RP7 RP9模块为限流电阻
此单片机使用TTL规范(高电平5V 低电平0V)
要让上图LED亮,则引脚端要为低电平

单片机通过CPU访问寄存器,寄存器通过驱动器控制引脚,进而控制LED
单片机控制电路实则就是玩弄寄存器

C语言位运算

![[Pasted image 20250115111820.png]]

1. 点亮一个LED

#include <REGX52.H>

void main()
{
	//P2 = 0xFE;		// 1111 1110 
	P2 = 0x55;	// 0101 0101
	// 对变量进行赋值时使用16进制
	
	// 相当于终止对引脚的操作
	while(1)
	{
		
	}
}

其中0x代表16进制

2. 使LED闪烁

#include <REGX52.H>
#include <INTRINS.H>

// 使程序休眠500ms
void Delay500ms()		//@11.0592MHz
{
	unsigned char i, j, k;

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


void main()
{
	while(1)
	{
		P2 = 0xFE;
		Delay500ms();
		P2 = 0XFF;
		Delay500ms();
	}
}

3. 流水灯设计

#include <REGX52.H>
#include <INTRINS.H>

void Delay500ms()		//@11.0592MHz
{
	unsigned char i, j, k;

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

void main()
{
	 unsigned char i = 0x01;  // 初始化为0x01,即二进制的0000 0001,表示第一个LED先点亮
    while(1)
    {
        P2 = ~i;  // 将i的值输出到P2端口,控制LED灯的状态
        Delay500ms();  // 延时500ms
        i <<= 1;  // 将i左移一位,使下一个LED点亮
        if(i == 0x00)  // 如果i左移后变为0x00,说明已经循环了一圈
        {
            i = 0x01;  // 重新设置为0x01,从第一个LED开始
        }
    }
}

4. 使用独立按键控制LED亮灭

一个按键控制一个:

#include <REGX52.H>

void main()
{
	while(1)
	{
		if(P3_1 == 0)
		{
			P2_0 = 0;
		}
		else
		{
			P2_0 = 1;
		}
	}
}

5. 独立按键控制LED状态

![[Pasted image 20250115113351.png]]

#include <REGX52.H>
#include <INTRINS.H>

void Delay(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;
	while(xms)
	{
		_nop_();
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}
	

void main()
{
	while(1)
	{
		if(P3_1 == 0)
		{
			Delay(10);
			while(P3_1 == 0);
			Delay(10);
			P2_0 = ~P2_0;
		}
	}
}

在触发按键前后加上延时,可以去除按键抖动,使按键更加跟手
(低延迟男孩)

实现二进制计数

按一下按键记一次数

#include <REGX52.H>
#include <INTRINS.H>

void Delay(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;

	while(xms)
	{
		_nop_();
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}

void main()
{
	unsigned int ledNum = 0;
	while(1)
	{
		if(P3_1 == 0)
		{
			Delay(20);
			while(P3_1 == 0);
			Delay(20);
			
			ledNum++;
			P2 = ~ledNum;
		}		
	}	
}

6.实现按键控制LED移动

#include <REGX52.H>
#include <INTRINS.H>

void Delay(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;

	while(xms)
	{
		_nop_();
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}

void main()
{
	unsigned int ledNum = 0x01;
	while(1)
	{
		if(P3_1 == 0)
		{
			Delay(20);
			while(P3_1 == 0);
			Delay(20);
			
			P2 = ~ledNum;
			ledNum <<= 1;
			// 移至超出时复位
			// 0000 0001 -> 1000 0000 -> 0000 0001
			if(ledNum > 0x80)
			{
				ledNum = 0x01;	
			}
		}		
	}	
}
posted @ 2025-01-16 14:56  Lain_surime  阅读(77)  评论(0)    收藏  举报