学了这么久还是不知道每一行的C语言代码什么意思,每次都要翻资料看意思(苦恼呀!要背一大堆的函数和格式,看别人的代码写的都不知道什么意思的你要怎么学好单片机呢?)
单片机仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机C语言源程序如下:
- #include <REGX52.H> //头文件 【正式语句】
- #define uint unsigned int //宏定义 uint 【无符号整型(范围:0~65535)】
- sbit led=P1^0; // 声明单片机P1口(led) 【正式语句】 在Pro仿真中:LED-YELLOW灯泡脚连接P1.0口
- uint i,j; //定义两个(无符号整型)变量 ,分别为 i ,j
- void main() //主函数 【正式语句】
- {
- while(1) //大循环【正式语句】
- {
- led=0; //点亮第一个发光二极管 【正式语句】
- for(i=2;i>0;i--) //延时 【延时语句】 2*6000=12000
- for(j=6000;j>0;j--);
- led=1; //关闭第一个发光二极管 【正式语句】
- for(i=6;i>0;i--) //延时 【延时语句】 6*126=756
- for(j=126;j>0;j--);
- }
- }
- /********************************************************
- 知识点: C语言中注释写法
- 在C语言中.注释有两种解法:
- (1)//..... 两个斜杠后面跟着的为注释语句。这个写法只能注释一行, 当换行时,又必须在新行上重新写两个斜杠。
- (2)/*.....*/ /* 一杠与星号结合使用,这种写法可以注释任意行。其斜杠星号与星号斜杠之间的所有文字都作为注释。
- 所有注释都不参与程序编译。在编译过程中会自动删去注释,注释的目是为了我们读程序的方便。一般在编写较大的程序时分段
- 加入注释,这样当回过头来再次读程序时,因为有注释,其代码的意义变一目了然了。若无注释,是不是特别费力地将程序重新阅
- 读一遍方可知道之后代码含义。
- *********************************************************/
- /*************************************************************************************************************
- 知识点:#define宏定义
- 格式:#define 新名称 原来内容
- 注意后面没有分号,#define命令用它后面的第一个字母组合代替该字母组合后面的所有内容,也就是相当于我们给“原内容”
- 重新起一个比较简单的“新名称” 方便以后在程序中直接写简短的新名称,而不必每次都写繁琐的原内容。
- 上例中我们使用宏定义的目的就是将unsigned int用uint代替,在上面的程序中可以看到,当我们需要定义unsigned int型
- 变量时,并没有写“unsigned int i,j;”取而代之的是“uint i,j;在一个程序代码中,只要宏定义过一次,若定义两次,那么在整
- 个代码中都可以直接使用它的“新名称”。注意,对同一个内容,宏定义只能定义一次,若定义两次,将会出现重复定义的错误提示。
-
- 这里使用while(1){}语句,因为while里的表达式是1,永远为真,所以程序将永远循环执行这个大括号中的所有语句。单片机
- 在执行指令的时候是按代码从上向下顺序执行的,我们分析while大括号里的语句含义是“点亮灯 → 延时一会儿 → 关闭灯 → 再延时
- 一会儿 → 点亮灯 → 延时一会儿················”如此循环下去,当我们把程序下载到实验板上便可看到小灯亮灭闪动的效果。
- 这个延时语句究竟是延长多少时间呢?到(工程 → 为目标’目标1‘设置选项)对话框,在【Target】标签下的【Xtal(MHz):】后
- 面将原来的默认值修改为单片机实验板上的晶振频率值 11.0592MHz 。
- 编译程序时,计算代码执行时间与该数值有关,既然我们要模拟真实时间,那么软件模拟运行速度就要与实际硬件一一对应。
- *************************************************************************************************************/
- /**************************************************************************************************************
- 知识点:for语句【及简单延时语句】
- 格式:for(表达式1;表达式2;表达式3)
- {语句(内部可为空)}
- 执行过程:
- 第一步:求解一次表达式1.
- 第二步:求解一次表达式2.若其值为真(非0即为真),则执行for中语句,然后执行第三步;否则结束for语句,直接跳出,不再执行第三步。
- 第三步:求解一次表达式3
- 第四步:跳到第二步重复执行。
- 需要注意的是,三个表达式之间必须用分号隔开。
- 利用for语句和while语句写简单的延时语句,下面用for语句写一个简单的延时语句 ,并进一步了解for语句的用法。
- unsigned char i; //没简化的字符型变量(i)
- for(i=2;i>0;i--);
- 上面这两句,首先定义一个无符号字符型变量i ,然后执行for语句,表达式1是给i赋一个初值2,表达式2是判断i大于0是真还是假,表达
- 式3是i自减1,我们分析执行过程:
- 第1步,给i赋初值2,此时i=2。
- 第2步,因为2>0条件成立,所以其值为真,那么执行一次for中的语句,因为for内部语句为空,即什么也不执行。
- 第3步, i自减1,即i=2-1=1.
- 第4步, 跳到第2步,因为1>0条件成立所以其为真,那么执行一次for中的语句,因为for内部语句为空,即什么也不执行。
- 第5步,i自减1,即i=1-1=0.
- 第6步,跳到第2步,因为0>0条件不成立,所以其值为假,那么结束for语句,直接跳出。
- 以上六步,这个for语句就执行完了,单片机在执行这个for语句的时候是需要时间的,上面i的初值较小,当给i赋的初值越大,它执行所
- 需的时间就越长,因此就可以利用单片机执行这个for语句的时间来作为一个简单廷时语句。
- 要写一个延时比较长的语句时,因为在这里i是一个字符型变量,它的最大值为255,当你给它赋一个比最大值都大的数时,编译器自然就
- 出错误了,每次给变量赋初值时,都要首先考虑变量类型,然后根据变量类型赋一个合理的值。
- 怎样才能写出长时间的延时语句呢?就要用到for语句的嵌套。
- unsigned char i,j; //没简化的字符型变量 定义:(i和j)
- for(i=100;i>0;i--);
- for(j=200;j>0;j--);
- 上面这个例子是for语句的两层嵌套,第一个for后面没有分号,那么编译器默认第二个for语句就是第一个for语句的内部语句,而第二个for语
- 句内部语句为空,程序在执行时,第一个for语句中的i每减一次,第二个for语句便执行200次,因此上面这个例子便相当于共执行了100X200次
- for语句。通过这种嵌套我们便可以写出比较长时间的延时语句,我们还可以进行3层、4层嵌套来増加时间,或是改变变量类型,将变量初值再
- 增大也可以増加执行时间。
- 这种for语句的延时时间到底有没有精确算法呢?在c语句中这种延时语句不好算出它的精确时间,需要计算非常精确的延时时间,就要利用单
- 片机的内部的定时器来延时,它的精度非常高,可以精确到微秒级。而一般简单延时语句实际上并不需要太精确.
- **************************************************************************************************************/
复制代码 Keil代码与Proteus仿真下载:
for语句入门2.rar
(69.44 KB, 下载次数: 21)
|