Presentation is loading. Please wait.

Presentation is loading. Please wait.

第九章 单片机的C51编程 第一节 概述 第二节 程序的格式 第三节 数据类型和存储类型 第四节 运算符和表达式 第五节 指针与函数

Similar presentations


Presentation on theme: "第九章 单片机的C51编程 第一节 概述 第二节 程序的格式 第三节 数据类型和存储类型 第四节 运算符和表达式 第五节 指针与函数"— Presentation transcript:

1 第九章 单片机的C51编程 第一节 概述 第二节 程序的格式 第三节 数据类型和存储类型 第四节 运算符和表达式 第五节 指针与函数
第一节 概述 第二节 程序的格式 第三节 数据类型和存储类型 第四节 运算符和表达式 第五节 指针与函数 第六节 片内硬件资源的定义 第七节 程序的基本结构 第八节 C51程序举例 第九节 Windows环境下C51编译器的操作

2 本章要点 掌握C语言程序的基本结构,学会编制一些简单的单片机应用程序,并能在Windows环境下使用C51编译器进行编译操作。
由于8051单片机的应用程序用的是C51编译器,了解应注意在存储类型、对片内硬件资源的定义等方面与标准C语言的区别。

3 第一节 概述 随着开发工具及集成电路技术的发展,单片机开始使用高级语言。
第一节 概述 随着开发工具及集成电路技术的发展,单片机开始使用高级语言。 专门针对8051系列单片机开发出来的C51编译器(简称C51) 可编译生成能够在 8051系列单片机上运行的目标程序。 目前针对8051系列单片机开发出来的编译器有多种,包括Franklin C51、Keil C51 for windows等。 返回本章首页

4 第二节 程序的格式 执行结果在屏幕上输出以下一行信息: 先从几个实例,了解C语言的程序格式。例9-1 #include“stdio.h”
第二节 程序的格式 先从几个实例,了解C语言的程序格式。例9-1 #include“stdio.h” main() { printf(“Welcome to using C51 \n”); } 执行结果在屏幕上输出以下一行信息: Welcome to using C51 其中main( )为函数,printf为函数,stdio.h为文件

