单元片机c语言入门,片机的C语言编程.ppt

片机的C语言编程.ppt

第4章单片机C语言程序设计 4 1 1C语言的特点及程序结构 一 C语言的特点 1 无须考虑寻址问题和数据类型问题 2 模块化结构 3 丰富的子程序 4 可以与汇编交叉使用 5 可以直接对计算机硬件进行操作 6 生成的目标代码质量高 程序执行效率高 7 可移植性好 4 1C语言的程序结构 C语言程序采用函数结构 每个C语言程序由一个或多个函数组成 在这些函数中至少应包含一个主函数main 也可以包含一个main 函数和若干个其它的功能函数 不管main 函数放于何处 程序总是从main 函数开始执行 执行到main 函数结束则结束 在main 函数中调用其它函数 其它函数也可以相互调用 但main 函数只能调用其它的功能函数 而不能被其它的函数所调用 功能函数可以是C语言编译器提供的库函数 也可以是由用户定义的自定义函数 在编制C程序时 程序的开始部分一般是预处理命令 函数说明和变量定义等 C语言程序结构一般如下 预处理命令include函数说明longfun1 floatfun2 intx y floatz intFindMax inta intb intFindMin inta intb main intnVar1 nVar2 nMax nMin nVar1 3 nVar2 5 nMax FindMax 3 5 调用求最大值函数nMin FindMin 3 5 调用求最小值函数while 1 intFindMax inta intb 求最大值函数体 returna b a b intFindMin inta intb 求最小值函数体 returna b a b 4 2C51的数据类型 在C51语言程序中 有可能会出现在运算中数据类型不一致的情况 C51允许任何标准数据类型的隐式转换 隐式转换的优先级顺序如下 bit char int long floatsigned unsigned也就是说 当char型与int型进行运算时 先自动对char型扩展为int型 然后与int型进行运算 运算结果为int型 C51除了支持隐式类型转换外 还可以通过强制类型转换符 对数据类型进行人为的强制转换 C5l编译器除了能支持以上这些基本数据类型之外 还能支持一些复杂的组合型数据类型 如数组类型 指针类型 结构类型 联合类型等这些复杂的数据类型 在本书的后面将相继介绍 存储器类型是用于指明变量所处的单片机的存储器区域情况 存储器类型与存储种类完全不同 C51编译器能识别的存储器类型有以下几种 见表所示 定义变量时也可以省 存储器类型 省时C51编译器将按编译模式默认存储器类型 具体编译模式的情况在后面介绍 4 3数据的存储类型和存储器模式 4 3数据的存储类型和存储器模式 DatacharvarCharcodeMSG PARAMETER Unsignedlongxdataarray 100 Floatidatax y zBitlockUnsignedintpdatasionUnsignedcharxdatavertor 10 4 4 SfrP0 0 x80 Charbdataflags Sbitflag0 flags 0 pragmasmall 变量的存储模式为SMALL chark1 intxdatam1 pragmacompact 变量的存储模式为compact chark2 intxdatam2 intfunc1 intx1 inty1 large 函数的存储模式为LARGE return x1 y1 intfunc2 intx2 inty2 函数的存储模式隐含为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 1 auto 使用auto定义的变量称为自动变量 其作用范围在定义它的函数体或复合语句内部 定义变量时 如果省略存储种类 则该变量默认为自动 auto 变量 2 extern 使用extern定义的变量称为外部变量 在一个函数体内 要使用一个已在该函数体外或别的程序中定义过的外部变量时 该变量在该函数体内要用extern说明 3 static 使用static定义的变量称为静态变量 它又分为内部静态变量和外部静态变量 在函数体内部定义的静态变量为内部静态变量 它在对应的函数体内有效 一直存在 但在函数体外不可见 这样不仅使变量在定义它的函数体外被保护 还可以实现当离开函数时值不被改变 4 register 使用register定义的变量称为寄存器变量 它定义的变量存放在CPU内部的寄存器中 处理速度快 但数目少 C51编译器编译时能自动识别程序中使用频率最高的变量 并自动将其作为寄存器变量 用户可以无需专门声明 例 变量定义存储种类和存储器类型相关情况 chardatavarl 在片内RAM低128B定义用直接寻址方式访问的字符型变量var1 intidatavar2 在片内RAM256B定义用间接寻址方式访问的整型变量var2 autounsignedlongdatavar3 在片内RAM128B定义用直接寻址方式访问的自动无符号长整型变量var3 externfloatxdatavar4 在片外RAM64KB空间定义用间接寻址方式访问的外部实型变量var4 intcodevar5 在ROM空间定义整型变量var5 unsigncharbdatavar6 在片内RAM位寻址区20H 2FH单元定义可字节处理和位处理的无符号字符型变量var6 4 4指针 注 指针的声明包括3个部分 目标变量的数据类型目标变量的存储类型指针变量自身的存储类型 此指针放在哪里 指针变量本身的数据类型 8位 16位 32位 根据被指的变量存储类型来决定 二 通过指针访问地址采用指针的方法 可以实现在C51程序中对任意指定的存储器单元进行访问 例 通过指针实现绝对地址的访问 defineucharunsignedchar defineuintunsignedintvoidfunc void uchardatavar1 Xdataucharpdata dp1 定义一个指向pdata区的指针dp1 指针本身存放于片外64K中 uintxdata dp2 定义一个指向xdata区的指针dp2 uchardata dp3 定义一个指向data区的指针dp3 dp1 0 x30 dp1指针赋值 指向pdata区的30H单元 dp2 0 x1000 dp2指针赋值 指向xdata区的1000H单元 dp1 0 xff 将数据0 xff送到片外RAM30H单元 dp2 0 x1234 将数据0 x1234送到片外RAM1000H单元 dp3 给变量var1赋值0 x20 在C51中 允许用户对特殊功能寄存器进行访问 访问时须通过sfr或sfr16类型说明符进行定义 定义时须指明它们所对应的片内RAM单元的地址 格式如下 sfr或sfr16特殊功能寄存器名 地址 sfr用于对MCS 51单片机中单字节的特殊功能寄存器进行定义 sfr16用于对双字节特殊功能寄存器进行定义 特殊功能寄存器名一般用大写字母表示 sfrSCON 0 x98 sfrTMOD 0 x89 sfrP1 0 x90 sfr16ACC 0 xe0 sfr16T1 0X8A 4 4C51对SFR 位寻址 存储器 IO口的定义 位变量在C51中 允许用户通过位类型符定义位变量 位类型符有两个 bit和sbit 可以定义两种位变量 sbit定义的变量必须与51单片机的一个可位寻址字节的某一位联系在一起 C51编译的时候其地址是不可变的 它的格式如下三个 例 1 bitm 2 bdataintibase sbitmybit ibase 15 3 sfrP1 0X90 sbitP1 1 P1 1 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 defineucharunsignedchar defineuintunsignedintvoidmain void ucharvar1 uintvar2 var1 XBYTE 0 x0005 var2 XWORD 0 x0002 while 1 在上面程序中 其中XBYTE 0 x0005 就是以绝对地址方式访问的片外RAM0005字节单元 XWORD 0 x0002 就是以绝对地址方式访问的片外RAM0002字单元 位运算符 C51语言能对运算对象按位进行操作 它与汇编语言使用一样方便 位运算是按位对变量进行运算 但并不改变参与运算的变量的值 如果要求按位改变变量的值 则要利用相应的赋值运算 C51中位运算符只能对整数进行操作 不能对浮点数进行操作 C51中的位运算符有 按位与 按位或 按位异或 按位取反 右移 例4 10 设a 0 x45 01010100B b 0 x3b 00111011B 则a b a b a b a a 2分别为多少 a b 00010000b 0 x10 a b 01111111B 0 x7f a b 01101111B 0 x6f a 10101011B 0 xab a 2 00001110B 0 x0e 复合赋值运算符C51语言中支持在赋值运算符 的前面加上其它运算符 组成复合赋值运算符 下面是C51中支持的复合赋值运算符 加法赋值 减法赋值 乘法赋值 除法赋值 取模赋值 逻辑与赋值 逻辑或赋值 逻辑异或赋值 逻辑非赋值 右移位赋值 2相当于x x 2 函数调用方式 3种1把被调函数名作为一个语句2被调函数作为表达式的运算对象resule 2 get a b 3被调函数作为另一个数的实际参数m max a get a b 4 7函数 4 8C语言编程实例 includemain charc for c XBYTE 14 XBYTE 14 XBYTE 15 XBYTE 15 c 循环语句 1while 判断句式 2do 语句 while 判断句式 3for 表达式1 表达式2 表达式3 语句 分支程序1if 表达式 语句 2if 表达式 语句 else 语句 3switch 表达式 case常量表达式1 语句 break case常量表达式2 语句 break 1 在C51中嵌入汇编程序 嵌入汇编程序是通过C51中的预处理指令 pragmaasm endasm语句来实现的 其格式如下 pragmaASM 汇编程序代码 pragmaENDASM 2 在C51中调用汇编程序 这种方法应用较多 C模块与汇编模块的接口较简单 分别用C51与A51对源程序进行编译 然后用L51将obj文件连接即可 关键问题在于C函数与汇编函数之间的参数传递和得到正确的返回值 以保证模块间的数据交换 4 9汇编语言和C语言的混合编程 includeMain P2 1 pragmaasmMOVR7 10 DEL MOVR6 20 DJNZR6 R6 1操作 不为零 跳转到自己本身DJNZR7 DEL R7 1操作 不为零 跳转到DEL pragmaendasmP2 0 include defineucharunsignedcharsbitP1 1 P1 1 externvoiddelay4ms main unsignedchari for P1 1 0 delay4ms P1 1 1 delay4ms include defineucharunsignedcharsbitP1 0 P1 0 externdelay1ms ucharx voiddelay4ms void P1 0 0 delay1ms 2 P1 0 1 delay1ms 2 PUBLIC DELAY1MS DESEGMENTCODE RSEGDE DELAY1MS NOPDELA MOVR1 0F8H LOP1 NOPNOPDJNZR1 LOP1DJNZR7 DELAEXIT RETEND

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值