C-51程序设计知识_第1页
C-51程序设计知识_第2页
C-51程序设计知识_第3页
C-51程序设计知识_第4页
C-51程序设计知识_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

1、第六讲:C-51程序设计本讲重点: C-51的数据类型和存储类型; 指针和中断的使用; 通过实例消化理解C-51的编程方法; 尝试将实验课中的ASM-51程序转为C-51程序.C语言作为一种非常方便的语言而得到广泛的支持,C语言程序本身不依赖于机器硬件系统,基本上不作修改就可将程序从不同的单片机中移植过来。C提供了很多数学函数并支持浮点运算,开发效率高,故可缩短开发时间,增加程序可读性和可维护性。 C-51简介C-51与ASM-51相比,有如下优点:1.对单片机的指令系统不要求了解,仅要求对8051 的存贮器结构有初步了解;2.寄存器分配、不同存贮器的寻址及数据类型等细节可由编译器管理;3.程

2、序有规范的结构,可分成不同的函数,这种方式可使程序结构化;4.具有将可变的选择与特殊操作组合在一起的能力,改善了程序的可读性;5.提供的库包含许多标准子程序,具有较强的数据处理能力;6.由于具有方便的模块化编程技术,使已编好程序可容量地植入新程序; C51的数据类型 常用的数据类型有: C51的程序结构 与一般C语言的结构相同,以main()函数为程序人口,程序体中包含若干语句还可以包含若干函数。位型 字符型 整型 长整型 浮点型bit char int long int float1位 1字节 2字节 4字节 4字节数组型 指针型 C-51数据的存储类型名 存储空间位置 长度 数据范围 da

3、ta 直接寻址片内RAM 8位 0255 bdata 可位寻址片内RAM 1位 0/1idata 间接寻址片内RAM 8位 0255xdata 片外RAM 16位 065535 C-51的包含的头文件通常有:reg51.h math.h ctype.h stdio.h stdlib.h absacc.h常用有:reg51.h (定义特殊功能寄存器和位寄存器); math.h (定义常用数学运算); C-51的运算符与C语言基本相同:+ - * / (加 减 乘 除) = (位右移 位左移)& | (按位与 按位或) (按位异或 按位取反) C-51的基本语句与标准C语言基本相同: if 选择语

4、言 switch/case 多分支选择语言 while 循环语言 do-while 循环语言 for 循环语言 实例ORG 0000HMOV 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 02HDEY0: PUSH 02HDEY1: PUSH 02H DJNZ R2,$ POP 0

5、2H DJNZ R2,DEY1 POP 02H DJNZ R2,DEY0 POP 02H DJNZ R2,DEYS RET END例1.“8”字符循环演示 (字形口为DCH; 字位口为DDH) 汇编语言程序#include #include #define uchar unsigned char /* 字形口 */#define PORTA XBYTE0 xffdc /* 字位口 */#define PORTB XBYTE0 xffdd /* 延时 1MS子程序 */void msce(unsigned int x) unsigned char j; while(x-)!=0) for(j=0

6、;j60;j+); main( ) uchar rr,i; for(;) rr=0 x01;/* 从最右一位开始 */ for(i=0;i6;i+) PORTA =0 x80;/*输出字形代码*/ PORTB =rr; /*输出字位代码*/ msce(150); /*调延时子程序*/ rr=rr1; /*循环左移一位*/ “8”字符循环演示的C51程序 C51程序 #include main( ) int i; unsigned char xdata *p=0 x2000; /* 指针指向2000H单元 */ for(i=0;i256;i+) /*清零2000H-20FFH单元*/ *p=0;

7、 p+; 例2.清零程序 (将2000H20FFH的内容清零) 汇编语言程序 ORG 0000HSE01: MOV R0,#00H MOV DPTR,#2000H ;(0000H)送DPTRLOO1: CLR A MOVX DPTR,A ;0送(DPTR) INC DPTR ;DPTR+1 INC R0 ;字节数加1 CJNE R0,#00H,LOO1 ;不到FF个字节再清LOOP: SJMP LOOP例3.拆字程序(将2000H的内容拆开,高位送2001H低位,低位送2002H低位) 汇编语言程序 ORG 0000HSE02: MOV DPTR,#2000H MOVX A,DPTR MOV

8、B,A ;(2000)AB SWAP A ;交换 ANL A,#0FH ;屏敝高位 INC DPTR MOVX DPTR,A ;送2001H INC DPTR MOV A,B ANL A,#0FH ;(2000)内容屏敝高位 MOVX DPTR,A ;送2002H SJMP $拆字C51程序#include main( )unsigned char xdata *p=0 x2000;/*指针指向2000H单元*/ /* 2002H单元高4位清零,低4位装2000H单元低4位 */ *(p+2)=(*p)&0 x0f; /* 2001H单元高4位清零,低4位装2000H单元高4位 */*(p+1