5 {int a,b,c,sum; /*定义变量*/ a=12;b=34;c=56; /*给变量赋值*/ sum=a十b十c; /*求和*/
例9-2 #include“stdio.h” main() /*主函数*/ {int a,b,c,sum; /*定义变量*/ a=12;b=34;c=56; /*给变量赋值*/ sum=a十b十c; /*求和*/ printf(“sum is %d\n”,sum);/*显示结果*/ } 执行结果在屏幕上输出: sum is 102

6 例9-3 #include“stdio.h” int max(int x,int y) /*定义max函数,函数返回值为整型;x,y为形式参数,整型*/ { int z; if(x>y) z=x; else z=y; return(z); /*将z的值返回到调用处*/ } main() /*主函数*/ {int a,b,m; /*定义三个整型变量*/ scanf(“%d,%d,”&a,&b);/*输入变量a和b的值*/ m=max(a,b);/*调用max函数,将返回值赋给m*/ printf(“max=%d”,m); /*输出m的值*/

7 从三个例子可看出C语言或C51源程序的基本格式: 1.书写格式自由,一行可以写若干条语句,一个语句也可以写成几行,每个语句须以“;”结尾。
2.程序由一个主函数和若干个其他函数组成,主函数的名字必须为main。程序的执行总是从main函数开始的,其位置无特殊规定。 3.C语言程序通过函数调用去执行指定的工作。源程序文件需要包含其他源程序文件的内容时,则要在本程序文件头部用包含命令#include进行“文件包含”处理。 返回本章首页

8 第三节 数据类型和存储类型 一、数据类型 不同类型的数据占用的存储长度不同 1.常量和符号常量 常量指程序运行时其值不能被改变的量
第三节 数据类型和存储类型 一、数据类型 不同类型的数据占用的存储长度不同 数据分为常量和变量 1.常量和符号常量 常量指程序运行时其值不能被改变的量 符号常量是代表一个常量的标识符 常量类型: 整型、实型、字符、字符串

9 2.变量类型 表 C51变量类型 变量名称 符号 类型 数据长度 值域范围 位型量 bit 1位 0,1 字符型 有符号
signed char 8位 -128~+127 无符号 unsigned char -32768~+32767 整数型 signed int 16位 0~255 unsigned int 0~65535 长整型 signed long 32位 -231~232-1 unsigned long 232-1 浮点型 float 3.4E-38~3.4E+38 指针型 指针 8~24 对象地址 特殊位型 sbit 1 0或1 8位特殊功能寄存器型 sfr 8 16位特殊功能寄存器型 sfr16 16

10 二、存储类型 表 C51存储类型 存储类型 与存储空间的对应关系 data bdata idata pdata xdata code
直接寻址片内数据存储区,访问速度快(128字节) bdata 可位寻址片内数据存储区,允许位与字节混合访问(16字节) idata 间接寻址片内数据存储区,可访问片内全部RAM地址空间(256字节) pdata 分页寻址片外数据存储区(256字节)由MOVX @R0,A指令访问 xdata code 代码存储区(64K),由MOVC

11 表 C51存储类型及其大小 存储类型 长度(位) 长度(字节) 值域,范围 data 8 1 bdata idata pdata xdata
O~255(8bit即OOH~0FFH) bdata idata pdata O~255(8bit 即OOH~0FFH) xdata 16 2 O~65535 ­(16bit 即0000H~0FFFFH) code 0~65535 (16bit即0000H~0FFFFH)

12 C51中定义变量除了定义数据类型外,还应定义存储类型
例:int data x , y ; 表示x , y 为16位整数并指定放 在片内数据存储区 1.若未定义存储类型,则C51编译器自动选择默认存储类型 存储模式 默认的存储类型 SMALL 默认的存储类型为data,最大为128字节 COMPACT 默认的存储类型为pdata,每页256字节 LARGE 默认的存储类型为xdata,最大为64K

13 2.选择变量类型时应尽量选用无符号型,可以减少测试符号的额外操作,可以提高代码效率。
3.为使编程时书写简化,数据类型允许用缩写 例: #define uchar unsigned char #define ulong unsigned long 返回本章首页

14 第四节 运算符和表达式 一、算术运算符及其表达式 1.C语言的基本算术运算符 算术运算符有+、-、*、/、%(%为模运算符,或称求余运算符)
第四节 运算符和表达式 一、算术运算符及其表达式 1.C语言的基本算术运算符 算术运算符有+、-、*、/、%(%为模运算符,或称求余运算符) 用算术运算符和圆括号将运算对象包括常量、变量、函数、数组等连接起来,形成符合C 语法规则的式子称为算术表达式。 如:a*(b-c)+2.3+’a’

15 2.算术运算符的优先级 先乘除模,后加减,括号最优先。 3.算术运算符的结合性 “自左至右”,即运算对象两侧的算术运算符优先级相同时,先与左边运算符结合。 4.数据类型不同时的转换 如果运算符两侧的数据类型不同,则必须转换成同一类型,再进行运算。转换方式有自动转换(默认)和强制转换。强制转换的形式为 (类型名) (表达式); 例:(double) x;(将x强制转换成double型) 注:只转换表达式的值,变量类型不变。

16 二、关系运算符及其表达式 1.六种关系运算符 2.关系运算符的优先级 > (大于) < (小于)
> (大于) < (小于) >= (大于或等于) <= (小于或等于) != (不等于) == (等于) 2.关系运算符的优先级 1. >、<、 >=、<=优先级相同,!=与==相同,前四种高于后两种。 2.关系运算符的优先级低于算术运算符。 3.关系运算符的优先级高于赋值(=)运算符。

17 3.关系表达式 用关系运算符将两个表达式(算术表达式、关系表达式、逻辑表达式等)连接起来的式子称为关系表达式,其结果是逻辑值,即“真”或“假”。C语言没有逻辑型数据,以1代表真,以0代表假。 例如a=1,b=2,c=3,则 c>b的值为“真”,表达式的值为1; b >=(a+c)的值为“假”,表达式的值为0; x=a>b,因a>b的值为“假”,所以x的值为0

18 三、逻辑运算符及其表达式 1.三种逻辑运算符 && 逻辑与 (两个操作数都为真时,结果才为真,否则 为假) ¦¦ 逻辑或
(只要两个操作数中有一个为真,结果便为 真,否则为假) ! 逻辑非 (对操作数的值取反) &&和¦¦ 要求有两个操作对象,而!是单目运算符,只要求有一个运算对象。

19 优先顺序为 !(非)->算术运算符->关系 运算符->&&和¦¦ ,最低为赋值运算符。 3.逻辑表达式
2.逻辑运算符的优先级 优先顺序为 !(非)->算术运算符->关系 运算符->&&和¦¦ ,最低为赋值运算符。 3.逻辑表达式 用逻辑运算符将关系表达式或逻辑量连接起来的式子称为逻辑表达式。逻辑表达式的值只能是0(假)或1(真)。 例:已知a=2,b=3,求!a、a&&b、!a && b !a为0(假) a=2非0故为假 a&&b为1(真) !a&&b 为0(假) 先执行!a为0故!a&&b为0

20 四、位操作运算符及其表达式 & 按位与 ¦ 按位或 ∧ 按位异或 ~ 按位取反 << 位左移 >> 位右移
& 按位与 ¦ 按位或 ∧ 按位异或 ~ 按位取反 << 位左移 >> 位右移 除运算符~外,其余位操作运算符都是两目运算符。 位运算符操作的对象只能是整型或字符型数据。

21 1.按位与 & 参与运算的两操作数,只有双方相应的位都为1,结果值中该位为1,否则为0。 即 O&O=O,O&l=0,l&O=0,l&l=l 例:a=0x37,b=Ox7A求a&b的值。 a&b= 2.按位或¦ 参与运算的两操作数只要双方相应的位中有1,其结果该位便为1,否则为0。 即O ¦ O =O,O¦ l=1,l ¦ O=1,l ¦ l=l 例:a=0x31,b=0x56,求a¦b的值 a¦b= B

22 3.按位取反 ~ 对操作数按位取反,即0变l, 1变0 例:a=0x3FH= B,求~a 的值 ~a= B 4.按位异或 ∧ 参与运算的两操作数,如果对应位的值不同,运算结果该位为1,否则为0。即 O∧O=O,O∧l=1,l∧O=1,l∧l=0 例:a=0x31,b=0x56,求a∧b的值 a∧b= B

23 移位运算时,将左操作数的各二进制位全部左(右)移若干位,所移位数由右操作数决定。移位后留出的空白位补0,溢出的位舍弃。
5. 位左移和位右移 移位运算时,将左操作数的各二进制位全部左(右)移若干位,所移位数由右操作数决定。移位后留出的空白位补0,溢出的位舍弃。 例:a=Ox3E,求a<<2的值 求得 即0XF8 例:a=0x3E,求a>>2的值 求得 即0X0F

24 五、自增减运算符及其表达式 作用:使变量的值增1或减l, 如:++i (使用i之前,先使i值增1) --i (使用i之前,先使i值减1) i++ (在使用i之后,使i值增l) i-- (在使用i之后,使i值减1) 例:若i=5 则j=i++; (执行后i=6,j=?) j=++i; (I=6,j=6)

25 C语言中的两目运算符都可以和赋值运算符“=”一起组成复合赋值运算符。 使用的复合赋值运算符有以下10种:
六、复合运算符及其表达式 C语言中的两目运算符都可以和赋值运算符“=”一起组成复合赋值运算符。 使用的复合赋值运算符有以下10种: +=, -=, *=, /=, %=, <<=, >>=, &= , ¦=, ~= 例如 a += 2 等价于 a=a+2 m *= n+1 等价于 m=m*(n+1)

26 七、对指针操作的运算符 & 取地址运算符 * 取内容运算符 & 又能用于按位与,此时 “&”的两边 必须有操作对象。
& 取地址运算符 * 取内容运算符 & 又能用于按位与,此时 “&”的两边 必须有操作对象。 * 还可作为指针变量的标志,但此时 一定出现在对指针定义中。 返回本章首页

27 第五节 指针与函数 一、指针与指针变量 变量名对应于内存单元的地址,变量值则是放在内存单元中的数据。同时把存放变量x的地址称为指针,使用指针前也必须定义。 指针的定义: char xdata *data xp 也可以写成 data char xdata *xp

28 指针与指针变量的使用 1.指针变量名前面冠以“*”号,如上例*xp,表示xp为指针。 2.定义时,应包括被指变量的数据类型、存储类型以及指针变量本身的存储类型。指针变量本身的存储类型,写在语句的开头,或者在*号与变量名之间。 3.如果只标明被指变量的数据类型和存储类型,而没有指明指针变量本身的存储类型,则指针变量本身被默认为通用型。

29 指针与指针变量的使用举例 例:定义一字符变量x,并赋值为6 char data x x=6 例:定义一指针xp,指向x所在的内存单元 char data *data xp xp=&x 定义后要访问x可以用两种办法: 1)直接访问,如printf(“%d”,x) 2)间接访问,如printf(“%d”,*xp)

