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

下载本文档

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

文档简介

第六讲:C-51程序设计本讲重点:

C-51的数据类型和存储类型;指针和中断的使用;通过实例消化理解C-51的编程方法;尝试将实验课中的ASM-51程序转为C-51程序.第六讲:C-51程序设计本讲重点:C语言作为一种非常方便的语言而得到广泛的支持,C语言程序本身不依赖于机器硬件系统,基本上不作修改就可将程序从不同的单片机中移植过来。C提供了很多数学函数并支持浮点运算,开发效率高,故可缩短开发时间,增加程序可读性和可维护性。

㈠C-51简介C语言作为一种非常方便的语言而得到广泛的支持,㈠C-51简C-51与ASM-51相比,有如下优点:1.

对单片机的指令系统不要求了解,仅要求对8051的存贮器结构有初步了解;2.

寄存器分配、不同存贮器的寻址及数据类型等细节可由编译器管理;3.

程序有规范的结构,可分成不同的函数,这种方式可使程序结构化;4.

具有将可变的选择与特殊操作组合在一起的能力,改善了程序的可读性;5.

提供的库包含许多标准子程序,具有较强的数据处理能力;6.

由于具有方便的模块化编程技术,使已编好程序可容量地植入新程序;C-51与ASM-51相比,有如下优点:㈢C-51的数据类型常用的数据类型有:㈡C-51的程序结构

与一般C语言的结构相同,以main()函数为程序人口,程序体中包含若干语句还可以包含若干函数。位型

字符型

整型

长整型

浮点型bit

char

int

longint

float1位

1字节

2字节

4字节

4字节数组型

指针型㈢C-51的数据类型㈡C-51的程序结构数组型㈣C-51数据的存储类型名存储空间位置长度数据范围

data直接寻址片内RAM8位0~255bdata可位寻址片内RAM1位0/1idata间接寻址片内RAM8位0~255xdata片外RAM16位0~65535㈤C-51的包含的头文件通常有:reg51.hmath.hctype.hstdio.hstdlib.habsacc.h常用有:reg51.h(定义特殊功能寄存器和位寄存器);

math.h(定义常用数学运算);㈣C-51数据的存储类型名存储空间位置㈥C-51的运算符与C语言基本相同:+-*/(加减乘除)>>=<<=(大于大于等于小于小于等于)==!=(测试等于测试不等于)&&||!(逻辑与逻辑或逻辑非)>><<(位右移位左移)&|(按位与按位或)^~(按位异或按位取反)㈥C-51的运算符㈦C-51的基本语句与标准C语言基本相同:

if选择语言

switch/case

多分支选择语言

while

循环语言

do-while循环语言

for

循环语言㈦C-51的基本语句与标准C语言基本相同:㈧实例ORG0000HMOVR0,#0DCH;指向字形口MOVA,#80H ;确定字形代码MOVX@R0,A ;输出字形代码MOVR1,#0DDH;指向字位口MOVA,#20H ;从最高位开始LEDO:

MOVX@R1,A ;输出字位代码MOVR2,#18H ;确定延时常数ACALLDEYS ;调延时子程序RLA ;右移一位SJMPLEDO ;循环演示;

延时子程序DEYS:PUSH02HDEY0:PUSH02HDEY1:PUSH02HDJNZR2,$POP02HDJNZR2,DEY1POP02HDJNZR2,DEY0POP02HDJNZR2,DEYSRETEND例1.“8”字符循环演示(字形口为DCH;字位口为DDH)★汇编语言程序㈧实例ORG0000H;延时子程序例1.“8”字符循环#include<reg51.h>#include<absacc.h>#defineucharunsignedchar/*字形口*/#definePORTAXBYTE[0xffdc]/*字位口*/#definePORTBXBYTE[0xffdd]/*延时1MS子程序*/voidmsce(unsignedintx){unsignedcharj;while((x--)!=0){for(j=0;j<60;j++);}}main(){ucharrr,i;for(;;){rr=0x01;/*从最右一位开始*/for(i=0;i<6;i++){PORTA=0x80;/*输出字形代码*/PORTB=rr;/*输出字位代码*/msce(150);/*调延时子程序*/rr=rr<<1;/*循环左移一位*/}}★

