片机的C语言编程

上传人:nu****n 文档编号:253310325 上传时间:2024-12-11 格式:PPT 页数:27 大小:305.64KB
收藏 版权申诉 举报 下载
片机的C语言编程_第1页
第1页 / 共27页
片机的C语言编程_第2页
第2页 / 共27页
片机的C语言编程_第3页
第3页 / 共27页
资源描述:

《片机的C语言编程》由会员分享,可在线阅读,更多相关《片机的C语言编程(27页珍藏版)》请在装配图网上搜索。

1、单击此处编辑母版标题样式,,单击此处编辑母版文本样式,,第二级,,第三级,,第四级,,第五级,,,*,第4章,单片机,C语言程序设计,第4章 单片机C语言程序设计,4.1.1 C语言的特点及程序结构,一.C语言的特点,1.无须考虑寻址问题和数据类型问题,2.模块化结构,3.丰富的子程序,4.可以与汇编交叉使用,5.可以直接对计算机硬件进行操作。,6.生成的目标代码质量高,程序执行效率高。,7.可移植性好。,,4.1 C语言的程序结构,C语言程序采用函数结构,每个C语言程序由一个或多个函数组成,在这些函数中至少应包含一个主函数main(),也可以包含一个main()函数和若干个其它的功能函数。

2、不管main()函数放于何处,程序总是从main()函数开始执行,执行到main()函数结束则结束。在main()函数中调用其它函数,其它函数也可以相互调用,但main()函数只能调用其它的功能函数,而不能被其它的函数所调用。功能函数可以是C语言编译器提供的库函数,也可以是由用户定义的自定义函数。在编制C程序时,程序的开始部分一般是预处理命令、函数说明和变量定义等。,C语言程序结构一般如下:,,预处理命令 include,,函数说明 long fun1();,,float fun2();,,int x,y;,,float z;,,int FindMax(int a,int

3、b);,,int FindMin(int a,int b);,,main(),,{ int nVar1,nVar2,nMax,nMin;,,nVar1=3;,,nVar2=5;,,nMax=FindMax(3,5); //调用求最大值函数,,nMin=FindMin(3,5); //调用求最小值函数,,while(1);,,},,int FindMax(int a,int b) //求最大值函数体,,{ return a>b ? a:b;,,},,int FindMin(int a,int b) //求最小值函数体,,{ return a

4、范围,unsigned char,1字节,0~255,signed char,1字节,-128~+127,unsigned int,2字节,0~65535,signed int,2字节,-32768~+32767,unsigned long,4字节,0~4294967295,signed long,4字节,-2147483648~+2147483647,float,4字节,,1.175494E-38~,,3.402823E+38,bit,1位,0或1,sbit,1位,0或1,sfr,1字节,0~255,sfr16,2字节,0~65535,4.2 C51的数据类型,,在C51语言程序中,有可

5、能会出现在运算中数据类型不一致的情况。C51允许任何标准数据类型的隐式转换,隐式转换的优先级顺序如下:,,bit,,char,,int,,long,,float,,signed,unsigned,,也就是说,当char型与int型进行运算时,先自动对char型扩展为int型,然后与int型进行运算,运算结果为int型。C51除了支持隐式类型转换外,还可以通过强制类型转换符“()”对数据类型进行人为的强制转换。,,C5l编译器除了能支持以上这些基本数据类型之外,还能支持一些复杂的组合型数据类型,如数组类型、指针类型、结构类型、联合类型等这些复杂的数据类型,在本书的后面将相继介绍。,,存

6、储器类型是用于指明变量所处的单片机的存储器区域情况。存储器类型与存储种类完全不同。C51编译器能识别的存储器类型有以下几种,见表所示。,存储器类型,描 述,data,直接寻址的片内RAM低128B,访问速度快,bdata,片内RAM的可位寻址区(20H~2FH),允许字节和位混合访问,idata,间接寻址访问的片内RAM,允许访问全部片内RAM,pdata,用Ri间接访问的片外RAM的低256B,xdata,用DPTR间接访问的片外RAM,允许访问全部64k片外RAM,code,程序存储器ROM64k空间,定义变量时也可以省“存储器类型”,省时C51编译器将按编译模式默认存储器类型,具体编译

7、模式的情况在后面介绍。,4.3 数据的存储类型和存储器模式,,4.3 数据的存储类型和存储器模式,存储器模式,描 述,SMALL,参数及变量放入可直接寻址的内部存储器(最大128byte,默认为data),COMPACT,参数及局部变量放入外部数据存储器(最大256nyte,默认类型为pdata),LARGE,参数及局部变量放入外部数据存储器(最大64k,默认类型为 xdata),,Data char var,,Char code MSG[]=“PARAMETER”,,Unsigned long xdata array[100];,,Float idata x,y ,z,,Bit l

8、ock,,Unsigned int pdata sion,,Unsigned char xdata vertor[10][4][4],,Sfr P0=0x80;,,Char bdata flags;,,Sbit flag0=flags^0;,,#pragma small /*变量的存储模式为SMALL*/,,char k1;,,int xdata m1;,,#pragma compact /*变量的存储模式为compact*/,,char k2;,,int xdata m2;,,int func1(int x1,int y1) large

9、/*函数的存储模式为LARGE*/,,{\return(x1+y1);,,},,int func2(int x2,int y2) /*函数的存储模式隐含为SMALL*/,,{,,return(x2-y2);,,},,程序编译时,k1变量存储器类型为data,k2变量存储器类型为pdata,而m1和m2由于定义时带了存储器类型xdata,因而它们为xdata型;函数func1的形参x1和y1的存储器类型为xdata型,而函数func2由于没有指明存储模式,隐含为SMALL模式,形参x2和y2的存储器类型为data。,,,(补充)存储种类,,存储种类是指变量在程序执行过程中的作用范

10、围。C51变量的存储种类有四种,分别(auto、extern,static和register。,,1.auto:,使用auto定义的变量称为自动变量,其作用范围在定义它的函数体或复合语句内部,定义变量时,如果省略存储种类,则该变量默认为自动(auto)变量。,,2.extern:,使用extern定义的变量称为外部变量。在一个函数体内,要使用一个已在该函数体外或别的程序中定义过的外部变量时,该变量在该函数体内要用extern说明。,,3.static:,使用static定义的变量称为静态变量。它又分为内部静态变量和外部静态变量。在函数体内部定义的静态变量为内部静态变量,它在对应的函数体内有效,

11、一直存在,但在函数体外不可见,这样不仅使变量在定义它的函数体外被保护,还可以实现当离开函数时值不被改变。,,4.register:,使用register定义的变量称为寄存器变量。它定义的变量存放在CPU内部的寄存器中,处理速度快,但数目少。C51编译器编译时能自动识别程序中使用频率最高的变量,并自动将其作为寄存器变量,用户可以无需专门声明。,,【例】,变量定义存储种类和存储器类型相关情况。,,char data varl; /*在片内RAM低128B定义用直接寻址方式访问的字符型变量var1*/,,int idata var2; /*在片内RAM256B定义用间接寻址方式访问的整

12、型变量var2*/,,,auto unsigned long data var3,; /*在片内RAM128B定义用直接寻址方式访问的自动无符号长整型变量var3*/,,,extern float xdata var4;,/*在片外RAM64KB空间定义用间接寻址方式访问的外部实型变量var4*/,,int code var5; /*在ROM空间定义整型变量var5*/,,unsign char bdata var6; /*在片内RAM位寻址区20H~2FH单元定义可字节处理和位处理的无符号字符型变量var6*/,,4.4 指针,,注:指

13、针的声明包括3个部分:,,目标变量的数据类型,,目标变量的存储类型,,指针变量自身的存储类型(此指针放在哪里),,指针变量本身的数据类型(8位/16位/32位,根据被指的变量存储类型来决定),,二.通过指针访问地址,,采用指针的方法,可以实现在C51程序中对任意指定的存储器单元进行访问。,,【例】,通过指针实现绝对地址的访问。,,#define uchar unsigned char,,#define uint unsigned int,,void func(void),,{,,uchar data var1;,,Xdata uchar pdata *dp1,; /

14、,*定义一个指向pdata区的指针dp1*,指针本身存放于片外64K中/,,uint xdata *dp2;,/,*定义一个指向xdata区的指针dp2*/,,uchar data *dp3;,/,*定义一个指向data区的指针dp3*/,,dp1=0x30; /*dp1指针赋值,指向pdata区的30H单元*/,,dp2=0x1000; /*dp2指针赋值,指向xdata区的1000H单元*/,,*,dp1=0xff;,/,*将数据0xff送到片外RAM30H单元*/,,*dp2=0x1234;,/,*将数据0x1234送到片外RAM1000H单元*/,,dp3=

15、 /*dp3指针指向data区的var1变量*/,,*,dp3=0x20;,/,*给变量var1赋值0x20*/,,},,在C51中,允许用户对特殊功能寄存器进行访问,访问时须通过sfr或sfr16类型说明符进行定义,定义时须指明它们所对应的片内RAM单元的地址。格式如下:,,sfr或sfr16 特殊功能寄存器名=地址;,,sfr用于对MCS-51单片机中单字节的特殊功能寄存器进行定义,sfr16用于对双字节特殊功能寄存器进行定义。特殊功能寄存器名一般用大写字母表示。。,,sfr SCON=0x98;,,sfr TMOD=0x89;,,sfr P1=0x90;,,sfr16

16、 ACC=0xe0;,,sfr16 T1=0X8A;,4.4 C51对SFR/位寻址/存储器/IO口的定义,,,位变量,,在C51中,允许用户通过位类型符定义位变量。,位类型符有两个:bit和sbit。可以定义两种位变量。,,sbit定义的变量必须与51单片机的一个可位寻址字节的某一位联系在一起.C51编译的时候其地址是不可变的.,,,它的格式如下三个:,,例:,,1) bit m;,,2) bdata int ibase;,,sbit mybit=ibase^15;,,3) sfr P1=0X90;,,sbit P1_1=P1^1;,,,4.5.3 绝对地址的访问,一.使用C51