30 二、函数 C51程序是由一个主函数和若干个其他函数所构成,程序中由主函数调用其他函数,其他函数也可以互相调用。 主函数 程序 标准库函数
无参数函数 其他函数 自定义函数 有参数函数

31 类型标识符用来指定函数返回值的类型。无参数函数一般不带返回值,可以不写类型标识符。
1.无参数函数的定义形式 类型标识符 函数名() {函数体语句} 类型标识符用来指定函数返回值的类型。无参数函数一般不带返回值,可以不写类型标识符。 例:dis() { printf(“ok\n”); }

32 2.有参数函数的定义形式 类型标识符 函数名(参数列表及说明) {函数体语句} 例: int max(int x,int y)
{int z; / *函数体语句*/ if (x>y) z=x; else z=y; return (z);} 返回本章首页

33 第六节 片内硬件资源的定义 一、特殊功能寄存器的定义
8051系列单片机的片内有21个特殊功能寄存器(简称SFR),地址分散在片内RAM的高端128字节地址80H-0FFH范围内,其中有11个寄存器具有位寻址能力。在C51中使用这些寄存器必须事先予以定义,定义后便可直接访问。

34 1.用sfr定义字节型特殊功能寄存器的标志符
例如: sfr P0=0X80 sfr PCON=0X87 sfr TMOD=0X89 sfr PSW=0XD0 sfr P1=0X90 sfr TCON=0X88 sfr SCON=0X98 这些符号已在文件reg51.h中被定义如果使用#include “reg51.h”包含命令就无需一一定义

