第六讲:C-51程序设计 本讲重点: C-51的数据类型和存储类型; 指针和中断的使用 通过实例消化理解C-51的编程方法 尝试将实验课中的ASM-51程序转为C-51程序 《单片机原理与应用技术》教学堁件
《单片机原理与应用技术》教学课件 第六讲: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.具有将可变的选择与特殊操作组合在一起的 能力, 序的可读性; 握供的库包含许多标准子程序,具有较强的 6于具有方便的模热化编程技术,使已编好 程序可 新程序 《单片机原理与应用技术》教学堁件
《单片机原理与应用技术》教学课件 C-51与ASM-51相比,有如下优点: 1. 对单片机的指令系统不要求了解,仅要求对 8051 的存贮器结构有初步了解; 2. 寄存器分配、不同存贮器的寻址及数据类型 等细节可由编译器管理; 3. 程序有规范的结构,可分成不同的函数,这 种方式可使程序结构化; 4. 具有将可变的选择与特殊操作组合在一起的 能力,改善了程序的可读性; 5. 提供的库包含许多标准子程序,具有较强的 数据处理能力; 6. 由于具有方便的模块化编程技术,使已编好 程序可容量地植入新程序;
)C-51的程序结构 与一般C语言的结构相同,以main(函数为程序人 口,程序体中包含若干语句还可以包含若干函数。 自C-51的数据类型 常用的数据类型有: 位型字符型整型长整型浮点型 bit char int ong int float 改位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 C-51的包含的头文件 H: reg51h math. h ctype.h stdio. h stdlib. h absacc h 常用e951h(定义特殊功能寄存器和位寄存器) athh(定义常用数学运算) 《单片机原理与应用技术》教学堁件
《单片机原理与应用技术》教学课件 ㈣ 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 (定义常用数学运算);
6C-51的运算符 与C语言基本相同: (加减乘除) (大于大于等于小于小于等于) (测试等于测试不等于) (逻辑与逻辑或逻辑非) (位右移位左移) (按位与按位或) (按位异或按位取反 《单片机原理与应用技术》教学堁件
《单片机原理与应用技术》教学课件 ㈥ C-51的运算符 与C语言基本相同: + - * / (加 减 乘 除) > >= > << (位右移 位左移) & | (按位与 按位或) ^ ~ (按位异或 按位取反)
C-51的基本语句 与标准C语言基本相同 if 选择语言 switch/case多分支选择语言 while 循环语言 do-while 循环语言 or 循环语言 《单片机原理与应用技术》教学堁件
《单片机原理与应用技术》教学课件 ㈦ C-51的基本语句 与标准C语言基本相同: if 选择语言 switch/case 多分支选择语言 while 循环语言 do-while 循环语言 for 循环语言
0实例 例1.“8”字符循环演示(字形口为DCH字位口为DDH) ★汇编语言程序 ORG 000OH 延时子程序 MOV RO,#0DCH;指向字形口 DEYS: PUSH 02H MoVA,#80H;确定字形代码 DEYO: PUSH 02H MoX@R0,A:输出字形代码 DEYI: PUSH 02H MoVR1,#0DDH;指向字位口 DJNZ R2,$ MoVA,#20H:从最高位开始 POP 02H LED DJNZ R2 DEYI MoX@R1,A;输出字位代码 POP 02H MQVR2,#18H;确定延时常数 DJNZ R2 DEYO CALL DEYS;调延时子程序 POP 02H 右移一位 DJNZ R2 DEYS SJMR ;循环演示 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”字符循环演示的C-51程序 #include main() #include I uchar rr, i: #define uchar unsigned char: for() 字形口 rr=0x01;/从最右一位开始 #define porta for(i=0;i<6;++){ XBYTELOxffdc PORTA=0x80输出字形代码*/ 字位口 PORTB=r;/“输出字位代码 #define portB msce(150);/调延时子程序 XBYTE[OxffddI rr=r<<1;/循环左移一位 时1MS子程序 void msce(unsigned int x) f unsigned char j whie(--=0) {or(0<6Qj++) 《单片机原理与应用技术》教学堁件
《单片机原理与应用技术》教学课件 #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 000OH SE01: MOV RO.#00H MOV DPTR,#2000H (0000HIEDPTR LOO1: CLR A MOVX ODPTRA 0送(DPTR) INC DPTR DPTR+1 INC RO 字节数加1 CNE R0,#00H,L01;不到FF个字节再清 LOOP: SMP LOOP ★C-51程序 include unsigned char xdata *p=0x2000;/指针指向2000H单元 for(1=0<256i++) 清零2000H-20FFH单元 《单片机原理与应用技术》教学堁件
《单片机原理与应用技术》教学课件 ★ 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