单片机C语言函数积累_第1页
单片机C语言函数积累_第2页
单片机C语言函数积累_第3页
单片机C语言函数积累_第4页
单片机C语言函数积累_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、标准的C语言中没有空语句。但在单片机的C语言编程中,经常需要用几个空指令产生短延时的效果。这在汇编语言中很容易实现,写几个nop就行了。在keilC51中,直接调用库函数:#include声明了void-nopjvoid),_nop_(),/产生一条NOP指令作用:对于延时很短的,要求在us级的,采用“op_函数,这个函数相当汇编NOP指令,延时几微秒。NOP指令为单周期指令,可由晶振频率算出延时时间,对J:12M晶振,延时luS。对延时比较长的,要求在大于10us,采用C51中的循环语句来实现。在选择C51中循环语句时,要注意以下几个问题第一、定义的C51中循坏变量,尽量采用无符号字符型变量

2、。第二、在FOR循坏语句中,尽量采用变量减减來做循坏。第三、在do.while,while语句中,循环体内变量也采用减减方法。这因为在C51编译器中,对不同的循坏方法,采用不同的指令来完成的。卜面举例说明:unsignedcharl,for(L=0,L04-),其中,第二个循坏语句C51编译后,就用DJNZ指令来完成,相当丁如卜指令:MOV09H,#0FFHLOOP:DJNZ09H,LOOP指令相当简洁,也很好计算精确的延时时间。同样对do.while,while循环语句中,也是如此例:unsignedcharn,n=255,don-while(n),或n=255,while(n)n-,这两个

3、循坏语句经过C51编译之后,形成DJNZ来完成的方法,故其精确时间的计算也很方便。其三:对J:耍求精确延时时间更长,这时就要采用循环嵌套的方法來实现,因此,循环嵌套的方法常用J:达到ms级的延时。对于循环语句同样可以采用for,do.while,while结构来完成,每个循环体内的变量仍然采用无符号字符变量。unsignedcharl,jfor(i=255,iOu.)blj=255,jO,j),或unsignedcharij1=255,do=255,doj-vhile(j),while(i),或unsignedcharij1=255,HhiIe(L丿J=255,whilej)r这三种方法都是用

4、DJNZ指令嵌套实现循环的,由C51编译器用卜面的指令组合来完成的MOVR7,#OFFHLOOP2:MOVR6,#OFFHLOOP1:DJNZR6,LOOP1DJNZR7,LOOP2这些指令的组合在汇编语言中采用DJNZ指令來做延时用,因此它的时间精确计算也是很简单,假上面变量1的初值为m,变量j的初值为n,则总延时时间为:mx(nxT+T),其中T为DJNZ指令执行时间(DJNZ指令为双周期指令)。这里的+T为MOV这条指令所使用的时间。同样对更长时间的延时,可以采用多重循环來完成。只要在程序设计循坏语句时注意以上几个问题。卜面给出有关在C51中延时子程序设计时要注意的问题1、在C51中进行

5、精确的延时子程序设计时,尽最不要或少在延时子程序中定义局部变最,所有的延时子程序中变量通过有参函数传递。2、在延时子程序设计时,采用do.while,结构做循坏体要比foi:结构做循环体好。3、在延时子程序设计时,要进行循环体嵌套时,采用先内循坏,再减减比先减减,再内循环要好。unsignedchardelav(unsignedchari,unsignedcharj,unsignedchark丿unsignedcharb,c,b=“J”,c=”k”,dododok-,while(k),k=c,J_s,Rhde(j),J=Swhile(i),这精确延时子程序就被C51编译为有卜而的指令组合完成d

6、elay延时子程序如下:MOVR6,05HMOVR4,03HTOC o 1-5 h zC0012:DJNZR3,C0012MOVR3,04HDJNZR5,C0012MOVR5,06HDJNZR7,C0012RET假设参数变鼠的初值为m,参数变鼠j的初值为m参数变杲k的初值为1,贝IJ总延时时间为:4(nx(mxT+2T)+2T)+3T,其中T为DJNZ和MOV指令执行的时间。当m=n=l时,精确延时为9T,最短;当m=n=l=256时,精确延时到16908803T,最长。INTRINS.H:内部函数函数名:_crol_,_irol_,_lrol_原型:unsignedchar_crol_(un

7、signedcharval,unsignedcharn);unsignedint_irol_(unsignedintval,unsignedcharn);unsignedint_lrol_(unsignedintval,unsignedcharn);功能:_crol_,_irol_,_lrol_以位形式将val左移n位,该函数与8051“RLA”指令相关,上面几个函数不同于参数类型。例:#ineludemain()unsignedinty;C-51程序设计37y=OxOOff;y=_irol_(y,4);/*y=OxOffO*/函数名:cror,iror,Iror原型:unsignedchar

8、_cror_(unsignedcharval,unsignedcharn);unsignedint_iror_(unsignedintval,unsignedcharn);unsignedint_lror_(unsignedintval,unsignedcharn);功能:_cror_,ror_,ror_以位形式将val右移n位,该函数与8051“RRA”指令相关,上面儿个函数不同于参数类型。例:#ineludemain()unsignedinty;y=0 x0ff00;y=_iror_(y,4);/*y=0 x0ff0*/函数名:_nop_原型:void_nop_(void);功能:_nop

9、_产生一个NOP指令,该函数可用作C程序的时间比较。C51编译器在_nop_函数工作期间不产生函数调用,即在程序中直接执行了NOP指令。例:P()=1;_nop_();P()=0;函数需:_testbit_原型:bit_testbit_(bitx);功能:_testbit_产生一个JBC指令,该函数测试一个位,当置位时返回1,否则返回0。如果该位置为1,则将该位复位为0。8051的JBC指令即用作此目的。_testbit_只能用于可直接寻址的位:在表达式中使用是不允许的。2008-02-1908:56_crol_字符循环左移_cror_字符循环右移_irol_整数循环左移iror_整数循环右移

10、长整数循环左移lror_长整数循环右移nop_空操作8051NOP指令testbit_测试并清零位8051JBC指令详解:函数名:crolirol_,原型:unsignedchar_crol_(unsignedcharval,unsignedcharn);unsignedint_irol_(unsignedintval,unsignedcharn);unsignedintUQ|(unsignedintval,unsignedcharn);功能:_crol_irol_rol以位形式将val左移n位,该函数与805FRLA”指令相关,上面儿个函数不同于参数类型。例:#ineludemain()un

11、signedinty;C-51程序设计37y=OxOOff;y=Lirol_(y,4);/*y=OxOffO*/函数名:_cror_,ror_,ror_原型:unsignedchar_cror_(unsignedcharval,unsignedcharn);unsignedint_iror_(unsignedintval,unsignedcharn);unsignedint_lror_(unsignedintval,unsignedcharn);功能:_cror_,ror_,ror_以位形式将val右移n位,该函数与8051“RRA”指令相关,上面几个函数不同于参数类型。例:#ineludemain()unsignedinty;y=OxOffOO;y=_iror_(y,4);/*y=OxOffO*/函数名:_nop原型:void_nop_(void);时间比较。C51编译器在_nop_功能:_nop_产生一个NOP指令,该函数可用作C程序函数工作期间不产生函数调用,即

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论