35 2.用sfr16定义双字节型的特殊功能寄存器的标志符
例如: sfr16 DP=0X82 使用注意 1)sfr16限于允许组合成16位的特殊功能寄存器(像DPH、DPL)。 2)也可以不用sfr16,而用sfr对DPH、DPL分别定义,需要赋值时可分别赋值。

36 3.用sbit定义特殊功能寄存器位地址空间的位名称 例如 sbit P1_0=P^0
sbit OV=PSW^2 sbit CY=PSW^7 OV也可以用下面两种方法定义 sbit OV=0XD0^2 sbit OV=0XD2 CY也可以用下面两种方法定义 sbit CY=0XD0^7 sbit CY=0XD7

37 二、存储器绝对地址定义 在包含头文件absacc.h的前提下,可以使用#define指令定义不同存储空间各个变量的绝对地址
例:#define PORT XBYTE[0X2000] XBYTE表示PORT所处的存储空间和数据长度,方括弧内表示PORT的绝对地址。 语句 PORT=0X01 表示将数据0X01赋予片外存储器0X2000。

38 表示以上将0X01赋予片外存储器的规定关键字有八种
1)CBYTE 程序存储器空间,字节型 2)DBYTE 片内RAM空间,字节型 3)PBYTE 分页操作的片外RAM空间,字节型 4)XBYTE 片外RAM空间,字节型 5)CWORD 程序存储器空间,字型 6)DWORD 片内RAM空间,字型 7)PWORD 分页操作的片外RAM空间,字型 8)XWORD 片外RAM空间,字型 返回本章首页

