点亮一个LED
LED灯模式图
VCC为电源正极 左边那些红色的字是网络标号(网络标号是一张电路图中线路的名称。 端口号是多张电路图为了能够标明连在一起的符号)
102表示电阻大小,电阻起到了限流电阻的作用
CPU通过配置的寄存器来控制电路,硬件电路执行想要完成的功能。
低电平为0;高电平为1
代码需要将二进制转化为十六进制X
void main()
{
p2=0xFE;//1111 1110
}
LED闪烁
#include <REGX52.H>
#include <INTRINS.H>
void Delay500ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 205;
k = 187;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
while(1)
{
P2=0xFE;
Delay500ms();
P2=0xFF;
Delay500ms();
}
}
LED流水灯
#include <REGX52.H>
#include <INTRINS.H>
void Delay500ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 205;
k = 187;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
int main()
{
while(1)
{
P2=0xFE; //1111 1110
Delay500ms();
P2=0xFD; //1111 1101
Delay500ms();
P2=0xFB; //1111 1011
Delay500ms();
P2=0xF7; //1111 0111
Delay500ms();
P2=0xEF; //1110 1111
Delay500ms();
P2=0xDF; //1101 1111
Delay500ms();
P2=0xBF; //1011 1111
Delay500ms();
P2=0x7F; //0111 1111
Delay500ms();
}
}
改良版
void Delay1ms(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
独立按键控制LED亮灭
按下四个连接
松开两边连接中间断开
独立按键开发板内部连接如下
将P2口配置为输出模式。通过设置相应的寄存器,将P2口配置为输出模式。
设置P2口输出电平。根据需要,将P2口的输出电平设置为高电平或低电平。通常情况下,高电平表示LED熄灭,低电平表示LED点亮。
连接LED。将LED的正极连接到P2口,将LED的负极连接到地(GND)。
控制LED状态。根据需要,改变P2口的输出电平,从而控制LED的亮灭状态。
单片机通电时所有IO口都是高电平
寄存器写一个值会送到IO口上,同样会检测IO口的电平读回来
按键松开,读寄存器,值为1;按下时读寄存器为0
#include <REGX52.H>
int main()
{
while(1)
{
if(P3_1==0) //K1接在了P31,直接读这个寄存器
{
P2_0=0;
}
else
{
P2_0=1;
}
}
}
独立按键控制LED状态
硬件消抖:通过电路过滤掉
软件处理:按键按下时延时20ms,松手时也延时20ms
#include <REGX52.H>
void Delay(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
int main()
{
while(1)
{
if(P3_1==0)
{
Delay(20); //如果P31是按下状态,那么延时20ms
while(P3_1==0); //按下不操作,松手才操作;while(P3_1==0)检测松手,不能不加
Delay(20); //松手以后,消除松手抖动
P2_0=~P2_0; //可以操作了,然后取反
}
}
}
独立按键控制LED显示二进制
int main()
{
unsigned char LEDNum=0; // 无符号字符型为0~255的8位二进制数据,表示一个寄存器
while(1)
{
if(P3_1==0)
{
Delay(20);
while(P3_1==0);
Delay(20);
LEDNum=++;
P2=~LEDNum;
}
}
}
独立按键控制LED移位
#include <REGX52.H>
void Delay(unsigned int xms);
unsigned char LEDNum;
int main()
{
while(1)
{
if(P3_1==0)
{
Delay(20);
while(P3_1==0);
Delay(20);
LEDNum++;
if(LEDNum>=8) // if语句如果只有一句,可以不用{}
LEDNum=0;
P2=~(0x01<<LEDNum) // P2是一个反向逻辑,给1是灭,给0是亮,所以取反
}
}
}
void Delay(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
#include <REGX52.H>
void Delay(unsigned int xms); //另一种声明方式
unsigned char LEDNum;
int main()
{
P2=~0x01;
while(1)
{
if(P3_1==0)
{
Delay(20);
while(P3_1==0);
Delay(20);
LEDNum++;
if(LEDNum>=8)
LEDNum=0;
P2=~(0x01<<LEDNum);
}
if(P3_0==0) // 开关是31 30 32 33
{
Delay(20);
while(P3_0==0);
Delay(20);
if(LEDNum==0) // 也需要越界判断,之前定义的是无符号char型,减到0再往下会有越界
LEDNum=7; // 先判断,才操作,如果已经为0,那么赋给最大值7
else
LEDNum--; // 不是真正的往右移,而是相对于前面的少往右移一位,相当于左移
P2=~(0x01<<LEDNum);
}
}
}
void Delay(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
静态数码管展示
A~G和一个字节的八位对应;引脚是“就近引出”
(共阴极接法和共阳极接法是两种不同的电路连接方式,它们在电平、连接方式以及应用领域上都有所区别。
共阴极接法:在此方法中,三相半波整流桥的负极(阴极)相连接,即都连接到负极。当使用此接法时,例如在PLC与驱动器的八段发光二极管中,所有二极管的阴极都连在一起,而阳极则分别控制各段。为了显示数字"6",您所描述的方法是正确的:3,8接地,然后A~DP输入10111110。这是因为当阴极为低电平时,输入的1会被视为高电平来驱动显示。
共阳极接法:此方法是将三相半波整流桥的正极(阳极)相连接,即都连接到正极。共阳极接法与共阴极的主要区别在于电平和连接方式。在共阳接法中,电源公共端接到电源正极,经过PLC内部的电流流出到外部开关上,当开关闭合时,光耦导通,PLC检测到就会把映射的信号传输出去。
要形成电势差并使某些部分显示特定的字符或数字,确实需要对电路进行正确的连接。在您的描述中,共阴极接法与共阳极接法之间的主要差异在于输入的段码数据是相反的。这确保了当某一侧为高电平时,另一侧为低电平,从而正确显示预期的数字或字符。)
如果要显示数字6,那么就需要把AFGEDC点亮:
对应共阴极接法图中,3,8接地,然后A~DP输入10111110(也叫段码),把这八个数据给单片机的IO口上,即可显示"6"
对应共阳极接法图中,3,8接Vcc,然后A~DP输入01000001(与共阴极相反)
四位一体数码管(四个大公共端引出,其余字母相同的管子连在一块,如所有A连一块,所有B连一块):
————————————————
版权声明:本文为CSDN博主「SHENAO1-Z」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_57218426/article/details/126396152
选中是哪个LED灯p2口,再将段码数据输入p0口,输出
文章来源:https://www.toymoban.com/news/detail-834860.html
把数码管的某一位显示某一个数字封装成一个子函数文章来源地址https://www.toymoban.com/news/detail-834860.html
#include <REGX52.H>
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; // 0-9的段码表
void Nixie(unsigned char Location,Number) // 数码管显示的子函数,两个参数:位置和数字
{
switch(Location)
{
case 1: P2_4=1; P2_3=1; P2_2=1; break;
case 2: P2_4=1; P2_3=1; P2_2=0; break;
case 3: P2_4=1; P2_3=0; P2_2=1; break;
case 4: P2_4=1; P2_3=0; P2_2=0; break;
case 5: P2_4=0; P2_3=1; P2_2=1; break;
case 6: P2_4=0; P2_3=1; P2_2=0; break;
case 7: P2_4=0; P2_3=0; P2_2=1; break;
case 8: P2_4=0; P2_3=0; P2_2=0; break;
}
P0=NixieTable[Number]; // P0的值即为要显示的数字
}
int main()
{
Nixie(2,3);
while(1)
{
}
}
动态数码管展示
#include <REGX52.H>
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void Delay(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
void Nixie(unsigned char Location,Number)
{
switch(Location)
{
case 1: P2_4=1; P2_3=1; P2_2=1; break;
case 2: P2_4=1; P2_3=1; P2_2=0; break;
case 3: P2_4=1; P2_3=0; P2_2=1; break;
case 4: P2_4=1; P2_3=0; P2_2=0; break;
case 5: P2_4=0; P2_3=1; P2_2=1; break;
case 6: P2_4=0; P2_3=1; P2_2=0; break;
case 7: P2_4=0; P2_3=0; P2_2=1; break;
case 8: P2_4=0; P2_3=0; P2_2=0; break;
}
P0=NixieTable[Number];
Delay(1);
P0=0x00;
}
int main()
{
while(1)
{
Nixie(1,1);
// Delay(20);
Nixie(2,2);
// Delay(20);
Nixie(3,3);
// Delay(20);
}
}
到了这里,关于AutoLeaders控制组——单片机学习笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!