典中典之发光二极管,我从小学到大
长脚是正级,断脚是负极 里面大块的是负级,小块的是正极
电阻标注:
- 若标注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(); // 延时500msi <<= 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 0001if(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(); // 延时500msi <<= 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 0001if(ledNum > 0x80){ledNum = 0x01; }} }
}