从单片机基础到程序框架(连载)

2020-01-12 17:12发布

本帖最后由 吴坚鸿 于 2016-1-17 11:32 编辑

前言:
前言_pdf文件.pdf (30.44 KB, 下载次数: 729) 2016-1-17 11:30 上传 点击文件名下载附件

      大家好,我叫吴坚鸿,以前一直想写两本书,一本讲单片机入门基础,一本讲单片机程序框架。现在发现,单片机基础和程序框架并没有明显的分水岭,基础中有框架,框架中有基础,应该合二为一,读起来才会连贯舒畅。所以我决定中止当前已写到55节的《从业十年,教你单片机入门基础》连载帖,新开此连载帖。
      再提一下我2014年写的《从业将近十年,手把手教你单片机程序框架》,一方面受到很多网友的好评,另一方面也有一些热心网友提出了宝贵的意见,我今天看来,确实还有一些可待改进的地方。本来计划在2017年重写《……单片机程序框架》那个老帖,现在看来不用那么折腾了,只要把《……单片机程序框架》的内容也整合到此新帖里就可以了,这样对我也比较省事。我的时间计划是,先花4年时间写一个初稿,然后再花2年时间重写一次,最后再花1年时间整理成书,整个过程大概7年时间左右,今年是2016年,估计到2023年左右《从单片机基础到程序框架》的新书就可以出版了。
      感谢各位朋友的支持。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
99条回答
homay
2020-01-24 08:59
第十三节:赋值语句的覆盖性。
第十三节_pdf文件.pdf (69.44 KB, 下载次数: 127) 2016-4-10 10:39 上传 点击文件名下载附件

【13.1   什么是赋值语句的覆盖性?】

  1.         a=b;
复制代码
       上述代码,执行完这条赋值语句后,会把右边变量b的数值复制一份给左边变量a,a获得了跟b一样的数值,但是a原来自己的数值却丢失了,为什么会丢失?就是因为被b复制过来的新数据给覆盖了,这就是赋值语句的覆盖性。

【13.2   例程的分析和练习。】

       既然赋值语句有覆盖性的特点,那么如何让两个变量相互交换数值?假设a原来的数据是1,b原来的数据是5,交换数据后,a的数据应该变为5,b的数据应该变为1,怎么做?很多初学者刚看到这么简单的题目,会马上根据日常生活的思路,你把你的东西给我,我把我的东西给你,就两个步骤而已,看似很简单,现在按这个思路编写一段程序看看会出什么问题,代码如下:


  1. /*---C语言学习区域的开始。-----------------------------------------------*/

  2. void main() //主函数
  3. {
  4.        unsigned char a=1;   //定义的变量a被分配了1个字节的RAM空间,保存的数据被初始化成1。
  5.        unsigned char b=5;   //定义的变量b被分配了1个字节的RAM空间,保存的数据被初始化成5。

  6.        b=a; //第一步:为了交换,先把a的数赋值给b。
  7.        a=b; //第二步:为了交换,再把b的数赋值给a。

  8.        View(a);   //把第1个数a发送到电脑端的串口助手软件上观察。
  9.    View(b);   //把第2个数b发送到电脑端的串口助手软件上观察。

  10.    while(1)  
  11.    {
  12.    }
  13. }

  14. /*---C语言学习区域的结束。-----------------------------------------------*/
复制代码


        在电脑串口助手软件上观察到的程序执行现象如下:

  1. 开始...

  2. 第1个数
  3. 十进制:1
  4. 十六进制:1
  5. 二进制:1

  6. 第2个数
  7. 十进制:1
  8. 十六进制:1
  9. 二进制:1
复制代码


分析:        
         第1个数a和第2个数b居然都是1!这不是我们想要的结果。我们要的交换结果是:交换后,a变为5,b变为1。在哪个环节出了问题?把镜头切换到上述代码的“第一步”和“第二步”,由于b的数据在执行完“第一步”后,b自己原来的数据5被覆盖丢失了变成新的数据1,接着执行“第二步”后,此时相当于把 b的新数据1赋值给a,并没有5!所以a和b的数据都是1,不能达到交换后“a为5,b为1”的目的。其实就是赋值语句的覆盖性在作祟。


       上述交换数据的程序宣告失败!怎么办?既然赋值语句具有覆盖性,那么两变量想交换数据,就必须借助第三方变量来寄存,此时只需要多定义一个第三方变量t。正确的代码如下:

  1. /*---C语言学习区域的开始。-----------------------------------------------*/

  2. void main() //主函数
  3. {
  4.        unsigned char a=1;   //定义的变量a被分配了1个字节的RAM空间,保存的数据被初始化成1。
  5.        unsigned char b=5;   //定义的变量b被分配了1个字节的RAM空间,保存的数据被初始化成5。
  6.        unsigned char t;     //定义一个第三方变量t,用来临时寄存数值。

  7.        t=b; //第一步:为了避免b的数据在赋值后被覆盖丢失,先寄存一份在第三方变量t那里。
  8.        b=a; //第二步:把a的数赋值给b,b原来的数据虽然丢失,但是b在t变量那里有备份。
  9.        a=t; //第三步:再把b在t变量里的备份赋值给a。注意,这里不能用b,因b原数据已被覆盖。

  10.        View(a);   //把第1个数a发送到电脑端的串口助手软件上观察。
  11.    View(b);   //把第2个数b发送到电脑端的串口助手软件上观察。

  12.    while(1)  
  13.    {
  14.    }
  15. }

  16. /*---C语言学习区域的结束。-----------------------------------------------*/
复制代码

        在电脑串口助手软件上观察到的程序执行现象如下:

  1. 开始...

  2. 第1个数
  3. 十进制:5
  4. 十六进制:5
  5. 二进制:101

  6. 第2个数
  7. 十进制:1
  8. 十六进制:1
  9. 二进制:1
复制代码


分析:        
        实验结果显示,两变量的数值交换成功。

【13.3   如何在单片机上练习本章节C语言程序?】

        直接复制前面章节中第十一节的模板程序,练习代码时只需要更改“C语言学习区域”的代码就可以了,其它部分的代码不要动。编译后,把程序下载进带串口的51学习板,通过电脑端的串口助手软件就可以观察到不同的变量数值,详细方法请看第十一节内容。

一周热门 更多>