单片机C51语言及程序设计ppt课件

上传人:钟*** 文档编号:5834559 上传时间:2020-02-09 格式:PPT 页数:78 大小:5.04MB
返回 下载 相关 举报
单片机C51语言及程序设计ppt课件_第1页
第1页 / 共78页
单片机C51语言及程序设计ppt课件_第2页
第2页 / 共78页
单片机C51语言及程序设计ppt课件_第3页
第3页 / 共78页
点击查看更多>>
资源描述
单片机C51语言基础及C51程序设计 1 主要内容 C51语言概述C51的标识符与关键字C51的变量及数据类型C51的运算符及表达式C51的程序结构C51开发环境C51编程实例 2 一 C51语言概述 单片机C51语言是ANSIC的扩展 C51语言除了具有C语言的优点外 同时具有汇编语言的硬件操作能力 运行于单片机平台 支持的微处理器种类繁多 可移植性好 对于兼容的8051系列单片机 只要将一个硬件型号下的程序稍加修改 甚至不加改变 就可移植到另一个不同型号的单片机中运行 具有高级语言的特点 尽量减少底层硬件寄存器的操作 单片机C51语言提供了完备的数据类型 运算符及函数供使用 C51语言代码执行的效率方面十分接近汇编语言 且比汇编语言的程序易于理解 便于代码共享 3 二 C51的标识符与关键字 标识符即特定的字符或字符串 用来给变量 函数 符号常量 自定义类型等命名 用标识符给C语言程序中各种对象命名时 要用字母 下划线和数字组成的字符序列 并要求首字符是字母或下划线 不能是数字 字母的大小写是有区别的 通常下划线开头的标识符是编译系统专用的 因此在编写C语言源程序时一般不使用以下划线开头的标识符 而将下划线用作分段符 C51编译器规定标识符最长可达255个字符 但只有前32个字符在编译时有效 因此标识符的长度一般不要超过32个字符 关键字是一种已被系统使用过的具有特定含义的标识符 用户不得再用关键字给变量等命名 C语言关键字较少 ANSIC标准一共规定了32个关键字 见表 4 ANSIC语言的关键字 5 6 KeilC51编译器除了有ANSIC标准的32个关键字外 还根据51单片机的特点扩展了相应的关键字 在KeilC51开发环境的文本编辑器中编写C程序 系统可以把保留字以不同的颜色显示 缺省颜色为蓝色 下表为KeilC51编译器扩展的关键字 7 1 C51的变量 在程序执行过程中 数值可以发生改变的量称为变量 变量名与存储单元地址相对应 变量值与存储单元的内容相对应 例如 三 C51的变量及数据类型 8 存储类别 数据类型 存储器类型 变量名 标准C 标准C 括号项 可以缺省 但需有缺省值 C51变量定义的四要素 C51特有 标准C C51 9 存储类别 数据类型 存储器类型 变量名 共有四个说明符 1 auto 自动型 变量的作用范围在定义它的函数体或语句块内 执行结束后 变量所占内存即被释放 2 extern 外部型 在一个源文件中被定义为外部型的变量 在其它源文件中需要通过extern说明方可使用 3 static 静态型 利用static可使变量定义所在的函数或语句块执行结束后 其分配的内存单元继续保留 4 register 寄存器型 将变量对应的储存单元指定为通用寄存器 以提高程序运行速度 缺省存储种类为auto 自动 型变量 10 数据的不同格式叫做数据类型 有符号数类型可以忽略signed标识符 标准C语言的数据类型 存储类别 数据类型 存储器类型 变量名 11 C51扩充数据类型 bit sfr或sfr16 sbit bit型 关键词bit用于定义一个位变量 语法规则 bitbit name 0或1 例如 bitdoor 0 定义一个叫door的位变量且初值为0 标准C的变量定义举例 inta 5 定义一个初值为5的整形变量a语法规则 intint name 常数 注意 上述变量的物理地址是由编译器分配的 12 sfr或sfr16型 关键词sfr或sfr16用于定义SFR字节地址变量 语法规则 sfr或sfr16sfr name 字节地址常数 51MCU中有21个SFR 如何定义与这些单元相关的变量 13 例如 sfrP0 0 x80 定义P0口地址80HsfrPCON 0 x87 定义PCON地址87Hsfr16DPTR 0 x82 定义DPTR的低端地址82H 注意 SFR字节地址变量的物理地址是由MCU资源决定的 14 sbit型 部分SFR具有位地址 如何定义与这些位地址相关的变量 绝对位地址 相对位地址 字节地址 两种位地址表达形式 绝对位地址 相对位地址 15 1 将SFR的绝对位地址定义为位变量名sbitbit name 位地址常数 例如 sbitCY 0 xD7 3 将SFR的相对位位置定义位变量名sbitbit name sfr name 位位置 例如 sbitCY PSW 7 2 将SFR的相对位地址定义为位变量名sbitbit name sfr字节地址 位位置 例如 sbitCY 0 xD0 7 关键词sbit用于定义SFR位地址变量 三种定义形式 16 C51编译器在头文件 REG51 H 中定义了全部sfr sfr16和sbit变量 用一条预处理命令 include把这个头文件包含到C51程序中 无需重新定义即可直接使用它们的名称 17 应用举例 18 存储类别 数据类型 存储器类型 变量名 51单片机的三个逻辑存储空间 片内数据存储器 片外数据存储器和程序存储器 19 建立C51存储类型与存储空间的对应关系 20 C51的存储类型与存储空间对应关系表 编译模式 21 三种编译模式分别对应于三种缺省存储类型 存储类别 数据类型 存储器类型 变量名 C51编译器可根据当前采取的编译模式自动认定默认的存储类型约定 若无特殊声明 一般均为 SMALL编译模式 22 变量名可以由字母 数字和下划线三种字符组成 且第一个字符必须为字母或下划线 变量名长度随编译系统而定 变量名具有字母大小写的敏感性 如SUM和sum代表不同的变量 存储类别 数据类型 存储器类型 变量名 变量名不得使用标准C语言和C51语言的关键字 23 unsignedchardatasystem status 0 定义system status为无符号字符型自动变量 该变量位于data区中且初值为0 变量定义举例 变量名为system status 位于片内RAM区 无符号字符型 自动型 初值为零 24 unsignedcharbdatastatus byte unsignedintcodeunit id 2 0 x1234 0 x89ab staticcharm n 定义status byte为无符号字符型自动变量 该变量位于bdata区 定义unit id 2 为无符号整型自动变量 该变量位于code区中 是长度为2的数组 且初值为0 x1234和0 x89ab 定义m和n为2个位于data区中的有符号字符型静态变量 25 2 C51的指针 定义了一个指向由 数据类型 说明的变量的指针变量 被指向变量和指针变量位于C编译器默认的内存区域中 标准C语言指针的一般定义形式为 数据类型 指针变量名 例如 inta A int p1 表示 p1是一个指向int型变量的指针变量p1的值是int型变量a的地址a和p1两个变量都位于C编译器默认的内存区域中 26 在C51里定义指针 需要额外说明两个问题 1 指针变量自身位于哪个存储区域 2 被指向变量位于哪个存储区中 C51指针的一般定义形式 数据类型 存储类型1 存储类型2 指针变量名 数据类型 被指向变量的数据类型 不能缺省存储类型1 被指向变量所在的存储区类型 缺省时根据该变量的定义语句确定存储类型2 指针变量所在的存储区类型 缺省时根据C51编译模式的默认值确定指针变量名 按C51变量名的规则选取 27 例1charxdataa A char ptr 举例说明C51指针定义的用法 SMALL编译模式下 解 ptr是一个指向char型变量的指针变量 它本身位于SMALL编译模式默认的data存储区里 它的值是位于xdata存储区里的char型变量a的地址 存储类型1 缺省时 靠被指向变量的定义确定存储类型 数据类型 存储类型1 存储类型2 指针变量名 28 例2charxdataa A char ptr 解 Ptr先指向位于xdata存储区的char型变量a 后指向位于idata存储区的char型变量b 存储类型1 缺省时 ptr指针具有一定随意性 数据类型 存储类型1 存储类型2 指针变量名 29 例3charxdataa A charxdata ptr 解 a是位于xdata存储区里的char型变量 ptr是固定指向xdata存储区中char型变量的指针变量 存储类型1 存在时 ptr指针具有固定指向性 数据类型 存储类型1 存储类型2 指针变量名 30 例4charxdataa A charxdata idataptr 解 ptr是固定指向xdata存储区的char型变量的指针变量 它自身存放在idata存储区中 存储类型2 存在时 ptr指针具有明确的存储区域 数据类型 存储类型1 存储类型2 指针变量名 31 四 C51的运算符及表达式 1算术运算符和算术表达式 1 基本算术运算符 加法运算符 或正值符号 减法运算符 或负值符号 乘法运算符 除法运算符 模 求余 运算符 例11 3 2 结果是11除以3所得余数为2 在上述运算符中 加 减和乘法符合一般的算术运算规则 除法运算时 如果是两个整数相除 其结果为整数 如果是两个浮点数相除 其结果为浮点数 而对于取余运算 则要求两个运算对象均为整型数据 32 C语言规定了算术运算符的优先级和结合性 优先级 指当运算对象两侧都有运算符时 执行运算的先后次序 按运算符优先级别的高低顺序执行运算 结合性 指当一个运算对象两侧的运算符优先级别相同时的运算顺序 算术运算符中取负运算的优先级最高 其次是乘法 除法和取余 加法和减法的优先级最低 也可以根据需要 在算术表达式采用括号来改变优先级的顺序 如 a b c 该表达式中 除号优先级高于加号 故先运算b c所得结果 之后再与a相加 a b c d e 该表达式中 括号优先级最高 其次是 最后是减号 故先运算 a b 和 c d 然后再将二者结果相乘 最后与e相减 33 2 自增减运算符自增减运算符的作用是使变量值自动加1或减1 自增运算符 自减运算符 和 运算符只能用于变量 不能用于常量和表达式 如 a 1 是错误的 如 i i在使用i之前 先使i值加 减 1 i i 在使用i之后 再使i值加 减 1 粗略的看 i和i 的作用都相当于i i 1 但 i和i 的不同之处在于 i先执行i i 1 再使用i的值 而i 则是先使用i的值 再执行i i 1 如 若i值原来为5 则j i j的值为6 i的值也为6 j i j的值为5 i的值为6 34 3 类型转换运算符两侧的数据类型不同时 要转换成同种类型 转换的方法有两种 一是自动转换 是编译系统在编译时自动进行的类型转换 顺序是 bit char int long float signed unsigned 二是强制类型转换 是通过类型转换运算来实现的 其一般形式 类型说明符 表达式 功能 把表达式的运算结果强制转换成类型说明符所表示的类型 如 double a将a强制转换成double类型 int x y 将x y值强制转换成int类型 float 5 3 将模运算5 3的值强制转换成float类型 35 2关系运算符 关系表达式及优先级 1 C51提供六种关系运算符 小于 小于等于 大于 大于等于 测试等于 测试不等于 2 关系运算符的优先级1 的优先级相同 两种 相同 前4种优先级高于后两种 2 关系运算符的优先级低于算术运算符 3 关系运算符的优先级高于赋值运算符 如 c a b等效于c a b a b c等效于 a b ca b c等效于a b c 3 关系运算符的结合性为左结合如 a 4 b 3 c 1 则f a b c 则a b的值为1 1 c的值为0 故f 0 4 关系表达式用关系运算符和将两个表达式 可以是算术表达式 关系表达式 逻辑表达式 字符表达式 连接起来的式子 5 关系表达式的结果真和假 C51中用0表示假 1表示真 36 3逻辑运算符和逻辑表达式及优先级 1 C51提供3种逻辑运算符 逻辑 非 NOT 逻辑 与 AND 逻辑 或 OR 和 是双目运算符 要求有两个运算对象 而 是单目运算符 只要求有一个运算对象 2 逻辑运算符的优先级在逻辑运算中 逻辑非的优先级最高 且高于算术运算符 逻辑或的优先级最低 低于关系运算符 但高于赋值运算符 3 逻辑表达式用逻辑运算符将关系表达式或逻辑量连接起来的式子称为逻辑表达式 其值应为逻辑量真和假 逻辑表达式和关系表达式的值相同 以0代表假 1代表真 4 逻辑运算符的结合性为从左到右 例 如a 4 b 5则 a为假 因为a 4 非0 为真 所以 a为假 0 a b为真 因为a b为真 所以两者相或为真 a b为真 a b为假 0 优先级高于 先执行 a为假 0 0 b 0 结果为假 37 4C51位操作及其表达式C51提供6种位运算符 位与 位或 位异或 位取反 右移 除按位取反运算符 以外 以上位操作运算符都是双目运算符 及要求运算符两侧各有一个运算对象 1 按位与 运算符 运算规则 参与运算的两个运算对象 若两者相应的位都为1 则该位结果为1 否则为0 即 0 0 0 0 1 0 1 0 0 1 1 0如 a 45h 01000101b b 0deh 11011110b 则表达式c a b 44h按位与的主要用途 1 清零 用0去和需要清零的位按位与运算 2 取指定位 38 2 按位或 运算符 运算规则 参与运算的两个运算对象 若两者相应的位中有一位为1 则该位结果为1 否则为0 即 0 0 0 0 1 1 1 0 1 1 1 1如 a 30h 00110000b b 0fh 00001111b 则表达式c a b 3fh按位或的主要用途是将一个数的某些位置1 则需要将这些位和1按位或 其余的位和0进行按位或运算则不变 3 异或 运算符 运算规则 参与运算的两个运算对象 若两者相应的位相同 则结果为0 若两则相应的位相异 结果为1 即 0 0 0 0 1 1 1 0 1 1 1 0如 a 0a5h b 3dh 则表达式c a b 98h按位异或的主要用途 1 使特定位翻转 0变1 1变0 需要翻转的位和1按位异或运算 不需要翻转的位和0按位异或运算 原数和自身按位异或后得0 2 不用临时变量而交换两数的值 4 位取反 运算符 是一个单目运算符 用来对一个二进制数按位取反 即0变1 1变0 5 位左移和位右移运算符 位左移 位右移运算符 用来将一个二进制位的全部左移或右移若干位 移位后 空白位补0 而溢出的位舍弃 如 a 15h 则a a 2 05h 39 6 赋值和复合赋值运算符符号 称为赋值运算符 其作用是将一个数据的值赋予一个变量 赋值表达式的值就是被赋值变量的值 在赋值运算符的前面加上其他运算符就可以构成复合赋值运算符 在C51中共有10种复合运算符 这10种赋值运算符均为双目运算符 即 采用这种复合赋值运算的目的 是为了简化程序 提高C程序编译效率 如 a b相当于a a ba b相当于a a ba b相当于a a ba 2相当于a a 2a b相当于a a b 等等 7 其他运算符 共有10个 数组的下标 括号 结构 联合变量指针成员 取内容 三目运算符 逗号运算符 Sizeof sizeof运算符用于在程序中测试某一数据类型占用多少字节 40 五 C51的程序结构 C51语言程序是由函数组成的 函数是C51语言的基本模块 用C51语言设计程序就是编写函数 从来源看 函数可分为用户自定义函数和标准库函数两大类 在一个C51语言程序中有且只能有一个名为main的主函数 C51语言程序的执行部分是由语句组成的 程序的各种主要功能都是由语句实现的 C语言的语句可分为流程控制语句 表达式语句 复合语句 空语句 C51语言中新增了两种函数类型 中断函数和重入函数 41 1 语句与流程控制 基本语句 赋值 函数调用 复合语句及空语句等分支语句 if else switch语句等循环语句 for while do while语句等辅助控制语句 break continue语句 42 2 函数 中断函数重入函数标准库函数 43 return type funcname args small compact large reentrant interruptn usingn 局部变量定义可执行语句 C51语言中函数定义的一般格式 其中 大括号以外的部分称为函数头 大括号以内的部分称为函数体 如果函数体内无语句 则称之为空函数 空函数不执行任何操作 定义它的目的只是为了以后程序功能的扩充 44 从函数的定义格式可以看出 C51语言在4个方面对标准C语言的函数进行了扩展 指定函数的存储模式 指定函数是可再入的 指定函数是一个中断函数 指定函数所用的工作寄存器组 用C51语言设计程序 就是编写函数 在构成C51语言设计程序的若干个函数中 有且仅有一个是主函数main 因为C51语言程序的执行都是从main 函数开始的 也是在main 函数中结束整个程序运行的 其他函数只有在执行main 函数的过程中被调用才能被执行 45 同变量一样 函数也必须先定义后使用 所有函数在定义时都是相互独立的 一个函数中不能再定义其他函数 但可以相互调用 函数调用的一般规则是 主函数可以调用其他普通函数 普通函数之间可以相互调用 普通函数不能调用主函数 从用户使用的角度看 函数可以分成两大类 标准库函数和用户自定义函数 下面重点介绍C51语言中新增的中断函数 重入函数和常用的标准库函数 46 51系列单片机通常有5个中断源 为了方便使用 C51语言对它们进行了编号 见下表 51系列单片机的中断源及其编号 中断函数 47 当CPU正在执行一个特定任务时 可能有更紧急的事情需要CPU处理 这就涉及中断优先级 高优先级中断可以中断正在处理的低优先级中断程序 因此最好给每种不同优先级程序分配不同的工作寄存器组 以达到压栈保护的目的 中断函数的定义格式 函数类型函数名 interrupt中断编号using工作寄存器组编号 可执行语句 48 例如 下列程序片段为定时器 计数器0的中断服务程序 指定使用第2组工作寄存器 unsignedintCNT1 unsignedcharCNT2 voidTimer interrupt1using2 if CNT1 1000 CNT1计数到1000 CNT2 CNT2开始计数CNT1 0 CNT1清零 49 在编写中断函数时 应特别注意以下几点 1 中断函数为无参函数 即不能在中断函数中定义任何变量 否则将导致编译错误 2 中断函数没有返回值 即应将中断函数定义为void类型 3 中断函数不能直接被调用 否则将导致编译错误 4 中断函数使用浮点运算时要保存浮点寄存器的状态 5 如果在中断函数中调用了其他函数 则被调用函数所使用的寄存器组必须与中断函数相同 6 由于中断的产生不可预测 中断函数对其他函数的调用可能形成递归调用 必要时可将被中断函数调用的其他函数定义成再入函数 50 重入函数 在主函数和中断函数中都可调用的函数容易产生问题 51系列单片机一般使用寄存器传递函数参数 局部变量一般存放在片内RAM中 由于片内RAM的容量很小 只有128B 函数再入时会破坏或覆盖上次调用的数据 为此 C51语言提供了关键字reentrant 用于将相应的函数指定为可重入函数 所谓重入函数 是指可以在函数体内间接调用其自身的函数 51 重入函数可以被递归调用和多重调用 而不用担心变量被覆盖 因为每次函数调用中的局部变量都会被单独保存起来 重入函数的定义格式 函数类型函数名 形参列表 reentrant 局部变量说明可执行语句 52 标准库函数 根据51系列单片机本身的特点 C51语言编译系统在C语言的基础上又扩展了以下几种库函数 1 C51S LIB Small模式 无浮点运算 2 C51FPS LIB Small模式 有浮点运算 3 C51C LIB Compact模式 无浮点运算 4 C51FPC LIB Compact模式 有浮点运算 5 C51L LIB Large模式 无浮点运算 6 C51FPL LIB Large模式 有浮点运算 所谓标准库函数 是指由编译系统提供的 用户可以直接调用的函数 在程序设计中 多使用库函数使程序代码简单 结构清晰 易于调试和维护 53 每个库函数都在相应的头文件中给出了函数原型声明 在使用库函数时 必须在源程序的开头处用 include命令将有关的头文件包含进来 例如 include include voidmain 值得注意的是 C51语言中的某些库函数的参数和调用格式与标准C语言有所不同 如isdigit 函数的返回值类型是bit而不是int 54 在C51语言中 调用标准库函数的方式有以下两种 1 作为表达式的一部分 例如 求y x 3可以通过调用abs 函数来实现 y abs x 3 2 作为独立的语句完成某种操作 例如 printf n 可以在标准输出设备上输出一行5个连续的 号 KeilC51提供了相当丰富的标准库函数 并把它们分门别类地归属到不同的头文件中 标准库函数的原型 功能描述 返回值 重入属性以及应用举例在KeilC51集成开发环境提供的帮助文档中均可以查到 55 以数学类库函数abs 为例 查阅标准库函数的方法 1 在KeilC51集成开发环境下 单击工程管理器中的Books标签 即可看到KeilC51提供的帮助文档 如图3 15所示 KeilC51的帮助文档 56 2 在下图所示的界面中 双击C51库函数 C51LibraryFunctions 选项 打开C51库函数帮助窗口 如图所示 KeilC51的库函数 57 3 在图的左侧窗口找到abs并单击 则在图的右侧窗口中可以看到有关库函数abs 的介绍内容 包括该函数所属的头文件 函数原型 功能描述 再入属性以及应用举例等 如图所示 库函数abs 的帮助文档 58 1 Keil的编译环境 Vision3 Keil是德国KeilSoftware公司的51单片机开发软件包 包括C编译器 汇编编译器 连接器 库管理及仿真调试器 通过一个windows下的集成开发环境uVisoin3组合起来 六 开发环境 59 Vision3的软件界面包括四大组成部分 即菜单工具栏 工程管理窗口 文件窗口和输出窗口 60 Vision3中共有11个下拉菜单 工具栏的位置和数量可以通过设置选定和移动 61 工程管理窗口用于管理工程文件目录 它由五个子窗口组成 可以通过子窗口下方的标签进行切换 它们分别是 文件窗口 寄存器窗口 帮助窗口 函数窗口 模版窗口 工程管理窗口 62 输出窗口 输出窗口用于编译过程中的信息交互作用 由三个子窗口组成 可以通过子窗口下方的标签进行切换 它们分别是 编译窗口 命令窗口 搜寻窗口 63 信息窗口 观察窗口 Watch CallStackWindows 输出窗口 OutputWindows 存储器窗口 MemoryWindow 反汇编窗口 DissamblyWindow 串行窗口 SerialWindow 64 输入源程序 建立工程 对工程进行详细设置 将源程序变为目标代码 运行调试 2 Vision3的基本使用方法 举例 LED闪烁控制功能 65 1 建立工程文件 点击 Project NewProject 菜单 在编缉框中输入一个名字 设为exam1 无需扩展名 66 选择目标CPU Intel系列的80C51BH 67 2 源文件的建立点击新建文件按钮打开一个新的文本编缉窗口 68 输入程序源代码 以 c保存该文件 69 3 添加源程序 右击 SourceGroup1 点击 AddfiletoGroup SourceGroup1 添加生成的 c文件 70 4 工程设置 右击Project窗口的Target1 选择 Project Optionfortarget target1 工程设置对话框 71 设置对话框中的OutPut页面 勾选 CreatHexfile 72 设置对话框中的Debug页面 选中Use和下拉框 PROTEUS 73 5 编译 连接产生目标代码 hex文件 点击F7或工具按钮启动编译 连接功能 完成后将在命令窗口中显示编译结果 74 若有语法错误 双击出错提示可指出错误所在行号 75 6 一般调试过程 启动调试过程 Ctrl F5 Debug Start StopDebugSession 开始调试 详见下页 结束调试 Debug StopRunning 76 调试工具栏 复位 运行到光标行 执行完当前子程序 过程单步 单步 停止 运行 调试菜单栏 快捷键 指向下条运行行 77 基本调试手段 1 运行到光标行 从当前行运行到光标所在行 Ctrl F10 2 严格单步运行 遇到函数时亦单步进行 F11 3 跨函数单步运行 遇到函数时将其视作一行语句 F10 4 断点运行 全速运行到断点行停止 双击设置 解除断点 5 监视输出端口 打开IO窗口 Peripherals I O Ports 6 监视运行变量 打开Watch 1窗口 点击 78
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 大学资料


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

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


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