39 第七节 程序的基本结构 一、顺序结构 顺序结构是指程序按语句的先后顺序逐句执行,是最基本、最简单的—种程序结构。例如以下输入半径值,求圆面积和周长的程序。 include ”stdio.h” #define PI 3.14 main() {float r,s,y; /*定义三个浮点型变量*/ scanf(“%f”,&r); /*输入数据*/ s=PI * r * r; y=2*PI*r; printf(“area is %f,perimeter is %f\n”,s,y); }

40 二、分支结构 分支结构可分为单分支、双分支和多路分支三种。 1.单分支语句形式 if(表达式) 语句; 例:从键盘输入两实数,然后按
值的大小顺序输出 #include ”stdio.h” main() { float a,b,t; scanf(“%f,%f”,&a,&b); if(a>b) {t=a; a=b;b=t} printf(“%5.2f,%5.2f”,a,b); }

41 2. 双分支 双分支语句的形式 if(表达式) 语句1; else 语句2; 例如:if(x=1) y=x+5; y=x*5;
t=x; else t=y; if (t<z) t=z; Printf(“max is %d”,t);

42 分支语句嵌套 分支语句可以嵌套使用,双分支语句嵌套后可实现多路分支,其语句形式为 if(表达式1) 语句1; else if(表达式2) 语句2; else if(表达式n—1) 语句n-1; else 语句n;

43 3. 多分支 C语言提供一种专门用于多分支的开关语句,流程图如图所示。

44 {case 常量表达式l:语句1;break; case 常量表达式2:语句2;break; …
多分支的语句形式 switch (表达式) {case 常量表达式l:语句1;break; case 常量表达式2:语句2;break; case 常量表达式n:语句n;break; default: 语句n+1;break; } 多分支的语句实例 例:给定一个百分制成绩,要求转换为五级记分制,规定90分以上为‘A’,80~89分为‘B’,70~79分为‘C’,60~69分为‘D’ 60分以下为‘E’。

45 多分支的语句实例 ( 续1 ) #include “stdio.h” main() { int score, c; char g;
多分支的语句实例 ( 续1 ) #include “stdio.h” main() { int score, c; char g; printf(“请输入学生成绩:”); scanf(“%d”,&score); /*从键盘输入*/ if((score>100¦ ¦(score<0)) printf(“\n输入错误!”); /*大于100小于0*/ else c=(score—score%10)/10;

46 多分支的语句实例 ( 续 2) switch(c) { case 10: case 9:g=’A’;break;
多分支的语句实例 ( 续 2) switch(c) { case 10: case 9:g=’A’;break; case 8:g=’B’;break; case 7:g=’C’;break; case 6:g=’D’;break; case 5: case 4: case 3: case 2: case 1: case 0:g=’E’; } printf(“成绩:%d,等级成绩为%c”, score, g);

47 三、循环结构 1.while语句 while语句的形式: while(表达式) 循环体;

48 while语句实例 求1十2十3十…100的和。 #include “stdio.h” main() { int i ,sum=0;
sum=sum + i; i++; } printf(“%d”,sum);

49 2.do...while语句 语句形式: do 循环体 while(表达式); 先执行循环体,后判 断表达式是否成立,当 表达式的值为非零时, 返回重新执行循环体, 直至表达式值为零,则 停止循环。

50 Do...while语句实例 #include “stdio. h” main() { int i ,sum=0; i=1; do
sum=sum+i; i++; } while(i<=100); printf(“%d”,sum);

51 3.for语句 语句形式: for(exp1;exp2;exp3) 循环体; 例:用for语句改写1十2十3十…100的和
#include”stdio.h” main() { int t, sum=O; for(i=1; i<100; i++) sum=sum+i; printf(“%d”,sum); } 返回本章首页

52 第八节 C51程序举例 一、“走马灯”电路 设计一个实验电 路,在AT89C51并行 接口P1连接8个LED, 要求这8个LED能循
环点亮。电路如图。