“8”字符循环演示的C-51程序#include<reg51.h>

★C-51程序

#include<reg51.h>main(){inti;unsignedcharxdata*p=0x2000;/*指针指向2000H单元*/for(i=0;i<256;i++)/*清零2000H-20FFH单元*/{*p=0;p++;}

}例2.清零程序(将2000H—20FFH的内容清零)★汇编语言程序

ORG0000HSE01:MOVR0,#00HMOVDPTR,#2000H;(0000H)送DPTRLOO1:CLRAMOVX@DPTR,A;0送(DPTR)INCDPTR;DPTR+1INCR0;字节数加1CJNER0,#00H,LOO1;不到FF个字节再清LOOP:SJMPLOOP★C-51程序例2.清零程序(将2000H—2例3.拆字程序(将2000H的内容拆开,高位送2001H低位,低位送2002H低位)★汇编语言程序

ORG0000HSE02:MOVDPTR,#2000HMOVXA,@DPTRMOVB,A;(2000)→A→BSWAPA;交换

ANLA,#0FH;屏敝高位

INCDPTRMOVX@DPTR,A;送2001HINCDPTRMOVA,BANLA,#0FH;(2000)内容屏敝高位

MOVX@DPTR,A;送2002HSJMP$例3.拆字程序★拆字C-51程序#include<reg51.h>main(){unsignedcharxdata*p=0x2000;/*指针指向2000H单元*/

/*2002H单元高4位清零,低4位装2000H单元低4位*/*(p+2)=(*p)&0x0f;/*2001H单元高4位清零,低4位装2000H单元高4位*/*(p+1)=(*p)>>4;}★拆字C-51程序★汇编语言程序

ORG0000HL00:MOVR0,#10H;查找16个字节

MOVR1,#00HMOVDPTR,#2000HL11:MOVXA,@DPTRCJNEA,#00H,L16;取出内容与00H相等吗?INCR1;取出个数加1L16:INCDPTRDJNZR0,L11;未完继续

MOVDPTR,#2100HMOVA,R1MOVX@DPTR,A;相同数个数送2100HL1E:SJMPL1E例4.查找零的个数(在2000H--200FH中查出有几个字节是零,把个数放在2100H单元中)★汇编语言程序例4.查找零的个数(在2000H--200F★查找零的个数C-51程序#include<reg51.h>main(){unsignedcharxdata*p=0x2000;/*指针p指向2000H单元*/intn=0,i;for(i=0;i<16;i++){if(*p==0)n++;/*若该单元内容为零,则n+1*/p++;/*指针指向下一单元*/}p=0x2100;/*指针p指向2100H单元*/*p=n;/*把个数放在2100H单元中*/}★查找零的个数C-51程序★汇编程序

ORG0000HMOVA,R3MOVB,R7MULAB;R3*R7XCHA,R7;R7=(R3*R7)低字节

MOVR5,B;R5=(R3*R7)高字节

MOVB,R2MULAB;R2*R7ADDA,R5MOVR4,ACLRAADDCA,BMOVR5,A;R5=(R2*R7)高字节

MOVA,R6MOVB,R3MULAB;R3*R6

ADDA,R4XCHA,BADDCA,R5MOVR5,AMOVPSW.5,C;存CYMOVA,R2MULAB;R2*R6ADDA,R5MOVR5,ACLRAMOVACC.0,CMOVC,PSW.5;加上次加法的位

