打印
[51单片机]

从业十年,教你单片机入门基础。(连载)

[复制链接]
楼主: jianhong_wu
手机看帖
扫描二维码
随时随地手机跟帖
161
乐逍遥6| | 2015-9-11 11:12 | 只看该作者 回帖奖励 |倒序浏览
顶个

使用特权

评论回复
162
sun5304| | 2015-9-11 14:08 | 只看该作者
感谢老师的教程:handshake

使用特权

评论回复
163
jianhong_wu|  楼主 | 2015-9-13 09:01 | 只看该作者
第三十六节:括号改变优先级。
        C语言的加减乘除,与或取反,左移右移等运算符是有严格优先级顺序的,但是我本人**力有限,做项目哪能记住这么多优先级的前后顺序,只是大概明白乘除的优先级比加减的优先级高,其它方面真的记不住那么多,怎么办?为了确保万一,我用到了括号。
       括号的用法跟我们日常的数据运算公式的用法一直,先运行括号里面的运算,再执行其它运算。比如:
a=a<<2+5;
       到底是先把变量a左移2位后再加5,还是先2加5等于7再让变量a左移7位?对于像我这样不能熟记C语言运算优先级顺序的人,这条语句很容易让我搞混。但是加上括号就明了:
a=(a<<2)+5;
a=a<<(2+5);
      不用多说,加上括号后,上述两行代码传递了清晰的优先级顺序。再看一个例子:
c=1+3*c;
      到底是1加3的结果再乘以变量c,还是3乘以变量c的结果再加1?因为我记得乘除法的优先级比加减法的优先级高,所以答案是3乘以变量c的结果再加1。对于初学者,为了避免出错,可以加上括号就更加清晰了,比如:
c=(1+3)*c;
c=1+(3*c);
      加括号后,优先级顺序一目了然。

      现在编写一个程序来练习刚才讲到的主要内容,最后把程序编译后下载到坚鸿51学习板观察结果。请直接复制第十节模板程序,修改的main程序代码如下:


void main() //主程序
{
/*---C语言学习区域的开始---------------------------------------------------------------------------*/
        
  unsigned char a=0x01;
  unsigned char b=0x01;

  unsigned char c=0x02;
  unsigned char d=0x02;


  a=(a<<2)+5;  //a左移2位后变成4,再加5等于9
  b=b<<(2+5);  //2加5等于7,b再左移动7位等于128

  c=(1+3)*c;  //1加3等于4,再乘以变量c等于8
  d=1+(3*d);  //3乘以d等于6,再加1等于7

        
  GuiWdData0=a;   //把a这个变量放到窗口变量0里面显示
  GuiWdData1=b;   //把b这个变量放到窗口变量1里面显示
  GuiWdData2=c;   //把c这个变量放到窗口变量2里面显示
  GuiWdData3=d;   //把d这个变量放到窗口变量3里面显示

        
/*---C语言学习区域的结束---------------------------------------------------------------------------*/
   while(1)  
   {
      initial();
      key_service();
      display_service();
   }

}

        查看运算结果的方法。如何在坚鸿51学习板上观察变量?按下S1或者S5按键即可切换显示不同的窗口,从而显示不同的变量。按下S9按键不松手就可以切换到十六进制的显示界面,松开手后会自动切换到十进制的界面。16个LED灯显示的就是当前变量的二进制数,亮代表1,灭代表0。上坚鸿51学习板观察程序执行的结果如下:
       变量a为9。
       变量b为128。
       变量c为8。
       变量d为7。
      下节预告:if判断语句和等于关系符“==”。
     (未完待续)


使用特权

评论回复
164
jianhong_wu|  楼主 | 2015-9-20 07:13 | 只看该作者
第三十七节:if判断语句以及常量变量真假的判断。
        “if”是C语言的判断语句关键词,意思是如果if小括号里面的条件满足,就执行条件后面大括号里的语句;如果条件不满足,则直接跳过条件后面大括号里的语句。“if”语句的常见格式如下:
if(条件)
{
    语句1;
    语句2;
    语句3;
……
}
        还有一种省略大括号的书写格式,但是要注意,当if条件语句后面省略了大括号时,如果if小括号里面的条件满足,仅仅执行条件后面第一条语句,如果条件不满足,则跳过条件后面第一条语句。比如:
if(条件)
    语句1;
    语句2;
    语句3;
……
       上述格式省略了大括号,实际上默认相当于:
if(条件)
{
    语句1;
}
    语句2;
    语句3;
……
       上述语句分析:当条件满足时,就执行语句1,如果不满足,就跳过语句1,直接从语句2处开始往后执行。在实际项目中,为了阅读清晰,建议大家不要省略大括号。
        接着讲另一个新的知识点,对于if(条件),if语句的条件包含两种,一种是常量或者变量真假的判断,另一种是关系判断。本节内容先举例讲常量或变量的判断。比如:
if(常量或者变量)
{
    语句1;
    语句2;
}
    语句3;
    语句4;
……
        当小括号里面的常量或者变量大于0时,就代表小括号里面的条件满足;当小括号里面的常量或者变量等于0时,就代表小括号里面的条件不满足。还有一种专业的说法,条件满足称之为“真”,条件不满足称之为“假”。在这里,常量或者变量大于0称之为“真”,等于0称之为“假”。还可以换一种思路来**,常量或者变量不等于0称之为“真”,等于0称之为“假”。比如刚才的例子:
if(常量或者变量)
{
    语句1;
    语句2;
}
    语句3;
    语句4;
……
        若条件为真,则从语句1处开始执行,若条件为假,则跳过语句1和语句2,直接从语句3开始执行。
        现在编写一个程序,有5条if判断语句,如果条件为真,累加统计变量就会自动加1,最后看看条件为真的语句有几条。最后把程序编译后下载到坚鸿51学习板观察结果。请直接复制第十节模板程序,修改的main程序代码如下:

void main() //主程序
{
/*---C语言学习区域的开始---------------------------------------------------------------------------*/
        
  unsigned char x=2;
  unsigned char y=0;
  unsigned char a=0;  //此变量统计有多少条语句是真的

  if(1)      //常量大于0,因此为真
  {
     a=a+1;  //a由0自加1后变成1。
  }


  if(0)   //常量等于0,因此为假
  {
     a=a+1;  //由于条件为假,这条语句没有被执行,因此此时a仍然是1
  }


  if(15)     //常量大于0,因此为真
  {
     a=a+1;  //a由1自加1后变成2。
  }



  if(x)     //变量x为2,大于0,因此为真
  {
     a=a+1;  //a由,2自加1后变成3。
  }


  if(y)     //变量y为0,等于0,因此为假
  {
     a=a+1;  //由于条件为假,这条语句没有被执行,因此此时a仍然是3
  }
        
  GuiWdData0=a;   //把a这个变量放到窗口变量0里面显示

        
/*---C语言学习区域的结束---------------------------------------------------------------------------*/
   while(1)  
   {
      initial();
      key_service();
      display_service();
   }

}

        查看运算结果的方法。如何在坚鸿51学习板上观察变量?按下S1或者S5按键即可切换显示不同的窗口,从而显示不同的变量。按下S9按键不松手就可以切换到十六进制的显示界面,松开手后会自动切换到十进制的界面。16个LED灯显示的就是当前变量的二进制数,亮代表1,灭代表0。上坚鸿51学习板观察程序执行的结果如下:
         变量a为3。
         下节预告:等于关系符“==”和不等于关系符“!=”。
(未完待续)

使用特权

评论回复
165
jianhong_wu|  楼主 | 2015-9-26 10:02 | 只看该作者
第三十八节:等于关系符“==”和不等于关系符“!=”。
       上一节讲了if(条件)语句中当条件是纯常量或者变量的情况,这节开始讲if语句的关系判断。要进行关系判断,就涉及到关系符语句。本节先讲等于关系符“==”和不等于关系符“!=”。
        一. 等于关系符“==”语句。
      (1)等于关系符“==”语句的常见格式如下:
if(常量或变量==常量或变量)
{
    语句1;
    语句2;
}
语句3;
……
语句N;
        上述格式的含义是:如果等于号”==”左边的数确实等于右边的数,就执行大括号里的语句1和语句2;如果左右的数不相等,直接跳过大括号里的语句1和语句2,从语句3开始继续往下执行。
if语句省略大括号时的执行顺序上一节已经讲过了,本节和以后的章节就不再重复讲这方面的内容。
        (2)被判断的左右两个数中,如果有一个数是常量,另外一个是变量,针对这种情况建议大家尽量把常量放在等于号“==”的左边,原因是:万一程序员不小心把等于号“==”误写成赋值符号“=”时,编译器在编译时,能及时报错,因为常量在左边是无法赋值的,编译器能及时发现错误。但是如果变量在左边,因为变量是允许赋值的,所以有一些C语言编译器未必会报错,就会留下不易察觉的程序隐患。比如:
    if(a==5)
{
    语句1;
}
建议改成
    if(5==a)
{
    语句1;
}
         二. 不等于关系符“!=”语句。
        (1)不等于关系符“!=”语句的常见格式如下:
if(常量或变量!=常量或变量)
{
    语句1;
    语句2;
}
语句3;
……
语句N;
        上述格式的含义是:如果不等于号”!=”左边的数确实不等于右边的数,就执行大括号里的语句1和语句2;如果左右的数恰好相等,就直接跳过大括号里的语句1和语句2,从语句3开始继续往下执行。
       (2)被判断的左右两个数中,如果有一个数是常量,另外一个是变量,针对这种情况建议大家尽量把常量放在不等于号“!=”的左边,原因是:万一程序员不小心把不等于号“!=”误写成赋值符号“=”时,编译器在编译时,能及时报错,因为常量在左边是无法赋值的,编译器能及时发现错误。但是如果变量在左边,因为变量是允许赋值的,所以有一些C语言编译器未必会报错,就会留下不易察觉的程序隐患。比如:
    if(a!=5)
{
    语句1;
}
建议改成
    if(5!=a)
{
    语句1;
}

        现在编写一个实验程序,一共有8个给定的数,要统计其中数值等于85的数有几个,统计其中数值不等于75的数有几个。最后把程序编译后下载到坚鸿51学习板观察结果。请直接复制第十节模板程序,修改的main程序代码如下:

void main() //主程序
{
/*---C语言学习区域的开始---------------------------------------------------------------------------*/
  unsigned char x1=90; //给定的第1个数     
  unsigned char x2=65; //给定的第2个数   
  unsigned char x3=85; //给定的第3个数   
  unsigned char x4=79; //给定的第4个数   
  unsigned char x5=95; //给定的第5个数   
  unsigned char x6=65; //给定的第6个数   
  unsigned char x7=75; //给定的第7个数   
  unsigned char x8=85; //给定的第8个数  

  unsigned char a=0; //统计等于85的变量总数
  unsigned char b=0; //统计不等于75的变量总数

  if(85==x1)  //把常量85放在等于号的左边
  {
     a++;   //相当于a=a+1,用来统计等于85的总数
  }

  if(85==x2)  //把常量85放在等于号的左边
  {
     a++;   //相当于a=a+1,用来统计等于85的总数
  }


  if(85==x3)  //把常量85放在等于号的左边
  {
     a++;   //相当于a=a+1,用来统计等于85的总数
  }


  if(85==x4)  //把常量85放在等于号的左边
  {
     a++;   //相当于a=a+1,用来统计等于85的总数
  }


  if(85==x5)  //把常量85放在等于号的左边
  {
     a++;   //相当于a=a+1,用来统计等于85的总数
  }


  if(85==x6)  //把常量85放在等于号的左边
  {
     a++;   //相当于a=a+1,用来统计等于85的总数
  }


  if(85==x7)  //把常量85放在等于号的左边
  {
     a++;   //相当于a=a+1,用来统计等于85的总数
  }


  if(85==x8)  //把常量85放在等于号的左边
  {
     a++;   //相当于a=a+1,用来统计等于85的总数
  }



  if(75!=x1)  //把常量75放在不等于号的左边
  {
     b++;   //相当于b=b+1,用来统计不等于75的总数
  }


  if(75!=x2)  //把常量75放在不等于号的左边
  {
     b++;   //相当于b=b+1,用来统计不等于75的总数
  }



  if(75!=x3)  //把常量75放在不等于号的左边
  {
     b++;   //相当于b=b+1,用来统计不等于75的总数
  }



  if(75!=x4)  //把常量75放在不等于号的左边
  {
     b++;   //相当于b=b+1,用来统计不等于75的总数
  }




  if(75!=x5)  //把常量75放在不等于号的左边
  {
     b++;   //相当于b=b+1,用来统计不等于75的总数
  }


  if(75!=x6)  //把常量75放在不等于号的左边
  {
     b++;   //相当于b=b+1,用来统计不等于75的总数
  }



  if(75!=x7)  //把常量75放在不等于号的左边
  {
     b++;   //相当于b=b+1,用来统计不等于75的总数
  }



  if(75!=x8)  //把常量75放在不等于号的左边
  {
     b++;   //相当于b=b+1,用来统计不等于75的总数
  }

      
  GuiWdData0=a;   //把a这个变量放到窗口变量0里面显示
  GuiWdData1=b;   //把b这个变量放到窗口变量1里面显示
  
        
/*---C语言学习区域的结束---------------------------------------------------------------------------*/
   while(1)  
   {
                  initial();
      key_service();
      display_service();
   }

}

