AutoLeaders控制组—51单片机学习笔记(一)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


)


一、LED点亮

1.对LED模块的简单了解

在这里插入图片描述

在这里插入图片描述

根据原理图,可以得知:LED模块一端接VCC,一端接P2,而由单片机核心一图来说,P2端由连入CPU,再由一些简单的电路知识(LED要发光,就要有电流,两端就要有电压差),可以推出单片机是通过P2端来控制LED的。

由常识得知,计算机通常的1是高电平,0是低电平

所以:LED要发光,就要给低电平,即信号0

在这里插入图片描述
由头文件可以知道:P2端有多个分支,可以对具体分支进行控制

2.实现点亮

void main(){
	P2_1 = 0;
	
	while (1) {}
}

二、数码管显示

1.对数码管的简单了解

数码管:也称为LED数码管,基本单元是发光二极管(LED)。分为七段数码管和八段数码管(多一个小数点DP)。

  • 共阳数码管:所有LED的阳极连接到一起形成一个公共阳极接VCC,单片机需要控制某段LED的阴极为低电平时,相应led就会点亮
  • 共阴数码管:所有LED的阴极连接到一起形成一个公共阴极接GND,单片机需要控制某段LED的阳极为高电平,相应LED会点亮。
    在这里插入图片描述

2.数码管两个端口

在这里插入图片描述
在这里插入图片描述
这个原理与LED(小灯)是一样的,只不过这个是二维的,所以需要两个信号才能确定一个发光点;还有一个不一样,这里使用了上图的74HC138译码器

数码管的段是指8个发光位置,从上图可知,数码管可以看成二维,如果不先进行段选,那么所下达的信号(0/1),是一起传到8个发光位置的,这样就只能得到8个发光形状一样的数码管

为了实现不同位置的数码管发光形状不同,就要先段选。

  • 段选是通过74HC138译码器进行
  • 发光形状是由P0端进行的

1.P0端

在这里插入图片描述

在这里插入图片描述
stc89c52Rc是共阴极(个人理解是数码管连向74HC138端是阴极决定,即给0为选中)
所以P0端是给1发光(一边接正极,一边接负极,才能发光)
同时,从上图可知,每个管可以分成abcdefg dp,8部分,
而8根线又连向P0端,即通过P0端,可以控制abcdefg dp,从而实现图案

  • 高位对高位:eg:实现 “6” 的显示:abcd efg dp—>1011 1110(高电平有效)
    将其对应到缓冲器时(a—b依次从高到低)高位对高位1011 1110对应缓冲器左边P0_7~P0_0—>0111 1101

再将其转化为16进制
在这里插入图片描述
上面提到的缓冲器指的是双向数据缓冲器

双向数据缓冲器:在这里插入图片描述

  • OE:使能,低电平时AB导通
  • DIR:控制方向:在数码管控制中,为高电平,方向A—>B(实现方式:J21的LE与VCC连接)
  • 意义:使输入微弱信号成为控制信号,而数码管的灯再由VCC端重新引入
    电容作用:引入VCC端时滤波

2.74HC138端

138译码器作用(对数码管)是片选:3个输入分别CBA,从000~111 可以表示8个端口,对应图上Y0 ~ Y7

同时,该译码器为低电平有效:001—>1111 1110(为0表示选中)

3.实现发光

1.静态

void main(){
	P2_4 = 0;P2_3 = 0;P2_2 = 0;//段选
	P0 = 0x06;//p0端
	
	while (1) {}
}

数码管发光只有进行到发光函数时,才会发光,所以主函数要有while

2.动态

#include<INTRINS.H>
void Delay1ms(int a)		//@12.000MHz
{unsigned char i, j;
	while(a){
	i = 2;
	j = 239;
	do
	{
		while (--j);
	} while (--i);a--;}
	

}

 unsigned char vt[]={0X3F,0x06,0x5B,0x4F,0x66,
 0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
void dlight(unsigned char zx,unsigned char zp)
{
    switch (zx){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=vt[zp];

Delay1ms(1);
	P0=0x00;
				}

void main(){
	while (1) {dlight(1, 1);
	dlight(2, 2);
	dlight(3, 3);
	
	}
	
	
}

原理:利用人眼可见频数有限,只要灯闪烁频率过高,对人眼就有欺骗效果
注意:

  • 每次闪烁有2个过程:选段,选位
  • 那闪烁之间就需要消影
  • 先延迟一毫秒
    再P0=0x00

三,独立按键

在这里插入图片描述
信号0为关
即按下K1,p3_1=0(个人理解是CPU的P3端连接了VCC,不按时为VCC的电压,按下时,下拉为GND的低电压)

四,数码管与独立按键的配合使用

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

#include <REGX52.H>

static int flag=0;
int Delay(int a)		//@12.000MHz
{unsigned char i, j;
	while(a){
	i = 2;
	j = 239;
	do
	{
		while (--j);
	} while (--i);a--;}
	
return 1;
}
static unsigned char keynum=0;static unsigned char num=0;
unsigned char key()
{
if(P3_1==0){Delay(20);while(P3_1==0);Delay(20);keynum=1;}
if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);keynum=3;}
if(P3_3==0){Delay(20);while(P3_3==0);Delay(20);keynum=4;
if(flag!=4){num=0;};num++;}
if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);keynum=2;}

if(num>=11){num=1;}



return keynum;
}




 unsigned char vt[]={0X3F,0x06,0x5B,0x4F,0x66,
 0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x3E,0x00,0x40};
void dlight(unsigned char zx,unsigned char zp,unsigned time)
{
    switch (zx){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=vt[zp];

Delay(time);
	P0=0x00;
	
	
				}
void model1()
{flag=1;

dlight(1,16,1);
	dlight(2,1,1);
	dlight(7,0,1);
	dlight(8,1,1);

}


void model2()
{int i=0;flag=2;
	
	for(i=0;i<=10;i++){
	
			if(i<=9){int b=333;
		while(b){dlight(8,i,1);dlight(1,16,1);
dlight(2,2,1);b--;
	if(key()!=2){break;}}
    
	}
		else
		{int c=250;
while(c){dlight(7,1,1);dlight(8,0,1);dlight(1,16,1);
dlight(2,2,1);c--;if(key()!=2){break;}}}


	if(key()!=2){break;}
	
	}
	
	
}

void model3()
{int a=84;int b=84;flag=3;
	while(a){if(key()!=3){break;}
dlight(1,16,1);
dlight(2,3,1);dlight(7,0,1);
dlight(8,3,1);
	dlight(5,18,1);
dlight(6,18,1);a--;
	}	
		while(b){if(key()!=3){break;}
dlight(1,16,1);
dlight(2,3,1);dlight(7,0,1);
dlight(8,3,1);
	dlight(5,17,1);
dlight(6,17,1);b--;}
		
	}	
		



void model4(unsigned char num)
{if(flag!=4){num=0;}
if(num<=9){dlight(1,16);
dlight(2,4);
dlight(7,num,1);
dlight(8,num,1);}
flag=4;
}
	




void choice(unsigned char a)
{if(a==1){model1();}
if(a==2){model2();}
if(a==3){model3();}
if(a==4){model4(num-1);}



}

static unsigned char a;
void main()
{

while(1){a=key();
choice(a);
}
}
  • 38
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值