ADDCA,BMOVR4,AJMP$例5.双字节无符号整数快速乘法★汇编程序ADDA,R4例5.双字节无符号整数快速乘法★C-51程序#include<reg51.h>main(){unsignedintxdata*p1=0x2000;/*双字节被乘数在2000H单元*/unsignedintxdata*p2=0x2002;/*双字节乘数在2002H单元*/unsignedlongxdata*p3=0x2010;/*4字节乘积放在2010H单元*/*p3=(*p1)*(*p2);}★C-51程序例6.工业顺序控制C-51程序#include<reg51.h>sbitP1_7=0x97;/*定义P1.7口地址*/unsignedcharTT;voidDelay(unsignedintvalue)/*延时子程序*/{while(value!=0)value--;}voidSerint1()interrupt2/*中断服务程序--暂停并报警*/{inti;TT=P1;/*保护现场*/P1=0x7f;/*关输出*/while(!INT1)/*若故障未消除,则报警*/{for(i=0;i<0xa0;i++)/*给蜂鸣器发震荡脉冲*/{P1_7=1;Delay(50);P1_7=0;Delay(50);}P1_7=0;Delay(6550);}P1=TT;/*恢复现场*/}例6.工业顺序控制C-51程序main(){IE=0x84;/*CPU开中断,INT1开中断*/while(T0==0);/*等待P3.4变高*/for(;;){P1=0xfe;Delay(60000);/*工序1*/P1=0xfd;Delay(60000);/*工序2*/P1=0xfb;Delay(60000);/*工序3*/P1=0xf7;Delay(60000);/*工序4*/P1=0xef;Delay(60000);/*工序5*/P1=0xdf;Delay(60000);/*工序6*/P1=0x8f;Delay(60000);/*工序7*/}}(续前)main()(续前)例7.电脑时钟(用定时器产生0.1秒定时中断,对时钟计数器计数并送数码管显示)★C-51程序#include<reg51.h>#include<absacc.h>#defineucharunsignedchar#defineLEDwpXBYTE[0xffdc]#defineLEDwbXBYTE[0xffdd]ucharcodetable[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};ucharhour=1,min=23,sec=45,m=0,n,i;/*给时钟赋初值*/ucharxdata*p;voidDelay(unsignedintvalue)/*延时子程序*/{while(value!=0)value--;}

例7.电脑时钟voidTrans(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;/*秒的个位*/}voidShow(void)/*循环显示子程序*/{for(;;){Trans();LEDwb=n=0x20;for(i=0;i<6;i++){LEDwp=table[*(p+i)];LEDwb=n;Delay(100);n=n>>1;}}}voidTrans(void)

/*中断服务子程序(0.1秒中断一次)*/

voidtime()interrupt1{m++;TH0=0x3c;TL0=0xb7;/*给T0赋计数初值*/if(m==10){sec=sec+1;m=0;}}main(){p=0x2000;TMOD=0X01;/*T/C0工作在定时器方式1*/TH0=0x3c;TL0=0xb7;/*给T0赋计数初值*/EA=1;/*CPU开中断*/TR0=1;/*启动T/C0开始定时*/ET0=1;/*T/C0开中断*/Show();}/*中断服务子程序(0.1秒中断一次)*/第六讲:C-51程序设计本讲重点:

C-51的数据类型和存储类型;指针和中断的使用;通过实例消化理解C-51的编程方法;尝试将实验课中的ASM-51程序转为C-51程序.第六讲:C-51程序设计本讲重点:C语言作为一种非常方便的语言而得到广泛的支持,C语言程序本身不依赖于机器硬件系统,基本上不作修改就可将程序从不同的单片机中移植过来。C提供了很多数学函数并支持浮点运算,开发效率高,故可缩短开发时间,增加程序可读性和可维护性。

㈠C-51简介C语言作为一种非常方便的语言而得到广泛的支持,㈠C-51简C-51与ASM-51相比,有如下优点:1.

对单片机的指令系统不要求了解,仅要求对8051的存贮器结构有初步了解;2.

寄存器分配、不同存贮器的寻址及数据类型等细节可由编译器管理;3.

程序有规范的结构,可分成不同的函数,这种方式可使程序结构化;4.

具有将可变的选择与特殊操作组合在一起的能力,改善了程序的可读性;5.

提供的库包含许多标准子程序,具有较强的数据处理能力;6.

由于具有方便的模块化编程技术,使已编好程序可容量地植入新程序;C-51与ASM-51相比,有如下优点:㈢C-51的数据类型常用的数据类型有:㈡C-51的程序结构

