找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1860|回复: 0
收起左侧

C语言for语句学习 附详细注释单片机程序与Proteus仿真图

[复制链接]
ID:815459 发表于 2022-4-30 17:56 | 显示全部楼层 |阅读模式
学了这么久还是不知道每一行的C语言代码什么意思,每次都要翻资料看意思(苦恼呀!要背一大堆的函数和格式,看别人的代码写的都不知道什么意思的你要怎么学好单片机呢?)

for.jpg

单片机仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.png

单片机C语言源程序如下:
  1. #include <REGX52.H>           //头文件                【正式语句】
  2. #define uint unsigned int      //宏定义 uint 【无符号整型(范围:0~65535)】
  3. sbit led=P1^0;           // 声明单片机P1口(led)  【正式语句】         在Pro仿真中:LED-YELLOW灯泡脚连接P1.0口
  4. uint i,j;                        //定义两个(无符号整型)变量 ,分别为 i ,j
  5. void main()                   //主函数                【正式语句】
  6. {
  7. while(1)           //大循环【正式语句】
  8. {
  9. led=0;                  //点亮第一个发光二极管   【正式语句】
  10. for(i=2;i>0;i--)                 //延时                【延时语句】  2*6000=12000
  11.   for(j=6000;j>0;j--);
  12. led=1;                                    //关闭第一个发光二极管   【正式语句】
  13. for(i=6;i>0;i--)                 //延时                【延时语句】        6*126=756
  14.   for(j=126;j>0;j--);          
  15. }
  16. }
  17. /********************************************************
  18. 知识点: C语言中注释写法
  19.   在C语言中.注释有两种解法:
  20.    (1)//.....  两个斜杠后面跟着的为注释语句。这个写法只能注释一行, 当换行时,又必须在新行上重新写两个斜杠。
  21.    (2)/*.....*/    /* 一杠与星号结合使用,这种写法可以注释任意行。其斜杠星号与星号斜杠之间的所有文字都作为注释。
  22.   所有注释都不参与程序编译。在编译过程中会自动删去注释,注释的目是为了我们读程序的方便。一般在编写较大的程序时分段
  23. 加入注释,这样当回过头来再次读程序时,因为有注释,其代码的意义变一目了然了。若无注释,是不是特别费力地将程序重新阅
  24. 读一遍方可知道之后代码含义。
  25. *********************************************************/

  26. /*************************************************************************************************************
  27. 知识点:#define宏定义
  28. 格式:#define 新名称 原来内容
  29.    注意后面没有分号,#define命令用它后面的第一个字母组合代替该字母组合后面的所有内容,也就是相当于我们给“原内容”
  30. 重新起一个比较简单的“新名称” 方便以后在程序中直接写简短的新名称,而不必每次都写繁琐的原内容。
  31.    上例中我们使用宏定义的目的就是将unsigned int用uint代替,在上面的程序中可以看到,当我们需要定义unsigned int型
  32. 变量时,并没有写“unsigned int i,j;”取而代之的是“uint i,j;在一个程序代码中,只要宏定义过一次,若定义两次,那么在整
  33. 个代码中都可以直接使用它的“新名称”。注意,对同一个内容,宏定义只能定义一次,若定义两次,将会出现重复定义的错误提示。
  34.   
  35.    这里使用while(1){}语句,因为while里的表达式是1,永远为真,所以程序将永远循环执行这个大括号中的所有语句。单片机
  36. 在执行指令的时候是按代码从上向下顺序执行的,我们分析while大括号里的语句含义是“点亮灯 → 延时一会儿 → 关闭灯 → 再延时
  37. 一会儿 → 点亮灯 → 延时一会儿················”如此循环下去,当我们把程序下载到实验板上便可看到小灯亮灭闪动的效果。
  38.    这个延时语句究竟是延长多少时间呢?到(工程 → 为目标’目标1‘设置选项)对话框,在【Target】标签下的【Xtal(MHz):】后
  39. 面将原来的默认值修改为单片机实验板上的晶振频率值 11.0592MHz 。
  40.    编译程序时,计算代码执行时间与该数值有关,既然我们要模拟真实时间,那么软件模拟运行速度就要与实际硬件一一对应。
  41. *************************************************************************************************************/

  42. /**************************************************************************************************************
  43. 知识点:for语句【及简单延时语句】
  44. 格式:for(表达式1;表达式2;表达式3)
  45.      {语句(内部可为空)}
  46. 执行过程:
  47. 第一步:求解一次表达式1.
  48. 第二步:求解一次表达式2.若其值为真(非0即为真),则执行for中语句,然后执行第三步;否则结束for语句,直接跳出,不再执行第三步。
  49. 第三步:求解一次表达式3
  50. 第四步:跳到第二步重复执行。
  51.   需要注意的是,三个表达式之间必须用分号隔开。
  52. 利用for语句和while语句写简单的延时语句,下面用for语句写一个简单的延时语句 ,并进一步了解for语句的用法。

  53.         unsigned char i;                //没简化的字符型变量(i)
  54.         for(i=2;i>0;i--);

  55. 上面这两句,首先定义一个无符号字符型变量i ,然后执行for语句,表达式1是给i赋一个初值2,表达式2是判断i大于0是真还是假,表达
  56. 式3是i自减1,我们分析执行过程:

  57. 第1步,给i赋初值2,此时i=2。
  58. 第2步,因为2>0条件成立,所以其值为真,那么执行一次for中的语句,因为for内部语句为空,即什么也不执行。
  59. 第3步, i自减1,即i=2-1=1.
  60. 第4步, 跳到第2步,因为1>0条件成立所以其为真,那么执行一次for中的语句,因为for内部语句为空,即什么也不执行。
  61. 第5步,i自减1,即i=1-1=0.
  62. 第6步,跳到第2步,因为0>0条件不成立,所以其值为假,那么结束for语句,直接跳出。
  63.    以上六步,这个for语句就执行完了,单片机在执行这个for语句的时候是需要时间的,上面i的初值较小,当给i赋的初值越大,它执行所
  64. 需的时间就越长,因此就可以利用单片机执行这个for语句的时间来作为一个简单廷时语句。
  65.    要写一个延时比较长的语句时,因为在这里i是一个字符型变量,它的最大值为255,当你给它赋一个比最大值都大的数时,编译器自然就
  66. 出错误了,每次给变量赋初值时,都要首先考虑变量类型,然后根据变量类型赋一个合理的值。

  67.    怎样才能写出长时间的延时语句呢?就要用到for语句的嵌套。

  68.   unsigned char i,j;                   //没简化的字符型变量 定义:(i和j)
  69.          for(i=100;i>0;i--);
  70.            for(j=200;j>0;j--);

  71. 上面这个例子是for语句的两层嵌套,第一个for后面没有分号,那么编译器默认第二个for语句就是第一个for语句的内部语句,而第二个for语
  72. 句内部语句为空,程序在执行时,第一个for语句中的i每减一次,第二个for语句便执行200次,因此上面这个例子便相当于共执行了100X200次
  73. for语句。通过这种嵌套我们便可以写出比较长时间的延时语句,我们还可以进行3层、4层嵌套来増加时间,或是改变变量类型,将变量初值再
  74. 增大也可以増加执行时间。
  75. 这种for语句的延时时间到底有没有精确算法呢?在c语句中这种延时语句不好算出它的精确时间,需要计算非常精确的延时时间,就要利用单
  76. 片机的内部的定时器来延时,它的精度非常高,可以精确到微秒级。而一般简单延时语句实际上并不需要太精确.


  77. **************************************************************************************************************/                                                                                  
复制代码
Keil代码与Proteus仿真下载:
for语句入门2.rar (69.44 KB, 下载次数: 21)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表