9、)=(*p)4; 汇编语言程序 ORG 0000HL00: MOV R0,#10H ;查找16个字节 MOV R1,#00H MOV DPTR,#2000HL11: MOVX A,DPTR CJNE A,#00H,L16 ;取出内容与00H相等吗? INC R1 ;取出个数加1L16: INC DPTR DJNZ R0,L11 ;未完继续 MOV DPTR,#2100H MOV A,R1 MOVX DPTR,A ;相同数个数送2100HL1E: SJMP L1E例4.查找零的个数(在2000H-200FH中查出有几个字 节是零,把个数放在2100H单元中)查找零的个数C51程序#include

10、 main ( ) unsigned char xdata *p=0 x2000;/*指针p指向2000H单元*/ int n=0,i; for(i=0;i16;i+) if(*p=0) n+; /* 若该单元内容为零,则n+1 */ p+; /* 指针指向下一单元 */ p=0 x2100; /* 指针p指向2100H单元 */ *p=n; /* 把个数放在2100H单元中 */ 汇编程序 ORG 0000H MOV A,R3 MOV B,R7 MUL AB ;R3*R7 XCH A,R7 ;R7=(R3*R7)低字节 MOV R5,B ;R5=(R3*R7)高字节 MOV B,R2 MUL

11、 AB ;R2*R7 ADD A,R5 MOV R4,A CLR A ADDC A,B MOV R5,A ;R5=(R2*R7)高字节 MOV A,R6 MOV B,R3 MUL AB ;R3*R6 ADD A,R4 XCH A,B ADDC A,R5 MOV R5,A MOV PSW.5,C ;存CY MOV A,R2 MUL AB ;R2*R6 ADD A,R5 MOV R5,A CLR A MOV ACC.0,C MOV C,PSW.5 ;加上次加法的位 ADDC A,B MOV R4,A JMP $例5.双字节无符号整数快速乘法 C51程序#include main( )unsigne

12、d int xdata *p1=0 x2000;/*双字节被乘数在2000H单元*/ unsigned int xdata *p2=0 x2002;/*双字节乘数在2002H单元 */ unsigned long xdata *p3=0 x2010;/*4字节乘积放在2010H单元*/ *p3=(*p1)*(*p2); 例6.工业顺序控制C-51程序#include sbit P1_7=0 x97; /* 定义P1.7口地址 */ unsigned char TT;void Delay(unsigned int value) /* 延时子程序*/ while(value!=0) value-;

13、 void Serint1()interrupt 2 /*中断服务程序-暂停并报警*/ int i; TT=P1; /* 保护现场 */ P1=0 x7f; /* 关输出 */ while(!INT1) /* 若故障未消除,则报警 */ for(i=0;i0 xa0;i+) /* 给蜂鸣器发震荡脉冲 */ P1_7=1;Delay(50); P1_7=0;Delay(50); P1_7=0;Delay(6550); P1=TT; /*恢复现场 */ main ( ) IE=0 x84; /* CPU开中断,INT1开中断 */ while(T0=0); /* 等待P3.4变高 */ for(;

14、) P1=0 xfe; Delay(60000); /* 工序1 */ P1=0 xfd; Delay(60000); /* 工序2 */ P1=0 xfb; Delay(60000); /* 工序3 */ P1=0 xf7; Delay(60000); /* 工序4 */ P1=0 xef; Delay(60000); /* 工序5 */ P1=0 xdf; Delay(60000); /* 工序6 */ P1=0 x8f; Delay(60000); /* 工序7 */ (续前)例7.电脑时钟(用定时器产生0.1秒定时中断,对时钟计数器计数并送数码管显示) C51程序#include #i

15、nclude #define uchar unsigned char#define LEDwp XBYTE0 xffdc#define LEDwb XBYTE0 xffdduchar code table10=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90;uchar hour=1,min=23,sec=45,m=0,n,i; /* 给时钟赋初值 */uchar xdata *p; void Delay(unsigned int value) /*延时子程序*/ while(value!=0) value-; void T

16、rans(void) /*时间数据转换子程序*/ if(sec=60) min+;sec=0; if(min=60) hour+;min=0; if(hour=24) hour=0; *(p+0)=hour/10; /* 时的十分位 */ *(p+1)=hour%10; /* 时的个位*/ *(p+2)=min/10; /* 分的十分位 */ *(p+3)=min%10; /* 分的个位 */ *(p+4)=sec/10; /* 秒的十分位 */ *(p+5)=sec%10; /* 秒的个位 */ void Show(void) /*循环显示子程序*/ for(;) Trans( ); LEDwb=n=0 x20; for(i=0;i1; /* 中断服务子程序(0.1秒中断一次) *

温馨提示

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

评论

0/150

提交评论