点亮第一个发光二极管2
昨天因为STC-ISP的问题,折腾了一个晚上,所以昨天没有更新,今天多写一点
接上一篇笔记
按照之前的代码,如果我们要点亮多个发光二极管的时候,我们需要定义多个I/O口,那么显得及其麻烦,今天介绍一种总线操作法。
我们在原有的工程里面在新建一个文件,然后删掉原来的文件,因为一个工程中只能有一个主函数。
输入新的语句
#include <reg52.h> //52系列单片机头文件
void main()
{
P1=0xaa;
}
这里的
P1=0xaa
是对单片机的8个I/O口同时进行操作。在前面的笔记中我们了解到,对于单片机来说,1和0代表着高电平和低电平,当某个I/O口为0,即低电平的状态下,对应的发光二极管就会发亮,这个原因是发光二极管一端连着单片机色I/O口,一端连着电阻,电阻的另一端连着Vcc,即电源,5V,为了让电流通过发光二极管,肯定要I/O口是低电平,即0。0xaa,是个十六进制数,转换成二进制数位10101010,这个二进制数从最小位开始对应P1^0口,所以这时候是1、3、5、7管亮,2、4、6、8管灭。如果想单单第一个发光二极管发亮,我们就应该输入
P1=0xfe
,转换成二进制数就是,11111110,这时候,P1口为低电平,第一个二极管点亮。
总线操作法适用于同时控制多个端口的情况,但是要注意对每个口的控制是要在十六进制那个数中体现出来。
2.3 while语句
针对while语句,在C语言中已经大致了解了,这里就在强调几点
- C语言中一般把“0”视为“假”,“非0”视为“真”,while的判断条件即“()”里面如果最后的结果是0或者判断为假,则不再执行while中的语句。
- while的内部语句可以为空,就是“{}”里面的东西,有时候甚至这个花括号都可以省略。但是要注意,如果花括号省略了,必须要在“()”后面加一个分号,例如
,否则系统会自动把紧跟着while的第一行代码当成while中的内容。while(1);
- 如果while的判断语句中只有一个1,那么单片机将一直执行while的内部语句
如图,这个程序中,我们先判断while的表达式,这里是1,所以执行内部语句while(1) { P1=0xfe; }
P1=0xfe;
,执行完了再次判断表达式,还是是1,所以再次执行内部语句。
这里可以保持二极管一直发光,之前的
也可以保持,但这里的单片机其实还在一直工作,一直在判断while是真是假,前面的程序执行了一次后,单片机就没有工作了。单片机只要它有电,有晶振在起振,就不会停止工作。P1^0=0
2.4 for语句及简单延时语句
for的格式就不再赘述了,在c语言中已经学过。
在keil中,for语句往往被用来写成延时语句。通俗的来说,单片机中晶振是用来控制每条代码执行的时间的,晶振的频率越高,代码执行的越快,但是总归是有个时间的,于是我们可以利用这一事实,多次重复for语句,从而达到大致的时间控制效果。
例如
unsigned char i,j;
for (i=100;i>0;i--)
for(j=200;j>0;j--);
在这里,我们在第一层for语句中有嵌套了一层for语句,每当对i的判断进行一次,我们就要将下面的for语句判断执行200次,这样有上万次的判断执行,积累出了相当长的时间,以至于人眼可以判断出停顿了。当然,如果想时间再长一点,我们就可以让for语句重复的次数更加多,不过要注意的是,我们在定义变量以及确定时间的时候,要确保变量的取值在范围内,别定义i为字符型变量,最大位255,你给我整个
i=256
出来。
2.5 Keil仿真及延时语句的精确计算
在keil中输入以下代码;
#include <reg52.h>
#define uint unsigned int //宏定义
sbit led1=P1^0; //声明单片机P1口的第一位
uint i,j;
void main()
{
while(1)
{
led1=0;
for (i=1000;i>0;i--) //延时
for(j=110;j>0;j--);
led1=1;
for (i=1000;i>0;i--)
for(j=110;j>0;j--);
}
}
- 宏定义#define
- #define命令用它后面的第一个字母组合代替该字母组合后面的所有内容,这里就是用uint代替了unsigned int这一串字母,之后在这条宏定义后面的所有代码里,当我们打出了uint的时候,其实就是等同于unsigned int。
其实就是相当于将i,j定义为无符号整型变量。uint i,j;
- 宏定义的后面是没有分号的。
- 对于同一个字母组合,宏定义只能定义一次,不能够二次定义,否则会导致重复定义的错误。
- #define命令用它后面的第一个字母组合代替该字母组合后面的所有内容,这里就是用uint代替了unsigned int这一串字母,之后在这条宏定义后面的所有代码里,当我们打出了uint的时候,其实就是等同于unsigned int。
软件调试模式
在Keil中,有个软件调试模式(Keil仿真),里面有很多有用的功能。
首先得打开
其中的12.0代表着笔者所设起来的晶振频率值,前面说过,晶振频率对代码的执行时间有关系,为了达到现实中的效果,我们得将仿真模式中的晶振频率调到和现实中的一样。
之后点击右上角的放大镜图标,跳出软件调试模式
在该模式下,我们可以设置断点、单步、全速、进入某个函数内部运行程序,还可以查看变量变化过程,模拟硬件I/O口电平状态变化、查看代码执行时间等。
首先我们得熟悉调试按钮
——将程序复位到主函数的最开始处,准备重新运行程序
——全速运行,运行程序时中间不停止
——停止全速运行
——进入子函数内部
——单步执行代码,它不会进入子函数内部,会直接跳过
——跳出当前进入的函数,只有进入子函数内部该按钮才会激活
——程序运行之当前光标所在行
今天先这样啦,明天正式了解该模式