17、运行库中预定义宏,,C51编译器提供了一组宏定义来对51系列单片机的code、data、pdata和xdata空间进行绝对寻址。规定只能以无符号数方式访问,定义了8个宏定义:,,CBYTE以字节形式对code区寻址,,,DBYTE以字节形式对data区寻址,,,PBYTE以字节形式对pdata区寻址,,,XBYTE以字节形式对xdata区寻址,,,CWORD以字形式对code区寻址,,,DWORD以字形式对data区寻址,,,PWORD以字形式对pdata区寻址,,,XWORD以字形式对xdata区寻址。,,访问形式如下:,,宏名[地址],,使用时须用预处理命令把该头文件包含到文件中,形式为:

18、#include 。,,,,【例】,绝对地址对存储单元的访问,,#include ,,#include ,,#define uchar unsigned char,,#define uint unsigned int,,,void main(void),,{,,uchar var1;,,uint var2;,,var1=XBYTE[0x0005];,,var2=XWORD[0x0002];,,while(1);,,},,在上面程序中,其中XBYTE[0x0005]就是以绝对地址方式访问的片外RAM 0005,字节,单元;XWORD[0x0002]就是以绝对地址方式访问的

19、片外RAM 0002,字,单元。,,位运算符,C51语言能对运算对象按位进行操作,它与汇编语言使用一样方便。位运算是按位对变量进行运算,但并不改变参与运算的变量的值。如果要求按位改变变量的值,则要利用相应的赋值运算。C51中位运算符只能对整数进行操作,不能对浮点数进行操作。C51中的位运算符有:,,& 按位与,,| 按位或,,^ 按位异或,,~ 按位取反,,<< 左移,,>> 右移,,【例4-10】,设a=0x45=01010100B,b=0x3b=00111011B,则a&b、a|b、a^b、~a、a>2分别为多少?,,a&b=00010000b=0x10

