典中典之发光二极管,我从小学到大
长脚是正级,断脚是负极 里面大块的是负级,小块的是正极
电阻标注:
- 若标注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;
}
}
}
}
标签:P2,控制,LED,--,void,基础,unsigned,while,include
From: https://www.cnblogs.com/surime/p/18674989