与一般C语言的结构相同,以main()函数为程序人口,程序体中包含若干语句还可以包含若干函数。位型

字符型

整型

长整型

浮点型bit

char

int

longint

float1位

1字节

2字节

4字节

4字节数组型

指针型㈢C-51的数据类型㈡C-51的程序结构数组型㈣C-51数据的存储类型名存储空间位置长度数据范围

data直接寻址片内RAM8位0~255bdata可位寻址片内RAM1位0/1idata间接寻址片内RAM8位0~255xdata片外RAM16位0~65535㈤C-51的包含的头文件通常有:reg51.hmath.hctype.hstdio.hstdlib.habsacc.h常用有:reg51.h(定义特殊功能寄存器和位寄存器);

math.h(定义常用数学运算);㈣C-51数据的存储类型名存储空间位置㈥C-51的运算符与C语言基本相同:+-*/(加减乘除)>>=<<=(大于大于等于小于小于等于)==!=(测试等于测试不等于)&&||!(逻辑与逻辑或逻辑非)>><<(位右移位左移)&|(按位与按位或)^~(按位异或按位取反)㈥C-51的运算符㈦C-51的基本语句与标准C语言基本相同:

if选择语言

switch/case

多分支选择语言

while

循环语言

do-while循环语言

for

循环语言㈦C-51的基本语句与标准C语言基本相同:㈧实例ORG0000HMOVR0,#0DCH;指向字形口MOVA,#80H ;确定字形代码MOVX@R0,A ;输出字形代码MOVR1,#0DDH;指向字位口MOVA,#20H ;从最高位开始LEDO:

MOVX@R1,A ;输出字位代码MOVR2,#18H ;确定延时常数ACALLDEYS ;调延时子程序RLA ;右移一位SJMPLEDO ;循环演示;

延时子程序DEYS:PUSH02HDEY0:PUSH02HDEY1:PUSH02HDJNZR2,$POP02HDJNZR2,DEY1POP02HDJNZR2,DEY0POP02HDJNZR2,DEYSRETEND例1.“8”字符循环演示(字形口为DCH;字位口为DDH)★汇编语言程序㈧实例ORG0000H;延时子程序例1.“8”字符循环#include<reg51.h>#include<absacc.h>#defineucharunsignedchar/*字形口*/#definePORTAXBYTE[0xffdc]/*字位口*/#definePORTBXBYTE[0xffdd]/*延时1MS子程序*/voidmsce(unsignedintx){unsignedcharj;while((x--)!=0){for(j=0;j<60;j++);}}main(){ucharrr,i;for(;;){rr=0x01;/*从最右一位开始*/for(i=0;i<6;i++){PORTA=0x80;/*输出字形代码*/PORTB=rr;/*输出字位代码*/msce(150);/*调延时子程序*/rr=rr<<1;/*循环左移一位*/}}★

“8”字符循环演示的C-51程序#include<reg51.h>

★C-51程序

#include<reg51.h>main(){inti;unsignedcharxdata*p=0x2000;/*指针指向2000H单元*/for(i=0;i<256;i++)/*清零2000H-20FFH单元*/{*p=0;p++;}

}例2.清零程序(将2000H—20FFH的内容清零)★汇编语言程序

ORG0000HSE01:MOVR0,#00HMOVDPTR,#2000H;(0000H)送DPTRLOO1:CLRAMOVX@DPTR,A;0送(DPTR)INCDPTR;DPTR+1INCR0;字节数加1CJNER0,#00H,LOO1;不到FF个字节再清LOOP:SJMPLOOP★C-51程序例2.清零程序(将2000H—2例3.拆字程序(将2000H的内容拆开,高位送2001H低位,低位送2002H低位)★汇编语言程序

ORG0000HSE02:MOVDPTR,#2000HMOVXA,@DPTRMOVB,A;(2000)→A→BSWAPA;交换

ANLA,#0FH;屏敝高位