查看运算结果的方法。如何在坚鸿51学习板上观察变量?按下S1或者S5按键即可切换显示不同的窗口,从而显示不同的变量。按下S9按键不松手就可以切换到十六进制的显示界面,松开手后会自动切换到十进制的界面。16个LED灯显示的就是当前变量的二进制数,亮代表1,灭代表0。上坚鸿51学习板观察程序执行的结果如下:
         变量a为2。(等于85的有x3,x8这2个)
         变量b为7。(不等于75的有x1,x2,x3,x4,x5,x6,x8这7个)
         下节预告:大于关系符“>”和大于等于关系符“>=”。
(未完待续)


使用特权

评论回复
166
乐逍遥6| | 2015-9-29 11:37 | 只看该作者

使用特权

评论回复
167
jianhong_wu|  楼主 | 2015-10-4 09:28 | 只看该作者
本帖最后由 jianhong_wu 于 2015-10-4 10:26 编辑

第三十九节:大于关系符“>”和大于等于关系符“>=”。
        一. 再复习一遍if语句的通用格式:
if(条件)
{
    语句1;
    语句2;
}
语句3;
……
语句N;
       上述格式的含义是:如果if语句里的条件满足(为真),就执行大括号里的语句1和语句2;如果条件不满足(为假),直接跳过大括号里的语句1和语句2,从语句3开始继续往下执行。
if语句省略大括号时的执行顺序前面章节已经讲过了,本节和以后的章节就不再重复讲这方面的内容。
        二. 大于关系符“>”语句。
if(常量或变量>常量或变量)
       上述if条件的真假判断规则是:如果左边的数大于右边的数,此条件为真(条件满足)。否则,为假(条件不满足)。
        三. 大于等于关系符“>=”语句。
if(常量或变量>=常量或变量)
       上述if条件的真假判断规则是:如果左边的数大于或者等于右边的数,此条件为真(条件满足)。否则,为假(条件不满足)。
        现在编写一个实验程序,一共有8个给定的数,要统计其中数值大于79的数有几个,统计其中数值大于等于79的数有几个。最后把程序编译后下载到坚鸿51学习板观察结果。请直接复制第十节模板程序,修改的main程序代码如下:
void main() //主程序
{
/*---C语言学习区域的开始---------------------------------------------------------------------------*/
  unsigned char x1=90; //给定的第1个数     
  unsigned char x2=65; //给定的第2个数   
  unsigned char x3=85; //给定的第3个数   
  unsigned char x4=79; //给定的第4个数   
  unsigned char x5=95; //给定的第5个数   
  unsigned char x6=65; //给定的第6个数   
  unsigned char x7=75; //给定的第7个数   
  unsigned char x8=85; //给定的第8个数  

  unsigned char a=0; //统计大于79的变量总数
  unsigned char b=0; //统计大于等于79的变量总数



  if(x1>79)  //如果条件为真,则执行下面大括号里面的语句。
  {
     a++;   //相当于a=a+1,用来统计大于79的总数
  }


  if(x2>79)  //如果条件为真,则执行下面大括号里面的语句。
  {
     a++;   //相当于a=a+1,用来统计大于79的总数
  }


  if(x3>79)  //如果条件为真,则执行下面大括号里面的语句。
  {
     a++;   //相当于a=a+1,用来统计大于79的总数
  }

  if(x4>79)  //如果条件为真,则执行下面大括号里面的语句。
  {
     a++;   //相当于a=a+1,用来统计大于79的总数
  }


  if(x5>79)  //如果条件为真,则执行下面大括号里面的语句。
  {
     a++;   //相当于a=a+1,用来统计大于79的总数
  }


  if(x6>79)  //如果条件为真,则执行下面大括号里面的语句。
  {
     a++;   //相当于a=a+1,用来统计大于79的总数
  }


  if(x7>79)  //如果条件为真,则执行下面大括号里面的语句。
  {
     a++;   //相当于a=a+1,用来统计大于79的总数
  }

  if(x8>79)  //如果条件为真,则执行下面大括号里面的语句。
  {
     a++;   //相当于a=a+1,用来统计大于79的总数
  }


  if(x1>=79)  //如果条件为真,则执行下面大括号里面的语句。
  {
     b++;   //相当于b=b+1,用来统计大于等于79的总数
  }


  if(x2>=79)  //如果条件为真,则执行下面大括号里面的语句。
  {
     b++;   //相当于b=b+1,用来统计大于等于79的总数
  }


  if(x3>=79)  //如果条件为真,则执行下面大括号里面的语句。
  {
     b++;   //相当于b=b+1,用来统计大于等于79的总数
  }
      

  if(x4>=79)  //如果条件为真,则执行下面大括号里面的语句。
  {
     b++;   //相当于b=b+1,用来统计大于等于79的总数
  }


  if(x5>=79)  //如果条件为真,则执行下面大括号里面的语句。
  {
     b++;   //相当于b=b+1,用来统计大于等于79的总数
  }


  if(x6>=79)  //如果条件为真,则执行下面大括号里面的语句。
  {
     b++;   //相当于b=b+1,用来统计大于等于79的总数
  }


  if(x7>=79)  //如果条件为真,则执行下面大括号里面的语句。
  {
     b++;   //相当于b=b+1,用来统计大于等于79的总数
  }
      

  if(x8>=79)  //如果条件为真,则执行下面大括号里面的语句。
  {
     b++;   //相当于b=b+1,用来统计大于等于79的总数
  }

      
  GuiWdData0=a;   //把a这个变量放到窗口变量0里面显示
  GuiWdData1=b;   //把b这个变量放到窗口变量1里面显示
  
        
/*---C语言学习区域的结束---------------------------------------------------------------------------*/
   while(1)  
   {
                  initial();
      key_service();
      display_service();
   }

}

       查看运算结果的方法。如何在坚鸿51学习板上观察变量?按下S1或者S5按键即可切换显示不同的窗口,从而显示不同的变量。按下S9按键不松手就可以切换到十六进制的显示界面,松开手后会自动切换到十进制的界面。16个LED灯显示的就是当前变量的二进制数,亮代表1,灭代表0。上坚鸿51学习板观察程序执行的结果如下:
        变量a为4。(大于79的有x1,x3, x5,x8这4个)
        变量b为5。(大于等于79的有x1,x3, x4, x5,x8这5个)
        下节预告:小于关系符“<”和小于等于关系符“<=”。
