单片机.pptx_第1页
单片机.pptx_第2页
单片机.pptx_第3页
单片机.pptx_第4页
单片机.pptx_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

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

文档简介

第9章C51程序设计语言及程序设计 9 1C51数据类型与运算 9 1 1C语言的特点及程序结构 1 C语言的特点 1 语言简洁 紧凑 使用方便 灵活 2 运算符丰富 3 数据结构丰富 具有现代化语言的各种数据结构 4 可进行结构化程序设计 5 可以直接对计算机硬件进行操作 6 生成的目标代码质量高 程序执行效率高 7 可移植性好 2 C语言的程序结构 C语言程序采用函数结构 每个C语言程序由一个或多个函数组成 在这些函数中至少应包含一个主函数main 也可以包含一个main 函数和若干个其它的功能函数 不管main 函数放于何处 程序总是从main 函数开始执行 执行到main 函数结束则结束 在main 函数中调用其它函数 其它函数也可以相互调用 但main 函数只能调用其它的功能函数 而不能被其它的函数所调用 功能函数可以是C语言编译器提供的库函数 也可以是由用户定义的自定义函数 在编制C程序时 程序的开始部分一般是预处理命令 函数说明和变量定义等 C语言程序结构一般如下 预处理命令include函数说明longfun1 floatfun2 intx y floatz intsum intx inti t 0 for i 1 i x i t i return t main ints s sum 100 printf d n s 例9 1 1 C语言程序在书写时格式十分自由 一条语句可以写成一行 也可以写成几行 还可以一行内写多条语句 但每条语句后面必须以分号 作为结束符 C语言程序对大小写字母比较敏感 在程序中 同一个字母的大小写系统是作不同的处理 在程序中可以用 或 对C程序中的任何部分作注释 以增加程序的可读性 C语言本身没有输入输出语句 输入和输出是通过输入输出函数scanf 和printf 来实现的 输入输出函数是通过标准库函数形式提供给用户 main floatmax float float floata b floatc scanf f f 例9 1 2 9 1 2C语言与MCS 51单片机 1 汇编语言编写与C语言编写MCS 51单片机程序的区别不须具体组织 分配存储器资源和处理端口数据 但对数据类型 变量的定义等必须要与单片机的存储结构相关联 否则编译器不能正确地映射定位 2 C语言编写单片机应用程序与标准的C语言程序也有相应的区别 C语言编写单片机应用程序时 需根据单片机存储结构及内部资源定义相应的数据类型和变量 包含数据类型 变量存储模式 输入输出处理 函数等方面 标准的C语言程序不需要考虑这些问题 单语法规则 程序结构及程序设计方法等两者相同 现在支持MCS 51系列单片机的C语言编译器有很多种 如AmericanAutomation Avocet BSO TASKING DUNFIELDSHAREWARE KEIL Franklin等 我们以KEIL Franklin编译器介绍MCS 51单片机C语言程序设计 9 1 3C51程序结构 C51的语法规定 程序结构及程序设计方法都与标准的C语言程序设计相同 但C51程序与标准的C程序在以下几个方面不一样 1 C51中定义的库函数和标准C语言定义的库函数不同 标准的C语言定义的库函数是按通用微型计算机来定义的 而C51中的库函数是按MCS 51单片机相应情况来定义的 2 C51中的数据类型与标准C的数据类型也有一定的区别 在C51中还增加了几种针对MCS 51单片机特有的数据类型 3 C51变量的存储模式与标准C中变量的存储模式不一样 C51中变量的存储模式是与MCS 51单片机的存储器紧密相关 4 C51与标准C的输入输出处理不一样 C51中的输入输出是通过MCS 51串行口来完成的 输入输出指令执行前必须要对串行口进行初始化 5 C51与标准C在函数使用方面也有一定的区别 C51中有专门的中断函数 9 1 3C51的数据类型 C51的数据类型分为基本数据类型和构造数据类型 1 字符型char长度均为一个字节signedchar 128 127unsignedchar 0 255 默认为signedchar 2 int整型长度均为两个字节singedint 32768 32767 unsignedint0 65535 3 long长整型长度均为四个字节singedlong 2147483648 2147483647unsignedlong 0 4294967295 默认为signedlong 4 float浮点型float型数据的长度为四个字节 格式符合IEEE 754标准的单精度浮点型数据 包含指数和尾数两部分 最高位为符号位 1 表示负数 0 表示正数 其次的8位为指数部分 最后的23位为尾数的有效数位 5 指针型指针型本身就是一个变量 在这个变量中存放的指向另一个数据的地址 这个指针变量要占用一定的内存单元 对不同的处理器其长度不一样 在C51中它的长度一般为1 3个字节 6 特殊功能寄存器型Sfr sfr16两种类型 在C51中 允许用户对这些特殊功能寄存器进行访问 访问时须通过sfr或sfr16类型说明符进行定义 定义时须指明它们所对应的片内RAM单元的地址 格式如下 sfr或sfr16特殊功能寄存器名 地址 sfr用于定义单字节的特殊功能寄存器 sfr16用于定义双字节特殊功能寄存器 特殊功能寄存器名一般用大写字母表示 地址一般用直接地址形式 例9 1 3 特殊功能寄存器的定义 sfrPSW 0 xd0 sfrSCON 0 x98 sfrTMOD 0 x89 sfrP1 0 x90 sfr16DPTR 0 x82 reg51 hsfrP0 0 x80 sfrP1 0 x90 sfrP2 0 xA0 sfrP3 0 xB0 sfrPSW 0 xD0 sfrACC 0 xE0 sfrB 0 xF0 sfrSP 0 x81 sfrDPL 0 x82 sfrDPH 0 x83 sfrPCON 0 x87 sfrTCON 0 x88 sfrTMOD 0 x89 sfrTL0 0 x8A sfrTL1 0 x8B sfrTH0 0 x8C sfrTH1 0 x8D sfrIE 0 xA8 sfrIP 0 xB8sfrSCON 0 x98 在C51中 允许用户通过位类型符定义位变量 位类型符有两个 bit sbit 1 bit位类型符用于定义一般的可位处理位变量 它的格式如下 bit位变量名 例 bita1 a2 7 位类型 sbit位类型符用于定义在可位寻址字节或特殊功能寄存器中的位 定义时须指明其位地址 可以是位直接地址 可以是可位寻址变量带位号 也可以是特殊功能寄存器名带位号 格式如下 sbit位变量名 位地址 如位地址为位直接地址 其取值范围为0 x00 0 xff 如位地址是可位寻址变量带位号或特殊功能寄存器名带位号 则在它前面须对可位寻址变量或特殊功能寄存器进行定义 字节地址与位号之间 特殊功能寄存器与位号之间一般用 作间隔 例9 1 4 sbit型变量的定义 sbitOV 0 xd2 sbitCY oxd7 sfrP1 0 x90 sbitP1 0 P1 0 sbitP1 1 P1 1 sbitP1 2 P1 2 sbitP1 3 P1 3 sbitP1 4 P1 4 sbitP1 5 P1 5 sbitP1 6 P1 6 sbitP1 7 P1 7 在C51中 为了用户处理方便 C51编译器把MCS 51单片机的常用的特殊功能寄存器和特殊位进行了定义 放在一个 reg51 h 或 reg52 h 的头文件中 当用户要使用时 只须要在使用之前用一条预处理命令 include把这个头文件包含到程序中 然后就可使用殊功能寄存器名和特殊位名称 在C51语言程序中 有可能会出现在运算中数据类型不一致的情况 C51允许任何标准数据类型的隐式转换 隐式转换的优先级顺序如下 bit char int long float doublesigned unsigned也就是说 当char型与int型进行运算时 先自动对char型扩展为int型 然后与int型进行运算 运算结果为int型 C51除了支持隐式类型转换外 还可以通过强制类型转换符 对数据类型进行人为的强制转换 C5l编译器除了能支持以上这些基本数据类型之外 还能支持一些复杂的组合型数据类型 如数组类型 指针类型 结构类型 联合类型等这些复杂的数据类型 在本书的后面将相继介绍 includesbitL1 P1 0 voiddelay02s void 延时0 2秒子程序 unsignedchari j k for i 20 i 0 i for j 20 j 0 j for k 248 k 0 k 248 2 20 20 10 6 0 2秒 voidmain void while 1 L1 0 delay02s L1 1 delay02s 例9 1 5 9 1 4C51的常量与变量 1 常量 常量是指在程序执行过程中其值不能改变的量 在C51中支持整型常量 浮点型常量 字符型常量和字符串型常量 1 整型常量整型常量也就是整型常数 根据其值范围在计算机中分配不同的字节数来存放 在C51中它可以表示成以下几种形式 十进制整数 如234 56 0等 十六进制整数 以0 x开头表示 如0 x12表示十六进制数12H 长整数 在C51中当一个整数的值达到长整型的范围 则该数按长整型存放 在存储器中占四个字节 另外 如一个整数后面加一个字母L 这个数在存储器中也按长整型存放 如123L在存储器中占四个字节 2 浮点型常量浮点型常量也就是实型常数 有十进制表示形式和指数表示形式 十进制表示形式又称定点表示形式 由数字和小数点组成 如0 123 34 645等都是十进制数表示形式的浮点型常量 指数表示形式为 数字 数字 e 数字例如 123 456e 3 3 123e2等都是指数形式的浮点型常量 3 字符型常量字符型常量是用单引号引起的字符 如 a 1 F 等 可以是可显示的ASCII字符 也可以是不可显示的控制字符 对不可显示的控制字符须在前面加上反斜杠 组成转义字符 利用它可以完成一些特殊功能和输出时的格式控制 常用的转义字符如下表所示 4 字符串常量字符串型常量由双引号 括起的字符组成 如 D 1234 ABCD 等 注意字符串常量与字符常量是不一样 一个字符常量在计算机内只用一个字节存放 而一个字符串常量在内存中存放时不仅双引号内的字符一个占一个字节 而且系统会自动的在后面加一个转义字符 o 作为字符串结束符 因此不要将字符常量和字符串常量混淆 如字符常量 A 和字符串常量 A 是不一样的 符号常量是用标示符来代表的一个常量 定义符号常量的一般形式为 define标识符常量如 definePRICE6 5 例9 1 6 符号常量的使用 definePI3 14main intr s r 10 s PI r r printf s d s while 1 5 符号常量 2 变量 变量是存储在内存中的一定的存储单元 其存储的数据在程序运行过程中可以改变 每个变量有一个名字 称为标识符 C规定 标识符只能是字母 A Z a z 数字 0 9 下划线 等组成的字符串 并且其第一个字符必须是字母或下划线 如 ab x 1 kk3 SUM2s a b x 1 变量定义的一般形式为 类型说明符变量名标识符 变量名标识符 如 inti doublex y unsignedcharp q 注意 1 允许在一个类型说明符后 定义多个相同类型的变量 各变量名之间用逗号间隔 类型说明符与变量名之间至少用一个空格间隔 2 最后一个变量名之后必须以 号结尾 3 变量定义必须放在变量使用之前 一般放在函数体的开头部分 在C51中 为了增加程序的可读性 允许用户为系统固有的数据类型说明符用typedef起别名 格式如下 typedefc51固有的数据类型说明符别名 定义别名后 就可以用别名代替数据类型说明符对变量进行定义 别名可以用大写 也可以用小写 为了区别一般用大写字母表示 例9 1 7 typedef的使用 typedefunsignedintWORD typedefunsignedcharBYTE BYTEa1 0 x12 WORDa2 0 x1234 存储器物理结构 哈佛结构 9 1 5C51的数据存储类型 先回顾一下MCS 51系列单片机的存储空间 内部数据存储器 a 外部数据存储器 b MCS 51单片机存储器空间分配 存储类型就是数据存放在哪个空间 定义变量时也可以省 存储器类型 省时C51编译器将按编译模式默认存储器类型 由存储模式决定 例9 1 8 chardatavarl 在片内RAM低128B定义用直接寻址方式访问的字符型变量var1 intidatavar2 在片内RAM128B定义用间接寻址方式访问的整型变量var2 unsignedlongdatavar3 在片内RAM128B定义用直接寻址方式访问的无符号长整型变量var3 floatxdatavar4 在片外RAM64KB空间定义用间接寻址方式访问的外部实型变量var4 intcodevar5 在ROM空间定义整型变量var5 unsignedcharbdatavar6 在片内RAM位寻址区20H 2FH单元定义可字节处理和位处理的无符号字符型变量var6 例9 1 9 bitbdataa2 正确 bitpdataa3 错误 bitxdataa4 错误 unsignedcharbdataflag sbitflag0 flag 0 在C51中 为了用户处理方便 C51编译器把MCS 51单片机的常用的特殊功能寄存器和特殊位进行了定义 放在一个 reg51 h 或 reg52 h 的头文件中 当用户要使用时 只须要在使用之前用一条预处理命令 include把这个头文件包含到程序中 然后就可使用殊功能寄存器名和特殊位名称 9 1 6存储模式 C51编译器支持三种存储模式 SMALL模式 COMPACT模式和LARGE模式 不同的存储模式对变量默认的存储器类型不一样 2 COMPACT模式 COMPACT模式称为紧凑编译模式 在COMPACT模式下 编译时 函数参数和变量被默认在片外RAM的低256字节空间 存储器类型为pdata 3 LARGE模式 LARGE模式称为大编译模式 在LARGE模式下 编译时函数参数和变量被默认在片外RAM的64K字节空间 存储器类型为xdata 在程序中变量的存储模式的指定通过 pragma预处理命令来实现 函数的存储模式可通过在函数定义时后面带存储模式说明 如果没有指定 则系统都隐含为SMALL模式 1 SMALL模式 SMALL模式称为小编译模式 在SMALL模式下 编译时 函数参数和变量被默认在片内RAM中 存储器类型为data 例9 1 10 变量的存储模式 pragmasmall 变量的存储模式为SMALL chark1 intxdatam1 pragmacompact 变量的存储模式为COMPACT chark2 intxdatam2 程序编译时 k1变量存储器类型为data k2变量存储器类型为pdata 而m1和m2由于定义时带了存储器类型xdata 因而它们为xdata型 9 1 7绝对地址的访问 1 使用C51运行库中预定义宏C51编译器提供了一组宏定义来对51系列单片机的code data pdata和xdata空间进行绝对寻址 规定只能以无符号数方式访问 定义了8个宏定义 其函数原型如下 defineCBYTE unsignedcharvolatilecode 0 defineDBYTE unsignedcharvolatiledata 0 definePBYTE unsignedcharvolatilepdata 0 defineXBYTE unsignedcharvolatilexdata 0 defineCWORD unsignedintvolatilecode 0 defineDWORD unsignedintvolatiledata 0 definePWORD unsignedintvolatilepdata 0 defineXWORD unsignedintvolatilexdata 0 这些函数原型放在absacc h文件中 使用时须用预处理命令把该头文件包含到文件中 形式为 include 访问形式如下 宏名 地址 宏名为CBYTE DBYTE PBYTE XBYTE CWORD DWORD PWORD或XWORD 地址为存储单元的绝对地址 一般用十六进制形式表示 例如 XBYTE 0 x6000 例 definePORTAXBYTE 0 x8000 说明 定义PORTA为片外IO口 地址为8000H 对于片外通过地址译码扩展的IO口 MCS 51系列单片机则视为片外数据存储器的一个字节单元 可以用 define语句定义片外IO口 例9 1 11 绝对地址对存储单元的访问 include 将绝对地址头文件包含在文件中 include 将寄存器头文件包含在文件中 defineucharunsignedchar 定义符号uchar为数据类型符unsignedchar defineuintunsignedint 定义符号uint为数据类型符unsignedint voidmain void ucharvar1 uintvar2 var1 XBYTE 0 x0005 片外RAM的0005字节单元内容给var1 var2 XWORD 0 x0002 片外RAM的0002字单元内容给var2 while 1 在上面程序中 其中XBYTE 0 x0005 就是以绝对地址方式访问的片外RAM0005字节单元 XWORD 0 x0002 就是以绝对地址方式访问的片外RAM0002字单元 2 使用C51扩展关键字 at 使用 at 对指定的存储器空间的绝对地址进行访问 一般格式如下 存储器类型 数据类型说明符变量名 at 地址常数 例 定义片外IO口 xdataunsignedcharPORTA at 0 x8000 说明 定义PORTA为片外IO口 地址为8000H 例9 1 12 通过 at 实现绝对地址的访问 defineucharunsignedchar defineuintunsignedintvoidmain void dataucharx1 at 0 x40 xdatauintx2 at 0 x2000 x1 0 xff x2 0 x1234 while 1 9 1 8C51的运算符及表达式 1 赋值运算符 变量 表达式 例如 x 8 9 x y 5 2 算术运算符 加或取正值运算符 减或取负值运算符 乘运算符 除运算符 取余运算符例如 25 0 20 0结果为1 2525 20结果为1 x 5 3 结果x的值为2 3 关系运算符C51中有6种关系运算符 大于 大于等于 小于等于 等于 不等于 例如 5 3 结果为真 1 10 100 结果为假 0 注意 关系运算符等于 是由两个 组成 4 逻辑运算符C51有3种逻辑运算符 逻辑或 逻辑与 逻辑非 例如 若a 8 b 3 c 0 则 a为假 a b为真 b c为假 5 位运算符 C51中的位运算符有 按位与 按位或 按位异或 按位取反 右移例如 设a 0 x54 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 6 复合赋值运算符C51中支持的复合赋值运算符 加法赋值 减法赋值 乘法赋值 除法赋值 取模赋值 逻辑与赋值 逻辑或赋值 逻辑异或赋值 右移位赋值 2相当于x x 2 7 逗号运算符在C51语言中 逗号 逗号表达式的一般格式为 表达式1 表达式2 表达式n例如 x a 3 6 3 结果x的值为18 8 条件运算符条件运算符 是C51语言中唯一的一个三目运算符 条件表达式的一般格式为 逻辑表达式 表达式1 表达式2例如 条件表达式max a b a b的执行结果是将a和b中较大的数赋值给变量max 9 指针与地址运算符 指针运算符 取地址运算符例如 指针变量p中的地址为2000H 则 p所访问的是地址为2000H的存储单元 x p 实现把地址为2000H的存储单元的内容送给变量x 例如 设变量x的内容为12H 地址为2000H 则 x的值为2000H 如有一指针变量p 则通常用p x 实现将x变量的地址送给指针变量p 指针变量p指向变量x 以后可以通过 p访问变量x 9 1 11表达式语句及复合语句 1 表达式语句 在表达式的后边加一个分号 就构成了表达式语句 如 a b 9 x 8 y 7 k 表示空语句 空语句在程序设计中通常用于两种情况 a 在

温馨提示

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

最新文档

评论

0/150

提交评论