INCDPTRMOVX@DPTR,A;送2001HINCDPTRMOVA,BANLA,#0FH;(2000)内容屏敝高位

MOVX@DPTR,A;送2002HSJMP$例3.拆字程序★拆字C-51程序#include<reg51.h>main(){unsignedcharxdata*p=0x2000;/*指针指向2000H单元*/

/*2002H单元高4位清零,低4位装2000H单元低4位*/*(p+2)=(*p)&0x0f;/*2001H单元高4位清零,低4位装2000H单元高4位*/*(p+1)=(*p)>>4;}★拆字C-51程序★汇编语言程序

ORG0000HL00:MOVR0,#10H;查找16个字节

MOVR1,#00HMOVDPTR,#2000HL11:MOVXA,@DPTRCJNEA,#00H,L16;取出内容与00H相等吗?INCR1;取出个数加1L16:INCDPTRDJNZR0,L11;未完继续

MOVDPTR,#2100HMOVA,R1MOVX@DPTR,A;相同数个数送2100HL1E:SJMPL1E例4.查找零的个数(在2000H--200FH中查出有几个字节是零,把个数放在2100H单元中)★汇编语言程序例4.查找零的个数(在2000H--200F★查找零的个数C-51程序#include<reg51.h>main(){unsignedcharxdata*p=0x2000;/*指针p指向2000H单元*/intn=0,i;for(i=0;i<16;i++){if(*p==0)n++;/*若该单元内容为零,则n+1*/p++;/*指针指向下一单元*/}p=0x2100;/*指针p指向2100H单元*/*p=n;/*把个数放在2100H单元中*/}★查找零的个数C-51程序★汇编程序

ORG0000HMOVA,R3MOVB,R7MULAB;R3*R7XCHA,R7;R7=(R3*R7)低字节

MOVR5,B;R5=(R3*R7)高字节

MOVB,R2MULAB;R2*R7ADDA,R5MOVR4,ACLRAADDCA,BMOVR5,A;R5=(R2*R7)高字节

MOVA,R6MOVB,R3MULAB;R3*R6

ADDA,R4XCHA,BADDCA,R5MOVR5,AMOVPSW.5,C;存CYMOVA,R2MULAB;R2*R6ADDA,R5MOVR5,ACLRAMOVACC.0,CMOVC,PSW.5;加上次加法的位

ADDCA,BMOVR4,AJMP$例5.双字节无符号整数快速乘法★汇编程序ADDA,R4例5.双字节无符号整数快速乘法★C-51程序#include<reg51.h>main(){unsignedintxdata*p1=0x2000;/*双字节被乘数在2000H单元*/unsignedintxdata*p2=0x2002;/*双字节乘数在2002H单元*/unsignedlongxdata*p3=0x2010;/*4字节乘积放在2010H单元*/*p3=(*p1)*(*p2);}★C-51程序例6.工业顺序控制C-51程序#include<reg51.h>sbitP1_7=0x97;/*定义P1.7口地址*/unsignedcharTT;voidDelay(unsignedintvalue)/*延时子程序*/{while(value!=0)value--;}voidSerint1()interrupt2/*中断服务程序--暂停并报警*/{inti;TT=P1;/*保护现场*/P1=0x7f;/*关输出*/while(!INT1)/*若故障未消除,则报警*/{for(i=0;i<0xa0;i++)/*给蜂鸣器发震荡脉冲*/{P1_7=1;Delay(50);P1_7=0;Delay(50);}P1_7=0;Delay(6550);}P1=TT;/*恢复现场*/}例6.工业顺序控制C-51程序main(){IE=0x84;/*CPU开中断,INT1开中断*/while(T0==0);/*等待P3.4变高*/for(;;){P1=0xfe;Delay(60000);/*工序1*/P1=0xfd;Delay(60000);/*工序2*/P1=0xfb;Delay(60000);/*工序3*/P1=0xf7;Delay(60000);/*工序4*/P1=0xef;Delay(60000);/*工序5*/P1=0xdf;De

温馨提示

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

最新文档

评论

0/150

提交评论