20、。,,a|b=01111111B=0x7f。,,a^b=01101111B=0x6f。,,~a=10101011B=0xab。,,a<<2=01010000B=0x50。,,b>>2=00001110B=0x0e。,,复合赋值运算符,,C51语言中支持在赋值运算符“=”的前面加上其它运算符,组成复合赋值运算符。下面是C51中支持的复合赋值运算符:,,+= 加法赋值,,+,减法赋值,,*= 乘法赋值 /= 除法赋值,,%= 取模赋值 &= 逻辑与赋值,,|= 逻辑或赋值 ^= 逻辑异或赋值,,~=

21、 逻辑非赋值 >>= 右移位赋值,,<<= 左移位赋值,,复合赋值运算的一般格式如下:,,变量 复合运算赋值符 表达式,,它的处理过程:先把变量与后面的表达式进行某种运算,然后将运算的结果赋给前面的变量。其实这是C51语言中简化程序的一种方法,大多数二目运算都可以用复合赋值运算符简化表示。例如:a+=6相当于a=a+6;a*=5相当于a=a*5;b&=0x55相当于b=b&0x55;x>>=2相当于x=x>>2。,,函数调用方式:3种,,1 把被调函数名作为一个语句,,2 被调函数作为表达式的运算对象,,resule=2*get(a,b),,3 被调函数作