(未完待续)

使用特权

评论回复
168
jianhong_wu|  楼主 | 2015-10-4 10:48 | 只看该作者
第四十节:小于关系符“<”和小于等于关系符“<=”。
        一. 小于关系符“<”语句。
if(常量或变量<常量或变量)
       上述if条件的真假判断规则是:如果左边的数小于右边的数,此条件为真(条件满足)。否则,为假(条件不满足)。
        二. 小于等于关系符“<=”语句。
if(常量或变量<=常量或变量)
       上述if条件的真假判断规则是:如果左边的数小于或者等于右边的数,此条件为真(条件满足)。否则,为假(条件不满足)。
        现在编写一个实验程序,一共有8个给定的数,要统计其中数值小于79的数有几个,统计其中数值小于等于79的数有几个。最后把程序编译后下载到坚鸿51学习板观察结果。请直接复制第十节模板程序,修改的main程序代码如下:

void main() //主程序
{
/*---C语言学习区域的开始---------------------------------------------------------------------------*/
  unsigned char x1=90; //给定的第1个数     
  unsigned char x2=65; //给定的第2个数   
  unsigned char x3=85; //给定的第3个数   
  unsigned char x4=79; //给定的第4个数   
  unsigned char x5=95; //给定的第5个数   
  unsigned char x6=65; //给定的第6个数   
  unsigned char x7=75; //给定的第7个数   
  unsigned char x8=85; //给定的第8个数  

  unsigned char a=0; //统计小于79的变量总数
  unsigned char b=0; //统计小于等于79的变量总数


  if(x1<79)  //如果条件为真,则执行下面大括号里面的语句。
  {
     a++;   //相当于a=a+1,用来统计小于79的总数
  }

  if(x2<79)  //如果条件为真,则执行下面大括号里面的语句。
  {
     a++;   //相当于a=a+1,用来统计小于79的总数
  }

  if(x3<79)  //如果条件为真,则执行下面大括号里面的语句。
  {
     a++;   //相当于a=a+1,用来统计小于79的总数
  }

  if(x4<79)  //如果条件为真,则执行下面大括号里面的语句。
  {
     a++;   //相当于a=a+1,用来统计小于79的总数
  }

  if(x5<79)  //如果条件为真,则执行下面大括号里面的语句。
  {
     a++;   //相当于a=a+1,用来统计小于79的总数
  }

  if(x6<79)  //如果条件为真,则执行下面大括号里面的语句。
  {
     a++;   //相当于a=a+1,用来统计小于79的总数
  }

  if(x7<79)  //如果条件为真,则执行下面大括号里面的语句。
  {
     a++;   //相当于a=a+1,用来统计小于79的总数
  }

  if(x8<79)  //如果条件为真,则执行下面大括号里面的语句。
  {
     a++;   //相当于a=a+1,用来统计小于79的总数
  }

  if(x1<=79)  //如果条件为真,则执行下面大括号里面的语句。
  {
     b++;   //相当于b=b+1,用来统计小于等于79的总数
  }


  if(x2<=79)  //如果条件为真,则执行下面大括号里面的语句。
  {
     b++;   //相当于b=b+1,用来统计小于等于79的总数
  }


  if(x3<=79)  //如果条件为真,则执行下面大括号里面的语句。
  {
     b++;   //相当于b=b+1,用来统计小于等于79的总数
  }

  
  if(x4<=79)  //如果条件为真,则执行下面大括号里面的语句。
  {
     b++;   //相当于b=b+1,用来统计小于等于79的总数
  }

  if(x5<=79)  //如果条件为真,则执行下面大括号里面的语句。
  {
     b++;   //相当于b=b+1,用来统计小于等于79的总数
  }


  if(x6<=79)  //如果条件为真,则执行下面大括号里面的语句。
  {
     b++;   //相当于b=b+1,用来统计小于等于79的总数
  }


  if(x7<=79)  //如果条件为真,则执行下面大括号里面的语句。
  {
     b++;   //相当于b=b+1,用来统计小于等于79的总数
  }

  
  if(x8<=79)  //如果条件为真,则执行下面大括号里面的语句。
  {
     b++;   //相当于b=b+1,用来统计小于等于79的总数
  }
      
  GuiWdData0=a;   //把a这个变量放到窗口变量0里面显示
  GuiWdData1=b;   //把b这个变量放到窗口变量1里面显示
  
        
/*---C语言学习区域的结束---------------------------------------------------------------------------*/
   while(1)  
   {
                  initial();
      key_service();
      display_service();
   }

}

        查看运算结果的方法。如何在坚鸿51学习板上观察变量?按下S1或者S5按键即可切换显示不同的窗口,从而显示不同的变量。按下S9按键不松手就可以切换到十六进制的显示界面,松开手后会自动切换到十进制的界面。16个LED灯显示的就是当前变量的二进制数,亮代表1,灭代表0。上坚鸿51学习板观察程序执行的结果如下:
         变量a为3。(小于79的有x2,x6, x7这3个)
         变量b为4。(小于等于79的有x2, x4,x6, x7这4个)

         下节预告:与“&&”,或“||”的关系符。
(未完待续)

使用特权

评论回复
169
乐逍遥6| | 2015-10-5 13:43 | 只看该作者

