计控第2章单片机C语言编程.ppt_第1页
计控第2章单片机C语言编程.ppt_第2页
计控第2章单片机C语言编程.ppt_第3页
计控第2章单片机C语言编程.ppt_第4页
计控第2章单片机C语言编程.ppt_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

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

文档简介

第二章单片机的C语言编程 第二章单片机的C语言编程 2 1概述2 2C51程序结构2 3C51的数据类型与运算符2 4C51的函数2 5C51的硬件编程 2 1C51概述 51系列单片机支持三种高级语言 即PL M C和BASIC C语言是一种通用的程序设计语言 其代码率高 数据类型及运算符丰富 并具有良好的程序结构 适用于各种应用的程序设计 是目前使用较广的单片机编程语言 MCS 51系列单片机采用的C语言 简称C51 C51符合C语言的ANSI标准 并根据单片机的特性进行了扩展 C51所产生的目标代码短 运行速度高 所需存储空间小 注 1 在实际的系统设计中 当设计对象只是一个小的嵌入式系统时 汇编语言是一个很好的选择 因为代码一般都不超过8K 而且都比较简单 2 当一个系统对时钟要求很严格时 使用汇编语言成了唯一的方法 2 2C51的程序结构 同ANSIC一样 C51的程序由一个个函数组成 这里的函数和其他语言的 子程序 或 过程 具有相同的意义 必须有一个主函数main 程序的执行从main 函数开始 调用其他函数后返回主函数main 最后在主函数中结束整个程序而不管函数的排列顺序如何 功能函数可以是C51语言提供的库函数 也可以是用户自定义的函数 组成结构 预处理语句全局变量说明 可被各函数引用 main 主函数 局部变量说明 只在本函数引用 执行语句 包括函数调用语句 fun1 形式参数表 函数1 形式参数说明 局部变量说明执行语句 包括调用其他函数语句 funn 形式参数表 函数n 形式参数说明 局部变量说明执行语句 C语言的语句规则 1 每个变量必须先说明后引用 变量名英文大小写是有差别的 2 C语言程序一行可以书写多条语句 但每个语句必须以 结尾 一个语句也可以多行书写 3 C语言的注释用 或 表示 4 花括号必须成对 位置随意 可在紧挨函数名后 也可另起一行 多个花括号可以同行书写 也可逐行书写 为层次分明 增加可读性 同一层的 花括号对齐 采用逐层缩进方式书写 2 3C51的数据类型与运算符2 3 1C51的存储类型 51系列单片机的内存区域被分为两大类 一类是程序存储区 即ROM 另一类是数据存储区 包括内部数据存储区和外部数据存储区 内部数据存储区中又包含了51单片机的特殊功能寄存器 1数据存储区1 内部数据存储区 data idata bdata2 外部数据存储区 xdata pdata2程序存储器 code 51系列单片机的存储区类型 2 3C51的数据类型与运算符2 3 2C51的数据类型 无论哪种数据都是存放在存贮单元中的 每一个数据究竟要占用几个单元 即数据的长度 都要提供给编译系统 编译系统以此为根据预留存贮单元 这就是定义数据类型的意义 C51支持ANSIC的所有标准数据类型 并在此基础上增设了位型及特殊功能寄存器类型 2 3C51的数据类型与运算符2 3 2C51的数据类型 1 C51的数据类型 2 常量与变量C51支持的数据有常量 变量 指针 存储时 先高后低 原则 常量位置与定义说明有关 一般放在程序存储区code 1 常量整型常量 实型常量 字符常量 字符串常量 符号常量 符号常量在使用前必须先定义 格式为 define标识符常量 是C51的预处理指令2 变量定义变量的一般格式 存储模式 数据类型 存储器类型 变量名 变量说明举例 charvar 字符变量var 存储类型由编译模式确定 charcodeMSG PARAMETER 字符数组MSG 定位在程序存贮区 unsignedlongxdataarray 100 无符号长型数组定位在片外RAM区 每元素占4bytes floatidatax y z 实型变量x y z 定位在片内用间址访问的内部RAM区 bitlock 位变量Lock 由编译器定位 unsignedintpdatasion 无符号整型变量sion定位在外部RAM unsignedcharxdatavector 10 4 4 无符号字符型三维数组 定位在片外RAM区 sfrP0 0 x80 定义P0口 地址为80H charbdataflags 字符变量flags定位在可位寻址内部RAM区 sbitflag0 flags 0 定义flag0为flags 0 说明 1 字符型 char 整型 int 和长整型 long 均有符号型 signed 和无符号型 unsigned 两种 如果不是必须 尽可能选择unsigned型 这将会使编译器省却符号位的检测 使生成的程序代码比signed类型短得多 2 程序编译时 C51编译器会自动进行类型转换 当运算符两边为不同类型的数据时 编译器先将低级的数据类型转换为较高级的数据类型 运算后 运算结果为高级数据类型 3 bit和sbit都是C51扩展的变量类型 bit用来定义一个普通位变量 0或1 编译器在编译过程中分配地址 除非指定否则这个地址随机分布在整个可寻址空间中 所有可位寻址的位都可由sbit指定 这包括可位寻址区和SFR中的位 4 如果在变量说明时略去存贮器类型标志符 编译器会自动选择默认的存贮器类型 1 关于指针型变量在汇编语言程序中 要取存贮单元m的内容可用直接寻址方式 也可用寄存器间接寻址方式 如果用R1寄存器指示m的地址 则用 R1取m单元的内容 相对应的在C语言中用变量名表示取变量的值 相当于直接寻址 也可用另一个变量 如P 存放m的地址 P就相当于R1寄存器 用 P取得m单元的内容 相当于汇编的间接寻址方式 这里P即为指针型变量 下面表格表示两种语言将m单元的内容送n单元的对照语句 注 上表省略了汇编语言程序中对符号地址n和m用EQU伪指令进行具体地址定义的语句以及C语言对变量n m和指针变量P进行类型定义的语句 实际程序设计中 此步是不可缺少的 表中 为取地址运算符 为取内容运算符 汇编语言和C语言的对照表 2 3C51的数据类型与运算符2 3 3C51的指针 说明 1 在C语言中 为了能够实现直接对内存单元进行操作 引入了指针类型的数据 一个变量的地址就称为该变量的指针 2 如果有一个变量专门用来存放另一个变量的地址 则称之为指针变量 一个指针变量存放的内容是另一个变量在内存中的地址 每一个变量都有它自己的指针 地址 3 C语言中用 表示 指向 如 整型变量i的地址存放在指针变量ip中 则i 0 x50 ip 0 x50 都是给同一个变量赋值 4 区分 和 运算符 2 指针型数据的类型由于C51是结合51单片机硬件的 51单片机的不同存贮空间 有不同的地址范围 即使对于同一外部数据存贮器 又有用 Ri寻址 Ri为八位 和用 DPTR寻址 DPTR为十六位 两种寻址方式 而指针本身也是一个变量 有它存放的存贮区和数据长度 因此 在指针类型的定义中要说明 被指的变量的数据类型和存贮类型 指针变量本身的数据类型 占几个字节 和存贮类型 即指针本身存放在什么存贮区 指针类型的定义形式如下 数据类型 存储器类型1 存储器类型2 标识符 C51各类指针类型和其占用字节大小 存储器类型2 选项用于指定指针本身的存储器空间 指向不同存储区变量的通用指针指针能适用于指向任何存贮空间 此时指针长度为3字节 第一字节表示存贮器类型编码 第二 三字节分别表示所指地址的高位和低位 unsignedchar ptr 通用指针ptr 指针存放在默认存储区unsignedchar idataiptr 通用指针iptr 指针存放在idata存储区指向固定存储区变量的指针定义为data或idata 表示指针指向内部数据存贮器 定义为pdata 表示指针指向外部数据存贮器 用 Ri间址 以上均为八位地址 定义为类型code xdata 表示指针指向外部程序存贮器或外部数据存贮器指针 本身 即被指示地址 应为十六位长度 intcode ptr 指向code存储区的指针ptr 指针存放在默认存储区intidata pdataiptr 指向idata存储区的指针iptr 指针存放在pdata存储区 指针变量说明 longxdata px 指针px指向xdata区的long型 每个数据占四个单元 变量 指针自身在编译模式默认的存贮区 指针长度为2个字节 charxdata datapd 指针pd指向xdata区的字符型变量 自身在data区 指针长度为2个字节 datacharxdata pd 与上例等效 dataint pn 和int datapn及int pn等效 定义一个类型为int型的通用型指针 指针自身在data区 长度为3字节 在上例的指针声明中包含如下几个内容 1 指针变量名 如px 前面冠以 表示px为指针型变量 此处 不带取内容之意 2 指针指向的存贮类型 即指向哪个存贮区 它决定了指针本身的长度 见数据类型表 存贮类型声明的位置在数据类型和指针名 如 px 之间 如无此项声明 则此指针型变量为通用型 3 指针指向的存贮区的数据类型 即被指向的存贮区以多少个单元作一个数据单位 当程序通过指针对该区操作时 将按此规定的单元个数的内容作为一个数据操作 4 指针变量自身的存贮类型 即指针处于什么区与自身的长度无关 该声明可位于声明语句的开头 也可在 和变量名之间 此项由编译模式放在默认区 如无规定编译模式 通常在data区 1 特殊功能寄存器SFR定义C51提供了一种自主形式的定义方式 使用特定关键字sfr如sfrSCON 0 x98 串行通信控制寄存器地址98H sfrTMOD 0 x89 定时器模式控制寄存器地址89H sfrACC 0 xe0 A累加器地址E0H sfrP1 0 x90 P1端口地址90H 定义了以后 程序中就可以直接引用寄存器名 C51也建立了一个头文件reg51 h 增强型为reg52 h 在该文件中对所有的特殊功能寄存器的进行了sfr定义 对特殊功能寄存器的有位名称的可寻址位进行了sbit定义 因此 只要用包含语句 include 就可以直接引用特殊功能寄存器名 或直接引用位名称 要特别注意 在引用时特殊功能寄存器或者位名称必须大写 sfr和sbit只能在函数外使用 一般放在程序的开头 2 3C51的数据类型与运算符2 3 4C51的硬件资源定义 2 对位变量的定义C51对位变量的定义有三种方法 将变量用bit类型的定义符定义为bit类型 如bitmn mn为位变量 其值只能是 0 或 1 其位地址由C51任意分配 采用字节寻址变量 位的方法 如bdataintibase ibase定义为整型变量 sbitmybit ibase 15 mybit定义为ibase的D15位 这里位是运算符 相当于汇编中的 其后的最大取值依赖于该位所在的字节寻址变量的定义类型 如定义为char最大值只能为7 对特殊功能寄存器的位的定义方法1 使用头文件及sbit定义符 多用于无位名的可寻址位 例如 includesbitP1 1 P1 1 P1 1为P1口的第1位 sbitac ACC 7 ac定义为累加器A的第7位 方法2 使用头文件reg51 h 再直接用位名称 例如 includeRS1 1 RS0 0 方法3 字节地址位表示例如sbitCY 0 xd0 7 方法4 用位地址表示例如sbitCY 0 xd7 方法5 用寄存器名 位定义例如sfrPSW 0 xd0 定义PSW地址为d0H sbitCY PSW 7 CY为PSW 7 3 C51对存贮器和外接I O口的绝对地址访问和定义 对存贮器的绝对地址访问利用绝对地址访问的头文件absacc h可对不同的存贮区进行访问 该头文件的函数有 CBYTE 访问code区字符型 DBYTE 访问data区字符型 PBYTE 访问pdata或I O区字符型 XBYTE 访问xdata或I O区字符型 还有CWORD DWORD PWORD和XWORD四个函数 它们的访问区域同上 只是访问的类型为int型 例 include definecomXBYTE 0 x07ff 那么后面程序com变量出现的地方 就是对地址为07ffH的外部RAM或I O口进行访问 例 XWORD 0 0 x9988 即将9988H int类型 送入外部RAM的0号和1号单元 使用中要注意 absacc h一定要包含进程序 XWORD必须大写 对外部I O口的访问由于单片机的I O口和外部RAM统一编址 因此对I O口地址的访问可用XBYTE MOVX DPTR 或PBYTE MOVX Ri 进行 例 include absacc h definePAXBYTE 0 xffec 将PA定义为外部I O口 地址0FFECH defineNAMEDBYTE 0 x40 将NAME定义为片内RAM 地址40Hvoidmain void PA 0 x3a NAME 0 x01 对绝对地址的定义定义变量时 使用 at 关键词指定变量的绝对地址 格式为 存储类型 数据类型变量名 at 绝对地址 例 dataunsignedcharx1 at 0 x40 在data区定义字节变量x1 它的地址为40Hxdataunsignedintx2 at 0 x2000 在xdata区定义字变量x2 它的地址为2000Hvoidmain void x1 0 xff x2 0 x1234 includevoidmain void unsignedcharcodedesign 0 xFF 0 xFE 0 xFD 0 xFB 0 xF7 0 xEF 0 xDF 0 xBF 0 x7F 0 xBF 0 xDF 0 xEF 0 xF7 0 xFB 0 xFD 0 xFE 定义花样数据 数据存放在片内CODE区中unsignedinta 定义延时用的变量unsignedcharb 定义循环用的变量unsignedcharcode dsi 定义指向CODE区的指针do dsi 例1 如下图 利用指针实现循环点亮发光二极管功能 2 3C51的数据类型与运算符2 3 5C51的运算符 1 赋值运算符 将 的右边的值赋值给左边的变量 2 C51的算术运算符 加或正号 减或负号 乘号 除号 求余 优先级 先乘除 后加减 先括号内 再括号外3 C51的关系运算符有六种 小于 大于 小于等于 大于等于 相等 不相等 优先级 前四个高 后二个 和 级别低 4 C51的逻辑运算符有三种 逻辑表达式和关系表达式的值相同 以0代表假 以1代表真 以上三种运算的优先级见图 5 C51的按位操作的运算符有六种 按位与 按位或 按位异或 位取反 位右移 注 补零移位 例1 a 0 xf0H 表达式a a值为0FH例2 a 0 xea 表达式a 2值为A8H 即a值左移两位 移位后空白位补0 6 自增 自减运算符 i i 在使用i之前 先使i值加1 减1 i i 在使用i之后 再使i值加1 减1 例 设i原值为5j i则j值为6 i值也为6j i 则j值为5 i值为6 非 算术运算 关系运算 和 赋值运算 例2 P1 0接一开关 P1 1接一发光二极管 开关打开时 二极管不亮 开关闭合时 二极管亮 include reg51 h sbitp1 0 P1 0 sbitp1 1 P1 1 voidmain while 1 if p1 0 0 P1 1 0 elseP1 1 1 2 4C51的函数 C51程序由函数组成 从用户使用角度划分 函数分为库函数和用户自定义函数库函数是编译系统为用户设计的一系列标准函数 用户只需调用 而无需自己去编写这些复杂的函数 如前面所用到的头文件reg51 h等 有的头文件中包括一系列函数 要使用其中的函数必须先使用 include包含语句 然后才能调用 用户自定义函数是用户根据任务编写的函数 从参数形式上函数分为无参函数和有参函数 有参函数即是在调用时 调用函数用实际参数代替形式参数 调用完返回结果给调用函数 2 4C51的函数2 4 1函数的定义 C51中函数的定义格式与标准C相似 增加了一下内容 1 将函数定义为中断服务子程序 2 选择函数所使用的寄存器体 3 选择存储模式 4 说明函数是一个可重入函数 函数的定义格式 返回值类型 函数名 参数 存储模式 reentrant 1 可省略2 返回值类型 无返回值时应声明为void 省略时默认为int 3 存储模式 说明函数的存储模式 可以为small compact large 省略时使用默认的存储模式 4 reentrant 说明函数为可重入函数 当递归调用时使用此关键字 中断函数的定义格式 void函数名 void interruptn usingm 1 interruptn 说明函数是中断类型n的中断服务子程序C51编译器支持32个中断函数 中断类型号为0 31 函数定义为中断函数后 编译器会在对应的中断服务程序入口处 生成LJMP指令 直接跳到中断函数 中断函数不能带参数 不能定义函数返回值 且程序不能直接调用中断函数 编译器会自动为中断函数添加保护现场的代码 进入函数后 压栈保护函数中使用了的ACC B DPTR PSW寄存器的值 返回前出栈恢复 51单片机的中断源编号 2 usingm 指定函数使用第m个寄存器组 m可以为0 1 2 3 代表4个不同的工作寄存器组 定义函数时可省略usingm选项 此时编译器自动选择一个寄存器组作绝对寄存器组访问 如定义则小心使用 要保证任何寄存器组的切换都只在控制的区域内发生 否则产生不正确的函数结果 在函数的入口处将当前工作寄存器组保护到堆栈中 函数退出之前将被保护的工作寄存器组从堆栈中恢复 2 4C51的函数2 4 2函数的调用 函数调用的形式为 函数名 实际参数表 实参和形参必须在数目 类型及顺序上严格保持一致 对于无参函数不存在实际参数表 函数的调用方式有三种 函数调用语句 即把被调函数名作为调用函数的一个语句 如fun1 被调函数作为表达式的运算对象 如result 2 get a b 此时get函数中的a b应为实参 其以返回值参与式中的运算 被调函数作为另一个函数的实际参数如m max a get a b 函数get a b 作为函数max 的一个实际参数 注 1 如果被调函数出现在主调函数之后 在主调函数前应对被调函数进行说明 形式为 返回值类型被调函数名 形式参数表 2 如果被调函数出现在主调函数之前 可以不对被调函数说明 下面以一个简单例子来说明 intfun1 a b inta b intc c a b return c main intd u 3 v 2 d 2 fun1 u v 上例被调函数在主调函数前 不用说明 intfun1 a b main intd u 3 v 2 d 2 fun1 u v intfun1 a b inta b intc c a b return c 上例中被调函数在主调函数后 在前面对被调函数进行说明 2 4C51的函数2 4 3C51的库函数 库函数是编译系统为用户设计的一系列标准函数 用户只需调用 而无需自己去编写这些复杂的函数 如前面所用到的头文件reg51 h absacc h等 有的头文件中包括一系列函数 要使用其中的函数必须先使用 include包含语句 然后才能调用 内部库函数 include crol cror 将char型变量循环向左 右 移动指定位数后返回 iror irol 将int型变量循环向左 右 移动指定位数后返回 lrol lror 将long型变量循环向左 右 移动指定位数后返回 nop 相当于插入NOP testbit 相当于JBCbitvar测试该位变量并跳转同时清除 2 4C51的函数2 4 3C51的库函数 2直接访问存储区的头文件 include 可以直接访问指定地址的存储区单元CBYTE CWORD 直接访问程序存储区 DBYTE DWORD 访问内部数据区 PWORD PBYTE 访问外部数据区当前页 XBYTE XWORD 访问外部数据区 例 rval CBYTE 0 x0002 指向程序存贮器的0002H地址rval XWORD 0 x0002 指向外RAM的0004H地址 2 4C51的函数2 4 3C51的库函数 3 缓冲区处理函数 include包括搜索 比较 拷贝 移动等函数memchr memcmp memcpy memmove strcat strchr strcmp strcpy4 字符转换与字符分类 includeisxdigit 判断字符是否是16进制数字字符islower 是否是小写isupper 是否是大写tolower 字符转换成小写字符toupper 字符转换成大写字符5 数学函数 include包含常用的算术运算函数sin sin函数cos cos函数abs 求绝对值exp log sqrt tan pow xy 例3 如下图 单片机P1口的P1 0和P1 1各接一个开关S1 S2 P1 4 P1 5 P1 6和P1 7各接一只发光二极管 由S1和S2的不同状态来确定哪个发光二极管被点亮 2 5C51的硬件编程2 5 1I O口编程 include reg51 h voidmain while 1 循环判断S1 S2 chara a P1 a a 若要求用当S1与S2同时按下时 4个LED全部点亮 当仅有S1按下时 前2个LED点亮 当仅有S2按下时 后2个LED点亮 无键按下时 4个LED全部熄灭 include 头文件中包含了特殊功能寄存器P1和P2的定义 sbitS1 P1 0 定义位变量 将P1 0定义名称为S1 sbitS2 P1 1 voidmain while 1 循环判断S1 S2 if S1 0 无键按下 熄灭所有LED 2 5C51的硬件编程2 5 2定时器编程 例4 如例1图 用定时器0实现P1 7口所接LED灯每隔60ms闪烁一次 设系统晶振频率为12MHz includesbitP1 7 P1 7 voidmain P1 0 xff 关闭P1口接的所有灯 TMOD 0 x01 确定定时器工作模式 TH0 0 x15 TL0 0 xa0 TR0 1 启动定时器0工作 for if TF0 如果TF0等于1 TF0 0 清TF0 TH0 0 x15 重置初值 TL0 0 xa0 P1 7 P1 7 LED灯亮灭状态切换 例5 如下图所示 编写控制4位显示器动态显示的程序 位选码输出 段选码输出 include reg51 h charcodedispdata 0 x3F 0 x06 0 x5B 0 x4F 0 x66 0 x6D 0 x7D 0 x07 0 x7F 0 x6F 数字0 9对应的段选码 chardis data 2 4 6 8 voiddelay void 延时1ms TH0 500 256 TL0 500 256 TR0 1 while TF0 TF0 0等待 TF0 0 TR0 0 voiddisp charch1 显示函数 staticcharch 0 x01 P1 ch P2 dispdata dis data ch1 ch ch 1 if ch 0 x10 ch 0 x01 main charch1 TMOD 0 x01 T0为16位定时工作方式 while 1 for ch1 0 ch1 4 ch1 对4位LED扫描一遍 disp ch1 delay delay delay Proteus仿真结果 例6在下图中接有五个共阴极数码管的动态显示接口电路 开关打向位置 1 时 显示 12345 字样 当开关打向 2 时 显示 HELLO 字样 试用C51编程实现功能 include defineuintun

温馨提示

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

最新文档

评论

0/150

提交评论