22、为另一个数的实际参数,,m=max(a,get(a,b)),4.7 函 数,,,4.8 C语言编程实例,,#include,,main(),,{,,char c;,,for(;;),,{,,c=XBYTE[14];,,XBYTE[14]=XBYTE[15];,,XBYTE[15]=c;,,},,},,循环语句:,,1 while(判断句式){},,2 do{语句}while(判断句式),,3 for(表达式1;表达式2;表达式3){语句},,分支程序,,1if(表达式){语句},,2 if (表达式){语句}else{语句},,3 switch(表达式){case 常量表达式1:{语句}bre

23、ak;,,case 常量表达式2:{语句}break;,,……..,,},,,,1.在C51中嵌入汇编程序,,嵌入汇编程序是通过C51中的预处理指令#pragma asm/end asm 语句来实现的。其格式如下:,,#pragma ASM,,;汇编程序代码,,#pragma ENDASM,2.,在C51中调用汇编程序,,这种方法应用较多,C模块与汇编模块的接口较简单,分别用C51与A51对源程序进行编译,然后用L51将obj文件连接即可,关键问题在于C函数与汇编函数之间的参数传递和得到正确的返回值,以保证模块间的数据交换。,4.9 汇编语言和C语言的混合编程,,,#include ,,M

24、ain(){,,P2=1;,,#pragma asm,,MOV R7,#10;,,DEL:MOV R6,#20;,,DJNZ R6,$ //,R6-1操作,不为零,跳转到自己本身,,DJNZ R7,DEL;//,R7-1操作,不为零,跳转到DEL,,#pragma endasm,,P2=0;,,,#include,,,,#define uchar unsigned char,,sbit P1_1=P1^1;,,extern void delay4ms();,,main(),,{ //unsigned char i;,,for(;;),,{,,P1_1=0;,,delay4ms();,,P1

25、_1=1;,,delay4ms() ;,,},,},,,#include,,#define uchar unsigned char,,sbit P1_0=P1^0;,,extern delay1ms(uchar x);,,void delay4ms(void),,{,,P1_0=0;,,delay1ms(2);,,P1_0=1;,,delay1ms(2);,,},,,PUBLIC _DELAY1MS ;,,DE SEGMENT CODE ;,,RSEG DE;,,_DELAY1MS: NOP,,DELA: MOV R1,#0F8H;,,LOP1: NOP,,NOP,,DJNZ R1,LOP1,,DJNZ R7,DELA,,EXIT: RET,,END,,

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

相关资源

更多
正为您匹配相似的精品文档

相关搜索

copyright@ 2023-2025  sobing.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!