使用特权

评论回复
170
jianhong_wu|  楼主 | 2015-10-11 07:15 | 只看该作者
第四十一节:与“&&”,或“||”的关系符。
       一.前面第30,31节内容讲了运算符的与或“&”“|”,它们与本节关系符的与或“&&”“||”有相似之处,同时又有什么区别呢?
     (1)一个叫运算符,一个叫关系符。
     (2)运算符是在一个变量二进制的位与位之间进行1和0的运算(1为真,0为假),而关系符是强调两个以上条件判断的整体与整体之间进行真和假的判断运算。
     (3)运算符的书写符号是“&”“|”, 关系符的书写符号是“&&”“||”。
      二.与“&&”语句。它的中文表达含义是:假如有两个条件判断,既满足第1个条件判断,又满足第2个条件判断,则此整体判断裁定为真(条件满足)。否则,只要一个条件判断不满足,此整体判断就裁定为假(条件不满足)。比如:
if(第1个条件判断&&第2个条件判断…&&第N个条件判断)
      在上述if括号的条件中,如果所有的关系判断都为真,则此整体判断为真(条件满足),否则,只要有一个关系判断为假,则此整体判断为假(条件不满足)。
      比如要取从70到80之间的所有数据,那么既要大于等于70,同时又要小于等于80,因此可以这样书写:
if(a>=70&&a<=80)
{
   语句1;
语句2;
……
语句N;
}
      三.或“||”语句。它的中文表达含义是:假如有两个条件判断,只要有一个条件判断为真,则此整体判断裁定为真(条件满足)。否则,必须所有的条件判断都不满足,此整体判断才会裁定为假(条件不满足)。比如:
if(第1个条件判断||第2个条件判断…||第N个条件判断)
      在上述if括号的条件中,只要有1个条件判断为真,此整体判断就裁定为真。否则,必须所有的条件判断为假,此整体判断才裁定为假。
      比如要取除了70到80之间以外的所有数据,也就是要么小于70,或者要么大于80,可以这样写:
if(a<70||a>80)
{
   语句1;
语句2;
……
语句N;
}

       现在编写一个实验程序,一共有8个给定的数,要统计其中数值从70到80之间的数有几个,统计其中取除了70到80之间以外的数有几个。最后把程序编译后下载到坚鸿51学习板观察结果。请直接复制第十节模板程序,修改的main程序代码如下:

void main() //主程序
{
/*---C语言学习区域的开始---------------------------------------------------------------------------*/
  unsigned char x1=90; //给定的第1个数     
  unsigned char x2=65; //给定的第2个数   
  unsigned char x3=85; //给定的第3个数   
  unsigned char x4=79; //给定的第4个数   
  unsigned char x5=95; //给定的第5个数   
  unsigned char x6=65; //给定的第6个数   
  unsigned char x7=75; //给定的第7个数   
  unsigned char x8=85; //给定的第8个数  

  unsigned char a=0; //统计从70到80的变量总数
  unsigned char b=0; //统计除了70到80以外的变量总数


  if(x1>=70&&x1<=80)  //如果条件为真,则执行下面大括号里面的语句。
  {
     a++;   //相当于a=a+1,用来统计从70到80的总数
  }


  if(x2>=70&&x2<=80)  //如果条件为真,则执行下面大括号里面的语句。
  {
     a++;   //相当于a=a+1,用来统计从70到80的总数
  }


  if(x3>=70&&x3<=80)  //如果条件为真,则执行下面大括号里面的语句。
  {
     a++;   //相当于a=a+1,用来统计从70到80的总数
  }

  if(x4>=70&&x4<=80)  //如果条件为真,则执行下面大括号里面的语句。
  {
     a++;   //相当于a=a+1,用来统计从70到80的总数
  }

  if(x5>=70&&x5<=80)  //如果条件为真,则执行下面大括号里面的语句。
  {
     a++;   //相当于a=a+1,用来统计从70到80的总数
  }


  if(x6>=70&&x6<=80)  //如果条件为真,则执行下面大括号里面的语句。
  {
     a++;   //相当于a=a+1,用来统计从70到80的总数
  }


  if(x7>=70&&x7<=80)  //如果条件为真,则执行下面大括号里面的语句。
  {
     a++;   //相当于a=a+1,用来统计从70到80的总数
  }

  if(x8>=70&&x8<=80)  //如果条件为真,则执行下面大括号里面的语句。
  {
     a++;   //相当于a=a+1,用来统计从70到80的总数
  }

  if(x1<70||x1>80)  //如果条件为真,则执行下面大括号里面的语句。
  {
     b++;   //相当于b=b+1,用来统计除了70到80以外的总数
  }

  if(x2<70||x2>80)  //如果条件为真,则执行下面大括号里面的语句。
  {
     b++;   //相当于b=b+1,用来统计除了70到80以外的总数
  }

  if(x3<70||x3>80)  //如果条件为真,则执行下面大括号里面的语句。
  {
     b++;   //相当于b=b+1,用来统计除了70到80以外的总数
  }

  if(x4<70||x4>80)  //如果条件为真,则执行下面大括号里面的语句。
  {
     b++;   //相当于b=b+1,用来统计除了70到80以外的总数
  }

  if(x5<70||x5>80)  //如果条件为真,则执行下面大括号里面的语句。
  {
     b++;   //相当于b=b+1,用来统计除了70到80以外的总数
  }

  if(x6<70||x6>80)  //如果条件为真,则执行下面大括号里面的语句。
  {
     b++;   //相当于b=b+1,用来统计除了70到80以外的总数
  }

  if(x7<70||x7>80)  //如果条件为真,则执行下面大括号里面的语句。
  {
     b++;   //相当于b=b+1,用来统计除了70到80以外的总数
  }

  if(x8<70||x8>80)  //如果条件为真,则执行下面大括号里面的语句。
  {
     b++;   //相当于b=b+1,用来统计除了70到80以外的总数
  }

      
  GuiWdData0=a;   //把a这个变量放到窗口变量0里面显示
  GuiWdData1=b;   //把b这个变量放到窗口变量1里面显示
  
        
/*---C语言学习区域的结束---------------------------------------------------------------------------*/
   while(1)  
   {
                  initial();
      key_service();
      display_service();
   }

}

       查看运算结果的方法。如何在坚鸿51学习板上观察变量?按下S1或者S5按键即可切换显示不同的窗口,从而显示不同的变量。按下S9按键不松手就可以切换到十六进制的显示界面,松开手后会自动切换到十进制的界面。16个LED灯显示的就是当前变量的二进制数,亮代表1,灭代表0。上坚鸿51学习板观察程序执行的结果如下:
        变量a为2。(数值从70到80之间的有x4, x7这2个)
        变量b为6。(除了70到80之间以外的有x1, x2,x3,x5, x6, x8这6个)
        下节预告:括号改变判断的优先级。
