




已阅读5页,还剩22页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章 单片机C语言程序设计,4.1.1 C语言的特点及程序结构,一C语言的特点,1无须考虑寻址问题和数据类型问题,2模块化结构,3丰富的子程序,4可以与汇编交叉使用,5可以直接对计算机硬件进行操作。,6生成的目标代码质量高,程序执行效率高。,7可移植性好。,4.1 C语言的程序结构,C语言程序采用函数结构,每个C语言程序由一个或多个函数组成,在这些函数中至少应包含一个主函数main(),也可以包含一个main()函数和若干个其它的功能函数。不管main()函数放于何处,程序总是从main()函数开始执行,执行到main()函数结束则结束。在main()函数中调用其它函数,其它函数也可以相互调用,但main()函数只能调用其它的功能函数,而不能被其它的函数所调用。功能函数可以是C语言编译器提供的库函数,也可以是由用户定义的自定义函数。在编制C程序时,程序的开始部分一般是预处理命令、函数说明和变量定义等。,C语言程序结构一般如下: 预处理命令 include 函数说明 long fun1(); float fun2(); int x,y; float z;,int FindMax(int a,int 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 ab ? a:b; int FindMin(int a,int b) /求最小值函数体 return ab ? a:b; ,4.2 C51的数据类型,在C51语言程序中,有可能会出现在运算中数据类型不一致的情况。C51允许任何标准数据类型的隐式转换,隐式转换的优先级顺序如下: bitcharintlongfloat signedunsigned 也就是说,当char型与int型进行运算时,先自动对char型扩展为int型,然后与int型进行运算,运算结果为int型。C51除了支持隐式类型转换外,还可以通过强制类型转换符“()”对数据类型进行人为的强制转换。 C5l编译器除了能支持以上这些基本数据类型之外,还能支持一些复杂的组合型数据类型,如数组类型、指针类型、结构类型、联合类型等这些复杂的数据类型,在本书的后面将相继介绍。,存储器类型是用于指明变量所处的单片机的存储器区域情况。存储器类型与存储种类完全不同。C51编译器能识别的存储器类型有以下几种,见表所示。,定义变量时也可以省“存储器类型”,省时C51编译器将按编译模式默认存储器类型,具体编译模式的情况在后面介绍。,4.3 数据的存储类型和存储器模式,4.3 数据的存储类型和存储器模式,Data char var Char code MSG=“PARAMETER” Unsigned long xdata array100; Float idata x,y ,z Bit lock Unsigned int pdata sion Unsigned char xdata vertor1044 Sfr P0=0x80; Char bdata flags; Sbit flag0=flags0;,#pragma small /*变量的存储模式为SMALL*/ char k1; int xdata m1; #pragma compact /*变量的存储模式为compact*/ char k2; int xdata m2; int func1(int x1,int y1) large /*函数的存储模式为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。,(补充)存储种类 存储种类是指变量在程序执行过程中的作用范围。C51变量的存储种类有四种,分别(auto、extern,static和register。 1auto:使用auto定义的变量称为自动变量,其作用范围在定义它的函数体或复合语句内部,定义变量时,如果省略存储种类,则该变量默认为自动(auto)变量。 2extern:使用extern定义的变量称为外部变量。在一个函数体内,要使用一个已在该函数体外或别的程序中定义过的外部变量时,该变量在该函数体内要用extern说明。 3static:使用static定义的变量称为静态变量。它又分为内部静态变量和外部静态变量。在函数体内部定义的静态变量为内部静态变量,它在对应的函数体内有效,一直存在,但在函数体外不可见,这样不仅使变量在定义它的函数体外被保护,还可以实现当离开函数时值不被改变。 4register:使用register定义的变量称为寄存器变量。它定义的变量存放在CPU内部的寄存器中,处理速度快,但数目少。C51编译器编译时能自动识别程序中使用频率最高的变量,并自动将其作为寄存器变量,用户可以无需专门声明。,【例】变量定义存储种类和存储器类型相关情况。 char data varl; /*在片内RAM低128B定义用直接寻址方式访问的字符型变量var1*/ int idata var2; /*在片内RAM256B定义用间接寻址方式访问的整型变量var2*/ auto unsigned long data var3; /*在片内RAM128B定义用直接寻址方式访问的自动无符号长整型变量var3*/ extern float xdata var4; /*在片外RAM64KB空间定义用间接寻址方式访问的外部实型变量var4*/ int code var5; /*在ROM空间定义整型变量var5*/ unsign char bdata var6; /*在片内RAM位寻址区20H2FH单元定义可字节处理和位处理的无符号字符型变量var6*/,4.4 指针,注:指针的声明包括3个部分: 目标变量的数据类型 目标变量的存储类型 指针变量自身的存储类型(此指针放在哪里) 指针变量本身的数据类型(8位/16位/32位,根据被指的变量存储类型来决定),二通过指针访问地址 采用指针的方法,可以实现在C51程序中对任意指定的存储器单元进行访问。 【例】 通过指针实现绝对地址的访问。 #define uchar unsigned char #define uint unsigned int void func(void) uchar data var1; Xdata uchar pdata *dp1; /*定义一个指向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= /*给变量var1赋值0x20*/ ,在C51中,允许用户对特殊功能寄存器进行访问,访问时须通过sfr或sfr16类型说明符进行定义,定义时须指明它们所对应的片内RAM单元的地址。格式如下: sfr或sfr16 特殊功能寄存器名=地址; sfr用于对MCS-51单片机中单字节的特殊功能寄存器进行定义,sfr16用于对双字节特殊功能寄存器进行定义。特殊功能寄存器名一般用大写字母表示。 sfr SCON=0x98; sfr TMOD=0x89; sfr P1=0x90; sfr16 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=ibase15; 3) sfr P1=0X90; sbit P1_1=P11;,4.5.3 绝对地址的访问,一使用C51运行库中预定义宏 C51编译器提供了一组宏定义来对51系列单片机的code、data、pdata和xdata空间进行绝对寻址。规定只能以无符号数方式访问,定义了8个宏定义: CBYTE以字节形式对code区寻址, DBYTE以字节形式对data区寻址, PBYTE以字节形式对pdata区寻址, XBYTE以字节形式对xdata区寻址, CWORD以字形式对code区寻址, DWORD以字形式对data区寻址, PWORD以字形式对pdata区寻址, XWORD以字形式对xdata区寻址。 访问形式如下: 宏名地址 使用时须用预处理命令把该头文件包含到文件中,形式为:#include 。,【例】绝对地址对存储单元的访问 #include #include #define uchar unsigned char #define uint unsigned int void main(void) uchar var1; uint var2; var1=XBYTE0x0005; var2=XWORD0x0002; while(1); 在上面程序中,其中XBYTE0x0005就是以绝对地址方式访问的片外RAM 0005字节单元;XWORD0x0002就是以绝对地址方式访问的片外RAM 0002字单元。,位运算符,C51语言能对运算对象按位进行操作,它与汇编语言使用一样方便。位运算是按位对变量进行运算,但并不改变参与运算的变量的值。如果要求按位改变变量的值,则要利用相应的赋值运算。C51中位运算符只能对整数进行操作,不能对浮点数进行操作。C51中的位运算符有: & 按位与 | 按位或 按位异或 按位取反 右移 【例4-10】设a=0x45=01010100B,b=0x3b=00111011B,则a&b、a|b、ab、a、a2分别为多少? a&b=00010000b=0x10。 a|b=01111111B=0x7f。 ab=01101111B=0x6f。 a=10101011B=0xab。 a2=00001110B=0x0e。,复合赋值运算符 C51语言中支持在赋值运算符“=”的前面加上其它运算符,组成复合赋值运算符。下面是C51中支持的复合赋值运算符: += 加法赋值 + 减法赋值 *= 乘法赋值 /= 除法赋值 %= 取模赋值 &= 逻辑与赋值 |= 逻辑或赋值 = 逻辑异或赋值 = 逻辑非赋值 = 右移位赋值 =2相当于x=x2。,函数调用方式:3种 1 把被调函数名作为一个语句 2 被调函数作为表达式的运算对象 resule=2*get(a,b) 3 被调函数作为另一个数的实际参数 m=max(a,get(a,b),4.7 函 数,4.8 C语言编程实例,#include main() char c; for(;) c=XBYTE14; XBYTE14=XBYTE15; XBYTE15=c; ,循环语句: 1 while(判断句式) 2 do语句while(判断句式) 3 for(表达式1;表达式2;表达式3)语句 分支程序 1if(表达式)语句 2 if (表达式)语句else语句 3 switch(表达式)case 常量表达式1:语句break; 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 Main() 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=P11; extern void delay4ms(); main() /unsigned char i; for(;) P1_1=0; delay4ms(); P1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025至2030年中国特医食品行业投资分析及发展战略研究咨询报告
- 2025至2030年中国体外诊断医疗行业市场深度评估及投资战略规划报告
- (2025)中华人民共和国食品安全法培训考试题库及参考答案
- 宾客关系主任岗位职责文稿(打印稿)
- 医疗执法法律知识培训课件
- 施工单位营改增课件
- 交通运输行业航线数据表
- 2025年同步劲量频闪灯行业当前市场规模及未来五到十年发展趋势报告
- 2025年垃圾处理行业当前市场规模及未来五到十年发展趋势报告
- 2025年泵及真空设备行业当前竞争格局与未来发展趋势分析报告
- 出差员工安全管理制度
- CJ/T 120-2016给水涂塑复合钢管
- 水厂各项卫生管理制度
- T/CECS 10214-2022钢面镁质复合风管
- 2025CSCO子宫内膜癌新进展及指南更新要点
- 微信小店2025爆品爆单宝典
- 2025年贵州省存量房买卖合同
- 2024-2025学年湖北省武汉市高一上学期1月期末考试英语试题(解析版)
- 复印打字服务协议书
- 2025 年全国保密教育线上培训考试测试卷及答案
- 村医依法执业培训
评论
0/150
提交评论