天天看点

从无到有,学习单片机的第4天点亮第一个发光二极管22.3 while语句2.4 for语句及简单延时语句2.5 Keil仿真及延时语句的精确计算

点亮第一个发光二极管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语言中已经大致了解了,这里就在强调几点

  1. C语言中一般把“0”视为“假”,“非0”视为“真”,while的判断条件即“()”里面如果最后的结果是0或者判断为假,则不再执行while中的语句。
  2. while的内部语句可以为空,就是“{}”里面的东西,有时候甚至这个花括号都可以省略。但是要注意,如果花括号省略了,必须要在“()”后面加一个分号,例如

    while(1);

    ,否则系统会自动把紧跟着while的第一行代码当成while中的内容。
  3. 如果while的判断语句中只有一个1,那么单片机将一直执行while的内部语句
    while(1)
    {
        P1=0xfe;
    }
    
               
    如图,这个程序中,我们先判断while的表达式,这里是1,所以执行内部语句

    P1=0xfe;

    ,执行完了再次判断表达式,还是是1,所以再次执行内部语句。

    这里可以保持二极管一直发光,之前的

    P1^0=0

    也可以保持,但这里的单片机其实还在一直工作,一直在判断while是真是假,前面的程序执行了一次后,单片机就没有工作了。单片机只要它有电,有晶振在起振,就不会停止工作。

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--);        
  }
}
           
  1. 宏定义#define
    1. #define命令用它后面的第一个字母组合代替该字母组合后面的所有内容,这里就是用uint代替了unsigned int这一串字母,之后在这条宏定义后面的所有代码里,当我们打出了uint的时候,其实就是等同于unsigned int。

      uint i,j;

      其实就是相当于将i,j定义为无符号整型变量。
    2. 宏定义的后面是没有分号的。
    3. 对于同一个字母组合,宏定义只能定义一次,不能够二次定义,否则会导致重复定义的错误。

软件调试模式

在Keil中,有个软件调试模式(Keil仿真),里面有很多有用的功能。

首先得打开

从无到有,学习单片机的第4天点亮第一个发光二极管22.3 while语句2.4 for语句及简单延时语句2.5 Keil仿真及延时语句的精确计算

其中的12.0代表着笔者所设起来的晶振频率值,前面说过,晶振频率对代码的执行时间有关系,为了达到现实中的效果,我们得将仿真模式中的晶振频率调到和现实中的一样。

之后点击右上角的放大镜图标,跳出软件调试模式

从无到有,学习单片机的第4天点亮第一个发光二极管22.3 while语句2.4 for语句及简单延时语句2.5 Keil仿真及延时语句的精确计算

在该模式下,我们可以设置断点、单步、全速、进入某个函数内部运行程序,还可以查看变量变化过程,模拟硬件I/O口电平状态变化、查看代码执行时间等。

首先我们得熟悉调试按钮

从无到有,学习单片机的第4天点亮第一个发光二极管22.3 while语句2.4 for语句及简单延时语句2.5 Keil仿真及延时语句的精确计算
从无到有,学习单片机的第4天点亮第一个发光二极管22.3 while语句2.4 for语句及简单延时语句2.5 Keil仿真及延时语句的精确计算

——将程序复位到主函数的最开始处,准备重新运行程序

从无到有,学习单片机的第4天点亮第一个发光二极管22.3 while语句2.4 for语句及简单延时语句2.5 Keil仿真及延时语句的精确计算

——全速运行,运行程序时中间不停止

从无到有,学习单片机的第4天点亮第一个发光二极管22.3 while语句2.4 for语句及简单延时语句2.5 Keil仿真及延时语句的精确计算

——停止全速运行

从无到有,学习单片机的第4天点亮第一个发光二极管22.3 while语句2.4 for语句及简单延时语句2.5 Keil仿真及延时语句的精确计算

——进入子函数内部

从无到有,学习单片机的第4天点亮第一个发光二极管22.3 while语句2.4 for语句及简单延时语句2.5 Keil仿真及延时语句的精确计算

——单步执行代码,它不会进入子函数内部,会直接跳过

从无到有,学习单片机的第4天点亮第一个发光二极管22.3 while语句2.4 for语句及简单延时语句2.5 Keil仿真及延时语句的精确计算

——跳出当前进入的函数,只有进入子函数内部该按钮才会激活

从无到有,学习单片机的第4天点亮第一个发光二极管22.3 while语句2.4 for语句及简单延时语句2.5 Keil仿真及延时语句的精确计算

——程序运行之当前光标所在行

今天先这样啦,明天正式了解该模式

继续阅读