(未完待续)

使用特权

评论回复
171
乐逍遥6| | 2015-10-15 08:53 | 只看该作者
追帖中

使用特权

评论回复
172
炽天使11233| | 2015-10-16 14:34 | 只看该作者
楼主真的是个好人,持续追帖中

使用特权

评论回复
173
jianhong_wu|  楼主 | 2015-10-18 07:01 | 只看该作者
第四十二节:小括号改变判断的优先级。
       小括号如何改变判断优先级? C语言有规定,凡是在判断语句里插入了小括号,程序就会优先执行最里面小括号的判断语句,之后才会根据判断符的优先级执行其它相关语句。
       小括号的意义何在?C语言中的判断符号众多,非常不利于程序员对各符号优先级的**,小括号却解决了这个问题。小括号因为可以改变判断的优先级,所以为实际项目带来了两个好处:一个是明确判断顺序,一个是改变判断顺序。
       比如在上一节提到的两个判断语:
if(a>=70&&a<=80)和if(a<70||a>80)
       有一些朋友喜欢插入两个小括号变成:
if((a>=70)&&(a<=80))和if((a<70)||(a>80))
       上述的修改,在不知道 “>,>=,<,<=” 这类语句跟 “&&,||” 这类语句哪个优先级更高的前提下,插入了小括号,可以更加明确判断的顺序,这种做法也挺好的,值得肯定。我个人平时在面对“>,>=,<,<=”这类语句跟 “&&,||” 这类语句时,也就是针对上述那种情况,由于我比较肯定的清楚“>,>=,<,<=”这类语句比“&&,||” 这类语句的优先级高,所以我不需要在此插入小括号来明确判断顺序。但是在下面将要提到的这种情况,我是会百分百插入小括号来明确和改变判断的顺序。什么情况呢?如下:
       if(判断条件1  ||  判断条件2  &&  判断条件3)
       到底是先“判断条件1” 跟“判断条件2”相或,最后再跟“判断条件3”相与?还是先“判断条件2” 跟“判断条件3”相与,最后再跟“判断条件1”相或?此时应该插入小括号明确它们判断的先后顺序。
       要么第一种顺序:
if((判断条件1  ||  判断条件2)  &&  判断条件3)
       要么第二种顺序:
if(判断条件1  ||  (判断条件2  &&  判断条件3))
       具体选择哪种一种判断顺序要根据项目的需要来决定。同样的3个判断条件,如果判断的顺序不一样,那么结果也可能出现不一样,比如,上述判断条件:
假设“判断条件1”为真,
假设“判断条件2”为真,
假设“判断条件3”为假,
        第一种顺序:
if((真||  真)  &&  假)
分析结论:先”真”和”真”相或结果为”真”,然后再把第一步判断结果的”真”和”假”相与,最后结果是”假”。
        第二种顺序:
if(真||  (真  &&  假))
分析结论:先”真”和” 假”相与结果为” 假”,然后再把第一步判断结果的” 假”和”真”相或,最后结果是”真”。
        现在编写一个实验程序验证上述两种判断顺序,最后把程序编译后下载到坚鸿51学习板观察结果。请直接复制第十节模板程序,修改的main程序代码如下:

void main() //主程序
{
/*---C语言学习区域的开始---------------------------------------------------------------------------*/
        
  //x,y这三个变量作为条件判断的变量
  unsigned char x=5;
  unsigned char y=6;
  
  //a,b这两个变量作为输出判断结果的真假,0代表假,1代表真。
  unsigned char a=0;  //默认为0,也就是默认为假
  unsigned char b=0;  //默认为0,也就是默认为假
  
  if((x<y||y>x)&&x==y) //里面的条件是((真||真)&&假),最终结果判断是假
  {
     a=1;
  }

  if(x<y||(y>x&&x==y)) //里面的条件是(真||(真&&假)),最终结果判断是真
  {
     b=1;
  }
  
        
  GuiWdData0=a;   //把a这个变量结果放到窗口变量0里面显示
  GuiWdData1=b;   //把b这个变量结果放到窗口变量1里面显示

        
/*---C语言学习区域的结束---------------------------------------------------------------------------*/
   while(1)  
   {
      initial();
      key_service();
      display_service();
   }

}

        查看运算结果的方法。如何在坚鸿51学习板上观察变量?按下S1或者S5按键即可切换显示不同的窗口,从而显示不同的变量。按下S9按键不松手就可以切换到十六进制的显示界面,松开手后会自动切换到十进制的界面。16个LED灯显示的就是当前变量的二进制数,亮代表1,灭代表0。上坚鸿51学习板观察程序执行的结果如下:
         变量a为0。(0代表此条件判断结果为假)
         变量b为1。(1代表此条件判断结果为真)
         下节预告:if,elseif,else的5种组合判断语句。
(未完待续)

使用特权

评论回复
174
乐逍遥6| | 2015-10-21 19:22 | 只看该作者

使用特权

评论回复
175
WOLF1688| | 2015-10-22 11:02 | 只看该作者
吴老师,辛苦了!真心感谢你!你给我前进路上指明了方向,点亮了明灯,:victory:

使用特权

评论回复
176
jianhong_wu|  楼主 | 2015-10-25 00:56 | 只看该作者
第四十三节:if,else if,else的5种组合判断语句。
        if,else if,else可以组成5种组合判断语句,这类组合语句可以这样通俗的解读:在众多条件判断中,先从第一个条件开始判断,如果第一个条件是真,那么不管后面的条件是否为真,都不再判断,直接执行条件1大括号后面的语句,组合语句中其它剩下的条件不再判断直接跳过,否则,就挨个条件往下判断,只要其中一个条件满足,就不再判断剩余的条件,也就是我们日常所说的多选一,甚至某些组合语句如果所有条件都不满足,那么什么也不选。总之,在如此众多的条件中,最多只能执行一个条件后面大括号的语句。组合语句还有一个规律:if语句只能出现在第一个条件判断,而且只能出现一次;else只能出现在最后一个条件判断,而且也只能出现一次;而else if语句总是出现在中间,绝对不能出现在第一个条件判断,如果没有else,也可以出现在最后的条件判断。接下来挨个仔细分析这5种组合语句的特点。
        第一种:
if(条件1)   //if只能出现第一个条件,并且只能出现一次
{
    语句1;
}
else    //else只能出现最后,并且也只能出现一次。
{
    语句2;
}
       分析:如果“条件1”为真,就直接执行“条件1”后面大括号的“语句1”,不再执行else后面的“语句2”。否则,如果“条件1”为假,那么就不执行“条件1”后面大括号的“语句1”,而是直接执行else后面的大括号“语句2”。简单概括就是两个必选一个,如果第一个条件1为假,就直接执行else后面大括号里的语句,也就是本例子中的“语句2”。
       第二种:
if(条件1)   //if只能出现第一个条件,并且只能出现一次
{
    语句1;
}
else  if(条件2)  //else if只能出现中间,可以出现多次
{
    语句2;
}
       分析:如果“条件1”为真,就直接执行“条件1”后面大括号的“语句1”,这时不管else if后面的“条件2”是否为真,都不再判断的“条件2”,这种情况当然也不会执行到“语句2”。否则,如果“条件1”为假,那么就不执行“条件1”后面大括号的“语句1”,而是继续判断else if后面的“条件2”,如果“条件2”为真,就会执行后面大括号的“语句2”,否则如果“条件2”也为假,那么“语句2”也不会执行。简单概括就是在两个条件中最多只能选一个,如果两个条件都为假,那么都不选。
       第三种:
if(条件1)       //if只能出现第一个条件,并且只能出现一次
{
    语句1;
}
else  if(条件2)   //else if只能出现中间,可以出现多次
{
    语句2;
}
else      //else只能出现最后,并且也只能出现一次。
{
    语句3;
}
       分析:如果“条件1”为真,就直接执行“条件1”后面大括号的“语句1”,这时不管else if后面的“条件2”是否为真,都不再判断的“条件2”,这种情况当然也不会执行到后面的“语句2”,更加不会执行到else 后面的“语句3”。否则,如果“条件1”为假,那么就不执行“条件1”后面大括号的“语句1”,而是继续判断else if后面的“条件2”,如果“条件2”为真,就会执行后面大括号的“语句2”,而else后面的“语句3”就不会被执行到,否则如果“条件2”也为假,那么“语句2”也不会执行,此时就直接执行else后面的“语句3”。简单概括就是在三个条件中必须选一个,如果前面两个条件都为假,那么就直接执行else后面大括号里的语句,也就是本例子中的“语句3”。
       第四种:
if(条件1)       //if只能出现第一个条件,并且只能出现一次
{
    语句1;
}
else  if(条件2)   //else if只能出现中间,可以出现多次
{
    语句2;
}
……
else  if(条件N)   //else if只能出现中间,可以出现多次
{
    语句N;
}

        分析:从“条件1”开始往下判断,只要有一个条件满足了,就执行当前条件后面大括号的语句,剩余的条件不再判断直接跳过,如果所有的条件都不满足,那么里面的语句都不执行。简单概括就是在N个条件中最多只能选一个,如果所有的条件都为假,那么都不选。
        第五种:
if(条件1)       //if只能出现第一个条件,并且只能出现一次
{
    语句1;
}
else  if(条件2)   //else if只能出现中间,可以出现多次
{
    语句2;
}
……
else  if(条件N)   //else if只能出现中间,可以出现多次
{
    语句N;
}
else   
{
    语句N+1;
}

       分析:从“条件1”开始往下判断,只要有一个条件满足了,就执行当前条件后面大括号的语句,剩余的条件不再判断直接跳过,如果所有的条件都不满足,那么就直接执行else后面大括号里的语句,也就是本例子中的“语句N+1”。简单概括就是在N+1个条件中必须选一个,如果前面所有N个条件都为假,最后就直接执行else后面大括号的语句,也就是本例子中的“语句N+1”。
       现在编写一个程序来实验上述5种组合语句。最后把程序编译后下载到坚鸿51学习板观察结果。请直接复制第十节模板程序,修改的main程序代码如下:

void main() //主程序
{
/*---C语言学习区域的开始---------------------------------------------------------------------------*/
        
  //x这个变量作为条件判断的变量
  unsigned char x=5;


  
  //a,b,c,d,e这5个变量作为输出判断结果,0代表什么语句都没执行,1代表执行了语句1,
  //2代表执行语句2,3代表执行语句3,4代表执行语句4,5代表执行语句5。
  unsigned char a=0;  
  unsigned char b=0;
  unsigned char c=0;  
  unsigned char d=0;
  unsigned char e=0;  

  //第一种
  if(x>6)  //x默认是5
  {
     a=1;   //语句1
  }
  else
  {
     a=2;  //语句2
  }


  //第二种
  if(x>6)  //x默认是5
  {
     b=1;   //语句1
  }
  else if(x==7)  //x默认是5
  {
     b=2;  //语句2
  }


  //第三种
  if(x>6)  //x默认是5
  {
     c=1;   //语句1
  }
  else if(x==7)  //x默认是5
  {
     c=2;  //语句2
  }
  else
  {
     c=3;  //语句3
  }

  //第四种
  if(x>6)  //x默认是5
  {
     d=1;   //语句1
  }
  else if(x==7)  //x默认是5
  {
     d=2;  //语句2
  }
  else if(x==5)  //x默认是5
  {
     d=3;  //语句3
  }
  else if(x==4)  //x默认是5
  {
     d=4;  //语句4
  }

  //第五种
  if(x>6)  //x默认是5
  {
     e=1;   //语句1
  }
  else if(x==7)  //x默认是5
  {
     e=2;  //语句2
  }
  else if(x==5)  //x默认是5
  {
     e=3;  //语句3
  }
  else if(x==4)  //x默认是5
  {
     e=4;  //语句4
  }
  else
  {
     e=5;  //语句5
  }

        
  GuiWdData0=a;   //把a这个变量结果放到窗口变量0里面显示
  GuiWdData1=b;   //把b这个变量结果放到窗口变量1里面显示
  GuiWdData2=c;   //把c这个变量结果放到窗口变量2里面显示
  GuiWdData3=d;   //把d这个变量结果放到窗口变量3里面显示
  GuiWdData4=e;   //把e这个变量结果放到窗口变量4里面显示

        
/*---C语言学习区域的结束---------------------------------------------------------------------------*/
   while(1)  
   {
      initial();
      key_service();
      display_service();
   }

}

       查看运算结果的方法。如何在坚鸿51学习板上观察变量?按下S1或者S5按键即可切换显示不同的窗口,从而显示不同的变量。按下S9按键不松手就可以切换到十六进制的显示界面,松开手后会自动切换到十进制的界面。16个LED灯显示的就是当前变量的二进制数,亮代表1,灭代表0。上坚鸿51学习板观察程序执行的结果如下:
        变量a为2。(2代表执行了语句2)
        变量b为0。(0代表什么语句都没执行)
        变量c为3。(3代表执行了语句3)
        变量d为3。(3代表执行了语句3)
        变量e为3。(3代表执行了语句3)

        下节预告:一维数组。
