目录
一、前言
二、LED实验
2024年八月三号,编写
一、前言
本文为江科大学习笔记(多为自己的一些总结),初衷:感觉博客上面的笔记,代码中有好多错误(当然我这笔记肯定也有错误,指正出来我也会立刻改),另外也是为了方便自己复习。
二、LED实验
老师教了4个实验:2-1 点亮一个LED
2-2 LED闪烁
2-3 LED流水灯
2-4 LED流水灯plus
做实验之前,我们首先得分析原理图,如图2-1所示
图2-1
1、RP9、RP10就是电阻,不过是4个电阻并联在一起,再给封装起来。连电阻主要是为了限流,如果直接连接LED,电流过大的话,会对LED有损害,也就是防止电流过大
2、二进制只有1和0这两个数字,单片机只能读懂二进制,1表示高电平,0表示低电平;
3、VCC:表示电源正极,高电平(其实就是高电压)。我们可以看见图上绿色三角形,那个就是LED(也叫发光二极管),图上三角形左边(也就是宽的那一边连接电源正极),三角形右边(有个竖线那一边连接电源负极)。
所以P20-P27连接的是电源负极(这是控制LED关键的一个点),如果给P20-P27高电平,又VCC为高电平,这样就没有电势差(没有电流),LED就不会亮;相反,如果给P20-P27低电平,又VCC为高电平,这样就会有电势差(有电流),LED就会亮。那怎么给P20-P27高低电平呢,以下部分为详细说明。
CPU通过控制寄存器来控制硬件电路,硬件电路执行我们想要的功能。如图2-2所示,驱动器只是起到加大控制力度的作用。图中控制过程:CPU->寄存器->驱动器->P20-P27
具体来说,在LED这节课中,通过CPU控制寄存器的值(1/0,1对应高点平,0对应低电平),又通过驱动器加大控制力度,控制P20-P27输出高电平还是低电平,刚好和图2-1形成闭环,原理解释完毕。
寄存器(相当于存储器):每个寄存器含8个二进制位,一般每个寄存器是8位整体读写操作的(也就是说这8个二进制位是一个整体),//要是解释有错误或者不完整,欢迎指正
图2-2
2-1 点亮一个LED
有了上面的思路,CPU控制寄存器的值(1/0),控制P20-P27输出高电平还是低电平二进制
如果想控制第一个灯亮,C语言编码:P2=1111 1110;//控制P2引脚电平,也就是P20-P27
但是C语言识别不了二进制,因此,把二进制转变成十六进制,如图2-3所示
图2-3
1、二进制转变成十进制的方法在本节最后面;
2、十进制、十六进制:数字1-9没区别,数字10开始,10-A,11-B,12-C,13-D,14-E,15-F;本节课只需要记住前15数字就行了。另外,十六进制,还要加前缀0x,比如:十进制7,对应十六进制0x7;十进制15,对应十六进制0xF
3、有同学问我,我补充说明一下:1111 1111,从左到右依次为第八个灯递减至第一个灯,
比如:1111 1110,表示只有第1个灯亮;1110 1101,表示第2个灯和第5个灯亮
写法一
#include <REGX52.H>
void main()
{
P2=0x55; //FE 1111 1110 /* */ 55 0101 0101
}
写法二
#include <REGX52.H>
void main()
{
while(1)
{
P2=0x55; //FE 1111 1110 /* */ 55 0101 0101
}
}
写法三
#include <REGX52.H>
void main()
{
P2=0x55; //FE 1111 1110 /* */ 55 0101 0101
while(1)
{
}
}
2024年八月四号,编写
2-2 LED闪烁
闪烁,也就是在while循环中加入延时函数。具体来说,让灯亮一会,再让灯灭一会,如此反复循环。但是如果在while循环中只设置灯亮灯灭的程序,不设置延时时间的话,灯虽然也会亮和灭循环,但是肉眼是看不见的,只能看见灯一直亮。也就是说看不见LED闪烁
2-3 LED流水灯
流水灯,也是跟闪烁大同小异,也是在while循环中加入延时函数。具体来说,八个LED灯,在while循环中,设置每个灯亮一段时间(具体亮多少时间,也是在延时函数中设置的),这样每个灯都会亮一会再熄灭,一个接一个,就是流水灯的效果。
2-4 LED流水灯plus
注意,江科大老师在讲解2-2、2-3、2-4部分的时候,每一部分延时函数都用不同的方法写出来,这样在真正做项目的时候,也会不容易记,很可能到时候就忘了。现在我们直接用老师说的2-4部分延时函数的方法,也就是说只要在LED实验中用到了延时,我们直接用升级版的方法,还能实现让不同的灯,亮的时间不同。
通过上面说明,实验2-2、2-3、2-4,写起来就方便多了。如图2-4所示,为延时代码编写方法,打开STC-ISP,找到软件延时计算器,51单片机(STC89C52、STC89C52RC):系统频率都是12,定时长度直接设置1ms,第三步点击生成C代码,最后直接复制代码就行了。复制的代码,如图2-5所示
图2-4
图2-5
2-2 LED闪烁
添加完代码之后,如图2-6编写代码(不分先后顺序),void main为主程序,我们可以看到实现了LED的第一个灯的闪烁
图2-6
具体代码,如下(可直接复制,拿走不谢,只需要留个关注,点个赞就行哈)
#include <REGX52.H>
void Delay1ms(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while (xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
void main()
{
P2=0xFE; //1111 1110
Delay1ms(500);
P2=0xFF; //1111 1101
Delay1ms(500);
}
2-3 LED流水灯以及2-4流水灯plus(注意:2-3、2-4做的实验是一样的,老师上课做区分只是为了展示初级、高级方法,我们这里直接用高级方法),同上面2-2LED一样,代码如下
//LED流水灯,每个灯延时时间一样
#include <REGX52.H>
void Delay1ms(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while (xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
void main()
{
P2=0xFE; //1111 1110
Delay1ms(500);
P2=0xFD; //1111 1101
Delay1ms(500);
P2=0xFB; //1111 1011
Delay1ms(500);
P2=0xF7; //1111 0111
Delay1ms(500);
P2=0xEF; //1110 1111
Delay1ms(500);
P2=0xDF; //1101 1111
Delay1ms(500);
P2=0xBF; //1011 1111
Delay1ms(500);
P2=0x7F; //0111 1111
Delay1ms(500);
}
//LED流水灯,每个灯延时时间不一样
#include <REGX52.H>
void Delay1ms(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while (xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
void main()
{
P2=0xFE; //1111 1110
Delay1ms(1000);
P2=0xFD; //1111 1101
Delay1ms(1000);
P2=0xFB; //1111 1011
Delay1ms(1000);
P2=0xF7; //1111 0111
Delay1ms(500);
P2=0xEF; //1110 1111
Delay1ms(500);
P2=0xDF; //1101 1111
Delay1ms(500);
P2=0xBF; //1011 1111
Delay1ms(500);
P2=0x7F; //0111 1111
Delay1ms(500);
}
上面代码中:unsigned int xms,xms相当于a这种变量。上课时,老师写xms,我以为x是变量,ms是单位,并不是的,xms是一个整体,你也可以这样定义:unsigned int a。另外,unsigned int和int类似,都是定义整数;区别是,int定义整数可以有负数,unsigned int没有负数只有0和正整数,因为这里定义的是时间,时间是没有负数的,所以用unsigned int来定义。
LED点灯这节也就说完了,当然还有个知识点没说,二进制转十进制或者十六进制,见下图:
图2-7