53 “走马灯”电路程序清单 #include"reg51.h” delay(int t) /*延时函数*/
{ int i,j; /*采用默认的存储类型*/ /*用双重空循环延时*/ for(i=0; i<t; i++) for(j=0; j<10; j++); } main() /*主函数*/ { char data i,s;

54 “走马灯”电路程序清单(续) while(1) /*无穷循环*/ { s=0xfe; /*设置初值,最低一位为0 */
P1=s; /*P1送据,令接P1.0的LED亮*/ delay(500); for(i=0; i<8; i++) s =s<<1; /*s值左移一位,最低位补0 */ s=s¦0x01; /*将最低位置1 */ P1=s; /*由P1送出数据,令对应的LED亮*/ }

55 二、数码管动态显示 设计一个电路,利用外接可编程并行接口8255,驱动数码管显示字符,电路如图所示。

56 数码管动态显示程序 #include”stdio.h” #include”reg5l.h” /*载入C51头文件*/
#include"absacc.h” #define cr XBYTE[0x8003] #define pb XBYTE[0x8001] #define pc XBYTE[OX8002] #define CW 0x88 char d_7[4]={0x3f,0x06,0x5b,0x4f}/*0-3的字型段码数据*/ char con[4]={0xfe,0xfd,0xfb,Oxf7} /*扫描控制信号*/

57 数码管动态显示程序(续1) delay(int t) /*延时函数*/ {int i,j; for(i=0; i<t; i++)
for(j=0; j<10; j++); } scan() /*扫描显示函数*/ {char i; for(i=0; i<4; i++) {pb=d_7[i]; /*B口送出段码*/ pc=con[i]; /*C口送位码*/ delay(3);

58 数码管动态显示程序(续2) main() {cr=CW; /*定8255工作模式*/ while(1) scan(); /*无穷循环 }
由于扫描速度很快,好像四个数码管同时发亮,即显示出“0123” 。

59 三、救护车警声程序 本程序利用可编程发声器件(PSG)芯片AY 产生救护车的警报声,电路如图.AY 内部寄存器所载入的数据与所实现的功能参看表9-6。

60 #include ”reg5l.h” /*载入C51头文件*/
救护车警报声程序 #include ”reg5l.h” /*载入C51头文件*/ #include "absacc.h” #include ”stdlib.h” #define psg_reg XBYTE[0x9000] #define psg_data XBYTE[OX9001] delay(int t) /*延时函数*/ {int i,j; for(i=0; i<t; i++) for(j=0; j<5; j++); } flash() /*工作灯闪烁函数*/ {char i; for(i=0; i<3; i++) {P1=0x80; delay(40); P1=0;delay(40);

61 救护车警报声程序(续1) setpeg(int r, int d) /*向PSG送数函数*/ {psg_reg=r; /*选择寄存器*/ psg_data=d; /*d写入指定存储器*/ } alarm() /*发警报声函数*/ {setpsg(0,5); setpsg(1,1); /*产生440Hz的声音*/ setpsg(7,62); /*R7=62启用音调发声器*/ setpsg(8,15); /*R6=15声道的振幅最大*/ delay(300); setpsg(0,104); /*R0=104*/ setpsg(1,2); /*产生180Hz声音*/

62 救护车警报声程序(续2) delay(300); setpsg(8,0); /*音量设为0*/ } main() {setpsg(7,63); /* 关闭音调发声器*/ flash(); /*调用LED闪烁函数*/ delay(800); while(1) /*无穷循环*/ alarm(); /*调用警报声函数*/

63 在C51中,中断服务程序定义为函数,并规定用下列形式表示
函数名 interrupt n [using m] 将上述 “走马灯” 电路改用开关控制,并采用中断方式如图所示,要求开关每拨动一次,点亮 的LED向前移动一个位置.

64 “走马灯” 电路中断方式程序 #include"reg51.h” char i; char s=0xfe;
led1() interrupt 2 { if(i<8){s=s<<1;s=s¦0x01;P1=s;i++;} else {i=0 ;s=0xfe;} }

65 while(1); /*无穷循环等待中断*/ } main()的任务是开中断,通过中断函数将1左移,并在左移8次后,回到原始状态。
“走马灯” 电路中断方式程序(续) main() /*主函数*/ { EA=1; /*开中断*/ EX1=1; /*允许外部中断1中断*/ IT1=1; /*下降沿触发方式*/ P1=0xfe; /*点亮第一个LED*/ while(1); /*无穷循环等待中断*/ } main()的任务是开中断,通过中断函数将1左移,并在左移8次后,回到原始状态。 返回本章首页

66 第九节 Windows环境下C51编译器的操作
C51语言的程序设计之后,需要经过编译、优化、链接等过程,转换成在单片机上能运行的HEX文件,才能固化到程序存储器。 Keil公司的C51编译器是基于Windows环境下的产品,包括汇编器A51、编译器C51、连接器BL51和文件转换器OH51等工具,还有集成编译环境μVision2。用户在此环境下可以完成源程序的编写、编译、连接、仿真调试及项目管理等操作。

67 一、Keil C51的安装 安装步骤 执行 SETUP 指定的安 装目录 插入Keil C51 安装
安装盘 安装 安装完成后此目录下有两个子目录 UV2 在UV2子目录中,有μVision2主执行文件UV2.EXE。 C51 在C51\BIN子目录中有汇编器A51、编译器C51、连接器BL51和文件转换器OH51等执行文件以及一些存放芯片驱动程序的动态链接库(.DLL); 在C51\INC子目录中,装有编译需要的头文件(.H); 在LIB子目录中,装有C51的标准函数库.LIB)。

68 二、C51程序的编写和调试 执行V2子目录中的UV2.EXE,启动μVision2,进入主窗口,用窗口中的文件编辑器编写C51程序,格式遵循C语言语法规则。 编写完C51程序,在μVision51环境下就可以进行编译、连接,如果编译连接成功,还可以调用软件仿真器进行调试。

69 μVision2主窗口

70 1. 编辑源文件 【File】->【New】,弹出编辑窗口,如图

71 3. 选择目标器件 2.建立工程文件 编写好程序,执行 【Project】->【New Project】
选项,在弹出的窗口中写入工程文件的名称,并加上后綴uv2,如ex1.uv2。 3. 选择目标器件 在Project窗口中的Target1项目上右击,选择【Select Device for Target ‘Target1’】,从对话框中的厂家和单片机列表中单片机型号,本例选择AT89C51,见下图。

72 选择目标器件型号对话框

73 4.设置生成Hex代码文件 设置方法:右击Target1,选择【Option for Target ‘Target1’】 ,选择output,然后在Create HEX File可选框中打√。 5.编译 执行【Project】->【Rebuild All Target Files】就能自动完成编译,生成后綴为obj、hex、m51、lst等文件。hex文件就是我们所需要的目标程序,可以利用编程器写入单片机的片内程序存储器。

74 6. 调试 μVision2环境可以对程序进行仿真调试,调试器有两种工作模式: Use Simulator工作模式 Use接口驱动工作模式 在【Option for Target ‘Target1’】对话框中选择。Use Simulator模式将调试器配置成纯软件模拟,不需要实际的硬件支持;Use接口驱动模式是在本机与相关硬件接口相连时使用。

75 调试步骤 1)执行【Debug】->【Start/Stop Debug Session】,进入调试窗口(如图)。同时会弹出反汇编窗口(如图)或执行【View】-【Disassembly Window】弹出窗口。在这个窗口里可以应用单步跟踪、设置断点、寄存器观察等手段进行调试。 2)在目标程序的执行过程中,可以利用各种窗口(Regs窗口、Watch窗口、Serial窗口等)对程序进行跟踪、调试,便于优化程序,提高效率。 3)更详细的功能和操作,可查阅Keil C51手册和有关书籍。

76 调试窗口

77 反汇编窗口 返回本章首页


Download ppt "第九章 单片机的C51编程 第一节 概述 第二节 程序的格式 第三节 数据类型和存储类型 第四节 运算符和表达式 第五节 指针与函数"

Similar presentations


Ads by Google