提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
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);
}
}