第六讲:C-51程序设计 本讲重点: C51的数据类型和存储类型; 指针和中断的使用 通过实例消化理解C-51的编程方法 尝试将实验课中的ASM-51程序转为c51程序 《单片微机原理及应用》教学课件 奔六瘳
《单片微机原理及应用》教学课件 第六讲:C-51程序设计 本讲重点: C-51的数据类型和存储类型; 指针和中断的使用; 通过实例消化理解C-51的编程方法; 尝试将实验课中的ASM-51程序转为C-51程序
(c-51简介 c语言作为一种非常方便的语言而得到广泛的支持, c语言程序本身不依赖于机器硬件系统,基本上不 作修改就可将程序从不同的单片机中移植过来。 c提供了很多数学函数并支持浮点运算,开发效率 高,故可缩短开发时间,增加程序可读性和可维护 性。 《单片微机原理及应用》教学课件 奔六瘳
《单片微机原理及应用》教学课件 C语言作为一种非常方便的语言而得到广泛的支持, C语言程序本身不依赖于机器硬件系统,基本上不 作修改就可将程序从不同的单片机中移植过来。 C提供了很多数学函数并支持浮点运算,开发效率 高,故可缩短开发时间,增加程序可读性和可维护 性。 ㈠ C-51简介
C-51与ASM-51相比,有如下优点: 1.对单片机的指令系统不要求了解,仅要求对 8051的存贮器结构有初步了解 2.寄存器分配、不同存贮器的寻址及数据类型 等细节可由编译器管理 3,程序有规范的结构:可分成不同的函数,这 种方式可使程序结构化; 4.具有将可变的选择与特殊操作组合在一起的 能力,改善了程序的可读性 5:提供的库包含许多标准子程序,具有较强的 数据 后电于层有方便的模热化编程技术,使已编好 《单片微机原理及应用》教学课件 奔六瘳
《单片微机原理及应用》教学课件 C-51与ASM-51相比,有如下优点: 1. 对单片机的指令系统不要求了解,仅要求对 8051 的存贮器结构有初步了解; 2. 寄存器分配、不同存贮器的寻址及数据类型 等细节可由编译器管理; 3. 程序有规范的结构,可分成不同的函数,这 种方式可使程序结构化; 4. 具有将可变的选择与特殊操作组合在一起的 能力,改善了程序的可读性; 5. 提供的库包含许多标准子程序,具有较强的 数据处理能力; 6. 由于具有方便的模块化编程技术,使已编好 程序可容量地植入新程序;
c-51的程序结构 与一般C语言的结构相同,以main函数为程序人 口,程序体中包含若干语句还可以包含若干函数。 白c-51的数据类型 常用的数据类型有: 位型字符型整型长整型浮点型 bit char int long int float 1位1字节2字节4字节4字节 数组型 指针型 《单片微机原理及应用》教学课件 奔六瘳
《单片微机原理及应用》教学课件 ㈢ C-51的数据类型 常用的数据类型有: ㈡ C-51的程序结构 与一般C语言的结构相同,以main()函数为程序人 口,程序体中包含若干语句还可以包含若干函数。 位型 字符型 整型 长整型 浮点型 bit char int long int float 1位 1字节 2字节 4字节 4字节 数组型 指针型
四c-51数据的存储类型 名存储空间位置长度数据范围 data 直接寻址片内RAM8位 0~255 bdata 可位寻址片内RAM1位 0/1 idata 间接寻址片内RAM8位 0~255 xdata 片外RAM 16位0~65535 问C51的包含的头文件 通常有reg51 h math. h ctype. h stdio. h stdlib. h absacc h 常用有;reg51h(定义特殊功能寄存器和位寄存器); math . h(定义常用数学运算) 《单片微机原理及应用》教学课件 奔六瘳
《单片微机原理及应用》教学课件 ㈣ C-51数据的存储类型 名 存储空间位置 长度 数据范围 data 直接寻址片内RAM 8位 0~255 bdata 可位寻址片内RAM 1位 0/1 idata 间接寻址片内RAM 8位 0~255 xdata 片外RAM 16位 0~65535 ㈤ C-51的包含的头文件 通常有:reg51.h math.h ctype.h stdio.h stdlib.h absacc.h 常用有:reg51.h (定义特殊功能寄存器和位寄存器); math.h (定义常用数学运算);
闪C-51的运算符 与C语言基本相同 (加减乘除) >=<<=(大于大于等于小于小于等于) (测试等于测试不等于) &&|1! (逻辑与逻辑或逻辑非) (位右移位左移) & (按位与按位或) (按位异或按位取反) 《单片微机原理及应用》教学课件 奔六瘳
《单片微机原理及应用》教学课件 ㈥ C-51的运算符 与C语言基本相同: + - * / (加 减 乘 除) > >= > << (位右移 位左移) & | (按位与 按位或) ^ ~ (按位异或 按位取反)
臼C51的基本语句 与标准C语言基本相同 选择语言 switch/case多分支选择语言 while 循环语言 do-while 循环语言 for 循环语言 《单片微机原理及应用》教学课件 奔六瘳
《单片微机原理及应用》教学课件 ㈦ C-51的基本语句 与标准C语言基本相同: if 选择语言 switch/case 多分支选择语言 while 循环语言 do-while 循环语言 for 循环语言
实例 例1.“8”字符循环演示(字形口为DCH字位口为DDH) ★汇编语言程序 ORG 000OH ;延时子程序 MOV RO,#DCH;指向字形口 DEYS: PUSH 02H MoVA#80H;确定字形代码 DEYO: PUSH 02H MovX@R0,A;输出字形代码 DEYI: PUSH 02H MoVR1,#0DDH;指向字位口 DJNZ R2,$ MoVA#20H;从最高位开始 POP 02H LEDO. DJNZ R2, DEYI MoVX@R1A;输出字位代码 POP 02H MovR2,#18H;确定延时常数 DNZ R2 DEYO ACALL DEYS调延时子程序 POP 02H RL A 右移一位 DNZ R2, DEYS SJMP LEDO;循环演示 RET END 《单片微机原理及应用》教学课件 奔六瘳
《单片微机原理及应用》教学课件 ㈧ 实例 ORG 0000H MOV R0,#0DCH ;指向字形口 MOV A,#80H ;确定字形代码 MOVX @R0,A ;输出字形代码 MOV R1,#0DDH ;指向字位口 MOV A,#20H ;从最高位开始 LEDO: MOVX @R1,A ;输出字位代码 MOV R2,#18H;确定延时常数 ACALL DEYS ;调延时子程序 RL A ;右移一位 SJMP LEDO ;循环演示 ; 延时子程序 DEYS: PUSH 02H DEY0: PUSH 02H DEY1: PUSH 02H DJNZ R2,$ POP 02H DJNZ R2,DEY1 POP 02H DJNZ R2,DEY0 POP 02H DJNZ R2,DEYS RET END 例1.“8”字符循环演示 (字形口为DCH; 字位口为DDH) ★ 汇编语言程序
★“8”字符循环演示的C51程序 #include maino #include i uchar rr, i, #define uchar unsigned char for() /字形口* rr=0x01;/*从最右一位开始* #define porta for(i=0i<6;++) XBYTE[OXffdc PORTA=0X80;/输出字形代码*/ 字位口 PORTB=r;/“输出字位代码* #define portb msce(150);/调延时子程序* XBYTE[Oxffdd rr<1;/循环左移一位* 延时1MS子程序* void msce( unsigned int x) f unsigned char j while((x-)!=0) lor(j=0小j<60++);} 《单片微机原理及应用》教学课件 奔六瘳
《单片微机原理及应用》教学课件 #include #include #define uchar unsigned char /* 字形口 */ #define PORTA XBYTE[0xffdc] /* 字位口 */ #define PORTB XBYTE[0xffdd] /* 延时 1MS子程序 */ void msce(unsigned int x) { unsigned char j; while((x--)!=0) {for(j=0;j<60;j++); } } main( ) { uchar rr,i; for(;;) { rr=0x01;/* 从最右一位开始 */ for(i=0;i<6;i++) { PORTA =0x80;/*输出字形代码*/ PORTB =rr; /*输出字位代码*/ msce(150); /*调延时子程序*/ rr=rr<<1; /*循环左移一位*/ } } ★ “8”字符循环演示的C-51程序
例2清零程序(将2000H-20FFH的内容清零) ★汇编语言程序 ORG OOOOH SE01: MOV RO.#00H MOV DPTR, #2000H (0000HEEDPTR LOO1: CLR A MOVX @DPTRA 0送DPTR INC DPTR DPTR+1 INC RO 字节数加1 CNE R0#00HLoo1;不到F个字节再清 LOOP: SMP LOOP ★C-51程序 #include main( t int i; unsigned char xdata*p=0x2000/指针指向2000H单元* for(i=0;<256;++) *清零2000H-20FH单元 {*p=0p++ 《单片微机原理及应用》教学课件 奔六瘳
《单片微机原理及应用》教学课件 ★ C-51程序 #include main( ) { int i; unsigned char xdata *p=0x2000; /* 指针指向2000H单元 */ for(i=0;i<256;i++) /*清零2000H-20FFH单元*/ {*p=0; p++;} } 例2.清零程序 (将2000H—20FFH的内容清零) ★ 汇编语言程序 ORG 0000H SE01: MOV R0,#00H MOV DPTR,#2000H ;(0000H)送DPTR LOO1: CLR A MOVX @DPTR,A ;0送(DPTR) INC DPTR ;DPTR+1 INC R0 ;字节数加1 CJNE R0,#00H,LOO1 ;不到FF个字节再清 LOOP: SJMP LOOP