




已阅读5页,还剩69页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章 单片机C语言程序设计,2019/7/28,2,目 录,C语言与MCS-51单片机 C51的数据类型 C51的运算量 C51的运算符及表达式 表达式语句及复合语句 C51的输入/输出 C51程序基本结构与相关语句 函数 C51构造数据类型,2019/7/28,3,C语言的特点,语言简洁紧凑,使用方便灵活; 运算符丰富,数据结构丰富; 可进行结构化程序设计; 可直接对计算机硬件进行操作; 生成的目标代码质量高,程序执行效率高; 可移植性好。,2019/7/28,4,C语言的程序结构,预处理命令 include 函数说明 long fun1(); float fun2(); 变量定义 int x, y; float z; 功能函数1 fun1() 函数体 主函数 main() 主函数体 功能函数2 fun2() 函数体 ,2019/7/28,5,C语言、汇编语言与51系列单片机,C51与汇编语言的区别: 汇编语言要考虑具体存储地址; C语言仅需考虑变量的数据类型与存储类型; C51与标准C的区别: 标准C无需考虑变量的存储类型; C51的数据类型、存储模式、函数等与标准C有一定差异。,Keil C51,2019/7/28,6,C51程序结构,C51与标准C的程序结构基本相同,存在如下差异: C51的库函数与标准C不同; C51的数据类型与标准C有一定区别; C51变量的存储模式与标准C不同; C51的输入/输出处理与标准C不同; C51的函数使用与标准C有一定区别。,2019/7/28,7,目 录,C语言与MCS-51单片机 C51的数据类型 C51的运算量 C51的运算符及表达式 表达式语句及复合语句 C51的输入/输出 C51程序基本结构与相关语句 函数 C51构造数据类型,2019/7/28,8,C51的数据类型,char字符型 int整型 long长整型 float浮点型 *指针型 sfr、sfr16特殊功能寄存器型 bit、sbit位类型,2019/7/28,9,C51的基本数据类型,2019/7/28,10,sfr特殊功能寄存器型,用来访问单片机的特殊功能寄存器的数据类型。 sfr:访问字节型的SFR; 如:sfr P0 = 0x80; 如:sfr SBUF = 0x99; sfr16:访问连续两个字节的SFR; 如:sfr16 DPTR = 0x82;访问DPTR即访问SFR的82H和83H; 如:sfr16 T0 = 0x8A;即访问TL0和TH0。,2019/7/28,11,bit位类型,用来访问单片机的可寻址的位单元。 包括片内RAM和SFR中的位寻址区; bit:变量将存放于片内RAM的位寻址区(片内RAM20H2FH); bit flags; 位变量的存储器类型严格来说只能是bdata; sbit:变量位于固定地址的可位寻址单元; sbit CY = PSW7; int bdata ibase; sbit mybit15 = ibase15;,2019/7/28,12,目 录,C语言与MCS-51单片机 C51的数据类型 C51的运算量 C51的运算符及表达式 表达式语句及复合语句 C51的输入/输出 C51程序基本结构与相关语句 函数 C51构造数据类型,2019/7/28,13,常量,整型常量 十进制整数:234,56,0; 十六进制整数:0x12,0xCC; 浮点型常量:0.123,34.0; 字符型常量:a,0,0; 字符串型常量:“ABC“ = A, B, C, 0,2019/7/28,14,变量,变量的定义格式: 存储种类 数据类型说明符 存储器类型 变量名1 = 初值, 变量名2 = 初值 static int xdata W1 = 0x1234, W2; 数据类型说明符 可由typedef或#define重命名固有数据类型;,typedef unsigned int WORD; typedef unsigned char BYTE; BYTE a1=0x12; WORD a2=0x1234; #define BYTE unsigned char,2019/7/28,15,变量,变量名 由字母、数字、下划线组成;第一个字母不能为数字;不能使用关键词。 存储种类,2019/7/28,16,变量,存储器类型,特殊功能寄存器变量 在C51中,允许用户对这些特殊功能寄存器进行访问,访问时须通过sfr或sfr16类型说明符进行定义,定义时须指明它们所对应的片内RAM单元的地址。格式如下: sfr或sfr16 特殊功能寄存器名=地址 例如: sfr TMOD=0x89; sfr P1=0x90; sfr16 DPTR=0x82; sfr16 T1=0X8A,位变量 在C51中,允许用户通过位类型符定义位变量。位类型符有两个:bit和sbit。可以定义两种位变量。 bit位类型符用于定义一般的可位处理位变量。它的格式如下: bit 存储器类型 位变量名; sbit位类型符用于定义在可位寻址字节或特殊功能寄存器中的位,定义时须指明其位地址,可以是位直接地址,可以是可位寻址变量带位号,也可以是特殊功能寄存器名带位号。格式如下: sbit 位变量名=位地址;,【例】 bit型变量的定义: bit data a1; /*正确*/ bit bdata a2; /*正确*/ bit pdata a3; /*错误*/ bit xdata a4; /*错误*/ sbit型变量的定义: sbit OV=0xd2; sbit CY=oxd7; unsigned char bdata flag; sbit flag0=flag0; sfr P1=0x90; sbit P1_0=P10; sbit P1_1=P11; sbit P1_2=P12;,2019/7/28,20,存储模式(编译模式),SMALL模式 变量默认存储在片内RAM中,存储类型data; COMPACT模式 变量默认存储在片外RAM低256B中,存储类型pdata; LARGE模式 变量默认存储在片外RAM 64KB中,存储类型xdata; 存储模式的指定:#pragma 如:#pragma large,2019/7/28,21,常用的存储类型,一般默认存储模式为SMALL模式; 未指定存储器类型的变量,默认为data类型; 常用的存储器类型有:bdata,xdata,code,char code text = “ENTER PARAMETER:“; unsigned long xdata array100; unsigned char bdata flag; sbit flag0 = flag0; sbit flag1 = flag1; sbit flag7 = flag7;,2019/7/28,22,C51中的头文件,C51常用头文件: reg51.h,reg52.h,math.h,ctype.h,stdio.h,stdlib.h,absacc.h 头文件包含指令:#include #include “头文件.h” / 用户自定义头文件 #include / 系统头文件 一个#include命令只能包含一个文件; #include要放在文件头部。,2019/7/28,23,绝对地址访问,用库函数中的预定义宏 包含头文件 #include ,访问ROM中绝对地址为0x0002的字单元, 即0x0002与0x0003两个字节单元,2019/7/28,24,绝对地址访问,通过指针访问,unsigned char data var1; unsigned char pdata *dp1; unsigned int xdata *dp2; unsigned char data *dp3; dp1 = 0x30; dp2 = 0x1000; *dp1 = 0xff; *dp2 = 0x1234; dp3 = ,片外RAM(0x30)0xff,片外RAM(0x1000)0x1234,片内RAM var10x20,2019/7/28,25,绝对地址访问,使用C51扩展关键字 _at_ 格式:存储器类型 数据类型说明符 变量名 _at_ 地址常数 _at_ 后面的绝对地址必须在可用的实际存储空间内; 用 _at_ 定义的变量必须为全局变量; bit 类型的函数和变量不能用_at_指定到绝对地址。,data unsigned char x1 _at_ 0x40; xdata unsigned int x2 _at_ 0x2000; x1 = 0xff; x2 = 0x1234;,2019/7/28,26,目 录,C语言与MCS-51单片机 C51的数据类型 C51的运算量 C51的运算符及表达式 表达式语句及复合语句 C51的输入/输出 C51程序基本结构与相关语句 函数 C51构造数据类型,2019/7/28,27,C51的运算符,与标准C的运算符相同。 赋值运算符:= 算术运算符:+ - * / % 关系运算符: = 复合赋值运算符:+= -= &= = =等 逗号运算符:, 条件运算符:? 指针与地址运算符:* &,2019/7/28,28,C51的运算符,C51运算符的几点注意事项: 允许一个语句同时给多个变量赋值:x = y = 0; 参加取余运算的两个数必须为整数; 左移和右移均为算术移位,空位补0; 逗号表达式的值为最右边的表达式值; 条件表达式:逻辑表达式? 表达式 : 1表达式2; x = *p; / p的值为一个地址,将该地址内容赋给x; m = / n的值为一个数据,将该数据存放的地址赋给m;,2019/7/28,29,目 录,C语言与MCS-51单片机 C51的数据类型 C51的运算量 C51的运算符及表达式 表达式语句及复合语句 C51的输入/输出 C51程序基本结构与相关语句 函数 C51构造数据类型,2019/7/28,30,表达式语句,表达式后面加“;”,构成表达式语句。 在用while语句构成的循环语句后面加一个分号,形成一个不执行其它操作的空循环体。这种结构通常用于对某位进行判断,当不满足条件则等待,满足条件则执行。,a = +b*9; x = 8; y = 7; +k;,#include char getchar() char c; while(!RI); c=SBUF; RI=0; return(c); ,while(1);,SJMP $,2019/7/28,31,复合语句,用一个大括号“”将若干条语句括在一起,形成复合语句。 各条语句按序依次执行; 复合语句中定义的局部变量,仅在该语句中有效,即在该“ ”中有效;, 局部变量定义; 语句1; 语句2; ,2019/7/28,32,目 录,C语言与MCS-51单片机 C51的数据类型 C51的运算量 C51的运算符及表达式 表达式语句及复合语句 C51的输入/输出 C51程序基本结构与相关语句 函数 C51构造数据类型,2019/7/28,33,C51的输入/输出,利用C51的标准库函数: 函数:格式输入/输出函数printf(),scanf(); PC机的按键单片机PC机显示器; 输入和输出通过串口进行 故程序中需对单片机串口进行初始化; PC机中的串口软件可以用系统自带的超级终端,设置波特率与单片机波特率保持一致; 硬件连线需接上串口线(模拟调试时可以不接串口线);,输入,输出,2019/7/28,34,格式输出函数printf(),控制串口输出数据; 格式:printf(格式控制, 输出参数表); 格式控制用双引号括起来,包括格式说明符、普通字符、转义字符; 格式说明符由“%“和格式字符组成;,2019/7/28,35,格式输入函数scanf(),通过串口实现数据输入; 格式:scanf(格式控制, 地址列表); 格式控制与printf()相同; 地址列表可以是指针变量、“&“+变量或字符串名,2019/7/28,36,目 录,C语言与MCS-51单片机 C51的数据类型 C51的运算量 C51的运算符及表达式 表达式语句及复合语句 C51的输入/输出 C51程序基本结构与相关语句 函数 C51构造数据类型,2019/7/28,37,C51的基本结构,顺序结构: 各语句按照位置先后顺序执行; 选择结构 if 语句; switch 语句; 循环结构 for 语句; while 语句; do-while语句; break 和 continue语句;,2019/7/28,38,if语句,if语句的三种格式: if (表达式) 语句; if (表达式) 语句1; else 语句2; if (表达式1) 语句1; else if (表达式2) 语句2; else if (表达式3) 语句3; else if (表达式n-1) 语句n-1; else 语句n,2019/7/28,39,switch/case语句,if - else if - else语句可用switch语句来实现多分支转移; switch后表达式为整型或字符型表达式; 每个case常量表达式的值必须不同; 多个case可以公用一组执行语句;,switch (表达式) case 常量表达式1:语句1;break; case 常量表达式2:语句2;break; case 常量表达式n:语句n;break; default:语句n+1; ,2019/7/28,40,while、dowhile语句,while语句 while(表达式) 语句; /*循环体*/,dowhile语句 do 语句; /*循环体*/ while(表达式);,while (i = 100) s = s + i; i+; ,do s = s + i; i+; while (i = 100);,2019/7/28,41,for语句,for(表达式1; 表达式2; 表达式3) 语句; /*循环体*/,for (i=1; i=100; i+) s = s + i;,2019/7/28,42,循环的嵌套,循环嵌套:一个循环体内包含另一个完整的循环; C51允许三种循环结构相互嵌套;,void delay(unsigned int x) unsigned char j; while(x-) for (j=0; j125; j+); ,2019/7/28,43,break、continue和return语句,break语句: 跳出所在循环体,结束所在循环; 跳出switch语句; 仅能用于循环语句和switch语句; continue语句: 结束本次循环,执行下一次循环的判定,不是结束所在的整个循环; return语句: return; return(表达式); 终止本函数,将表达式的值作为函数的返回值;,2019/7/28,44,目 录,C语言与MCS-51单片机 C51的数据类型 C51的运算量 C51的运算符及表达式 表达式语句及复合语句 C51的输入/输出 C51程序基本结构与相关语句 函数 C51构造数据类型,2019/7/28,45,函数,C51程序由一个主函数和若干个子函数组成; 一个函数中只能有一个主函数; 主函数不能被调用; 主函数运行结束,程序结束; 主函数可以调用子函数; 子函数可以调用子函数;,2019/7/28,46,函数的定义,函数定义格式: 函数类型 函数名 (形式参数表) reentrant interrupt m using n 局部变量定义 函数体 函数类型:函数返回值的类型,为各种数据类型;若函数无返回值,则类型一般定义为void; 形式参数表:即函数的入口参数;没有入口参数,则保留空括号()即可;,2019/7/28,47,reentrant修饰符,定义该函数为可重入函数; 可重入函数:该函数可以直接或间接的调用本身; 注意事项: 函数内不允许位变量的操作; 有时须使用全局变量进行参数传递; 常用于实时系统或在中断和非中断必须共用一个函数的情况下使用。 麻烦!不建议使用!非用不可时再查阅资料!,2019/7/28,48,interrupt m修饰符,定义该函数为中断服务程序。 注意事项: 中断函数不能进行参数传递; 中断函数没有返回值; 不能直接调用中断函数; 中断函数调用的其他函数,必须与中断函数使用相同的寄存器组; 中断函数禁止使用extern,最好放在文件尾部;,非常重要!,2019/7/28,49,using n修饰符,指定本函数所使用的工作寄存器组; n0 3,对应工作寄存器0组3组; using 所做的操作: 在函数入口保存当前PSW; 设置指定寄存器组,即新的PSW; 在函数出口恢复原PSW。 注意事项: using n仅能用于无返回值的函数; using在中断函数或实时系统中最有用,因为不用保存8个寄存器,只需将PSW入栈。,2019/7/28,50,函数的调用和声明,无返回值函数形式:函数名(实参列表); 有返回值函数形式:变量 = 函数名(实参列表); 被调用的函数可作为调用函数的参数。 自定义函数的声明: extern 函数类型 函数名(形参列表); extern:声明的函数若不在本文件内部,则必须注明extern;,int max(int x, int y); int max(int x, int y) int z; z = (x = y ? x : y); return(z); ,2019/7/28,51,函数的嵌套,函数不能嵌套定义,但允许嵌套调用;,int max(int a, int b) return (a = b ? a : b); int add(int c, int d, int e, int f) return (max(c, d) + max(e, f); main() int final; final = add(7, 5, 2, 8); while(1); ,2019/7/28,52,目 录,C语言与MCS-51单片机 C51的数据类型 C51的运算量 C51的运算符及表达式 表达式语句及复合语句 C51的输入/输出 C51程序基本结构与相关语句 函数 C51构造数据类型,2019/7/28,53,数组,数组:有序数据的组合。 数组中的每一个数据都属于同一数据类型; 数组中的各元素由数组名和下标确定; 数组可分为一维数组、二维数组和多维数组; 数组在使用前必须先进行定义(变量在使用前可以不定义,但建议全部定义后使用!); 数组名表示该数组的第一个元素地址。,2019/7/28,54,一维数组,数据类型说明符 数组名常量表达式 = 初值1, 初值2, ; 数据类型说明符:指定数组中各元素的数据类型; 常量表达式:必须为整型常量,说明数组的长度,即数组中元素的个数; 初值部分:用于给数组各元素赋初值。 注意事项: 数组的第一个元素,下标为0; 引用数组时,只能对各个元素进行操作,不能一次操作整个数组。,2019/7/28,55,一维数组,int n = 5; int xn;,int x5;,int x5; x5 = 2, 4, 6, 8, 10;,int x5 = 2, 4, 6, 8, 10;,int x5; x5 = 10;,int x5; x0 = 2; x1 = 4; x2 = 6; x3 = 8; x4 = 10;,2019/7/28,56,字符数组,字符数组:存放字符数据的数组,即数组各元素为字符类型char型; 存放字符:char s1 = C, h, i, n, a; 存放字符串:char s2 = “China“; 字符串以0作为结束符,需占用一个元素位置; 字符数组按字符串输入输出时,可直接对数组操作;,char string20; printf(“please type any character:”); scanf(“%s”, string); printf(“%sn”, string);,2019/7/28,57,指针的概念,变量p为*p的地址,*p为地址p中的内容; 指针:实质上是各种数据在内存单元的地址;,C51变量 p *p 汇编语言 R0 R0,指针变量的定义,指针变量的定义形式: 数据类型说明符 存储器类型 *指针变量名; 数据类型说明符:指针指向的变量的类型; 存储器类型省略时,为一般指针,占用3个字节; 存储器类型为idata、data或pdata时,该指针占用1个字节,因为这些存储单元地址为1字节; 存储器类型为code、xdata时,该指针占用2个字节,因为这些存储单元地址为2字节;,2019/7/28,58,指针变量的引用,2019/7/28,59,int x,y; int * p,* p1,* p2; serial_initial(); printf(“input x and y:n”); scanf(“%d%d”,结构,结构:将不同数据类型的数据合成一个整体使用。 结构的各个变量间一般存在某种关系; 结构与结构变量的定义两种方法: 先定义结构类型,再定义结构变量 定义结构类型的同时定义结构变量名,2019/7/28,60,struct 结构名 结构元素表; struct 结构名 结构变量名1, 结构变量名2, ;,struct 结构名 结构元素表 结构变量名1, 结构变量名2, ;,结构变量的定义,2019/7/28,61,struct date int year; char month, day; struct date d1, d2;,struct date int year; char month, day; d1, d2;,结构中的成员可以是基本数据类型、指针、数组,也可以是另一种结构类型变量结构嵌套; 结构变量定义时可加各种修饰符说明; 相同结构类型的一组结构变量可定义成结构数组; 结构变量的内存长度为每个成员的内存长度之和。,结构变量的引用,结构变量的引用通过其结构元素的引用来实现。 结构变量名.结构元素名 或 结构变量名-结构元素名,2019/7/28,62,struct student unsigned char number10; unsigned char name10; unsigned int score; s13; unsigned char highno = 0; unsigned int tempint;,结构的成员运算符,2019/7/28,63,for (i=0; i3; i+) printf(“input number and name:n”); scanf(“%s, %s”, s1i.number, ); printf(“input score:n”); scanf(“%d”, ,联合,和结构很相似,但是这些成员只能有一个起作用。 联合的定义 联合变量的引用 联合变量名.联合元素 或 联合变量名-联合元素 联合变量所占的内存长度为各成员的长度的最大值。,2019/7/28,64,union 联合类型名 成员列表; union 联合类型名 变量列表;,union 联合类型名 成员列表变量列表;,联合,联合经常被用来提供同一个数据的不同的表达方式。,2019/7/28,65,union unsigned int word; / 2字节 struct unsigned char high; / 1字节 unsigned char low; / 1字节 bytes; / 2字节 value; / 2字节 value.word = 0x1234;,value.bytes.high = 0x12; value.bytes.low = 0x34;,枚举,枚举是一个被命名的整型常数的集合。 枚举的定义 enum 枚举名 枚举值列表; enum 枚举名 枚举变量列表; 或 enum 枚举名 枚举值列表枚举变量列表;,2019/7/28,66,enum string X1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年薄膜包衣粉合作协议书
- 自行车租赁服务品牌建设考核试卷
- 氮肥施用的农业管理策略考核试卷
- 新媒体广告创意与设计
- 2025年耐高温滤料项目合作计划书
- 2025年同位素分离装置项目发展计划
- 新时代教师思想教育体系建设
- 2025年一级建造师之一建港口与航道工程实务真题练习试卷A卷附答案
- 2025年高通量试验反应堆及配套产品合作协议书
- 2025年隔音降噪设备:隔音吸声材料合作协议书
- 蛋糕店产品与服务方案
- 继子女断绝关系协议书
- 国开《会计学概论》网核模拟测试答案
- 2023年度健康体检大数据蓝皮书-美年健康+中关村美年健康产业研究院
- ASME材料-设计许用应力
- 青春期的烦恼新专家讲座
- 数字贸易学 课件 第15章 数字支付与数字货币
- 中华民族共同体概论课件专家版6第六讲 五胡入华与中华民族大交融(魏晋南北朝)
- 体外高频热疗的护理
- PFMEA(中英文标准模板)
- 新编酒水知识与调酒
评论
0/150
提交评论