(未完待续)


使用特权

评论回复
177
a1992215| | 2015-10-28 00:28 | 只看该作者
学习了。

使用特权

评论回复
来自android
178
jianhong_wu|  楼主 | 2015-10-31 09:01 | 只看该作者
本帖最后由 jianhong_wu 于 2015-11-7 00:25 编辑

第四十四节:一维数组能批量定义变量的特点。
       一维数组有两个特点:
       第一个:批量定义变量。我们之前的章节用unsigned  char, unsigned  int, unsigned long定义变量时,往往一条语句只习惯定义一个变量,而用数组可以一条语句定义N个变量,只要不超过单片机的RAM范围。
       第二个:数组的每个元素变量的地址都是挨个相临的。第一个元素变量的地址是该数组的首地址,后面的下标是以此首地址为原点的偏移地址。这个特点跟以后学到的循环语句或者指针配合起来,只需简单几行代码就可以实现很多复杂实用的算法。
       上述第二个特点的内容等以后学到循环语句和指针时再深入讲解,本节重点讲解一维数组的书写格式和第一个特点。
       一维数组未带初始化时的通用定义格式如下:
类型 数组名[数组元素个数N];
比如:
unsigned char  x[3];  //此处的3不是下标,而是元素个数
       分析:此数组一行代码定义了三个变量,分别是x[0], x[1], x[2],此时中括号里的0,1,2称为数组的下标,注意,数组的下标是从0开始的,从N-1结束,此时的N代表数组元素个数。因此,上述数组不存在x[3]这个元素变量,只有x[0], x[1], x[2]这三个变量,如果非要使用x[3]这个元素变量,那就会导致数组越界出现异常或者编译不通过。
      一维数组带初始化时的通用定义格式如下:
类型 数组名[数组元素个数N]={ 元素0, 元素1,…元素N-1};
比如:
unsigned char  y[3]={10,11,12};
       分析:此数组一行代码定义了三个变量,分别是y[0], y[1], y[2]。而y[0]初始化为10,y[1]初始化为11,y[2]初始化为12。
在程序中,调用数组某个变量元素时,下标可以是常量,比如y[0],此时的0就是常量;下标也可以是变量,比如y,此时的i就是变量。再强调一次,下标常量或者变量i的数值必须小于y数组定义时的元素个数,否则就会导致数组越界出现异常或者编译不通过。
       现在编写一个程序来熟悉一下一维数组的书写和使用格式。最后把程序编译后下载到坚鸿51学习板观察结果。请直接复制第十节模板程序,修改的main程序代码如下:

void main() //主程序
{
/*---C语言学习区域的开始---------------------------------------------------------------------------*/
        
  unsigned char  x[3];  //此处的3不是下标,而是元素个数,里面的3个变量没有初始化
  unsigned char  y[3]={10,11,12}; //里面三个元素变量y[0],y[1],y[2]分别初始化为10,11,12

  unsigned char  i=0; //定义和初始化一个变量。用来做x数组的下标。

  x[i]=25;  //此时下标i为0.相当于把25赋值给x[0]
  i=i+1;    //i由0变成1.
  x[i]=26;  //此时下标i为1.相当于把26赋值给x[1]
  i=i+1;    //i由1变成2.
  x[i]=27;  //此时下标i为2.相当于把27赋值给x[2]
  x[i]=x[i]+1; //此时x[2]自加1变成了28


        
  GuiWdData0=x[0];   //把x[0]这个元素变量放到窗口变量0里面显示
  GuiWdData1=x[1];   //把x[1]这个元素变量放到窗口变量1里面显示
  GuiWdData2=x[2];   //把x[2]这个元素变量放到窗口变量2里面显示


  GuiWdData3=y[0];   //把y[0]这个元素变量放到窗口变量3里面显示
  GuiWdData4=y[1];   //把y[1]这个元素变量放到窗口变量4里面显示
  GuiWdData5=y[2];   //把y[2]这个元素变量放到窗口变量5里面显示

        
/*---C语言学习区域的结束---------------------------------------------------------------------------*/
   while(1)  
   {
                  initial();
      key_service();
      display_service();
   }

}

       查看运算结果的方法。如何在坚鸿51学习板上观察变量?按下S1或者S5按键即可切换显示不同的窗口,从而显示不同的变量。按下S9按键不松手就可以切换到十六进制的显示界面,松开手后会自动切换到十进制的界面。16个LED灯显示的就是当前变量的二进制数,亮代表1,灭代表0。上坚鸿51学习板观察程序执行的结果如下:
        变量元素x[0]为25。
        变量元素x[1]为26。
        变量元素x[2]为28。
        变量元素y[0]为10。
       变量元素y[1]为11。
       变量元素y[2]为12。
       下节预告:二维数组能批量定义变量的特点。
(未完待续)

使用特权

评论回复
179
solarddd| | 2015-11-3 15:23 | 只看该作者
支持

使用特权

评论回复
180
tuburen| | 2015-11-3 15:50 | 只看该作者
资料不错  单片机真是越学越深

使用特权

评论回复
发新帖 本帖赏金 10.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则