AutoLeaders控制组——单片机学习笔记

点亮一个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;按下时读寄存器为0cpu连接如图,按下则接地,5v变0v,寄存器通过检测高低电平检测按键是否被按下

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#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口,输出
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
把数码管的某一位显示某一个数字封装成一个子函数

#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);
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值