MCS51-C语言编程_第1页
MCS51-C语言编程_第2页
MCS51-C语言编程_第3页
MCS51-C语言编程_第4页
MCS51-C语言编程_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

1、MCS-51C语言编程* C51C51的程序结构的程序结构* C51C51数据类型数据类型* 存储类型和存储模式存储类型和存储模式* 指针指针* 函数函数* C C语言编程实例语言编程实例C语言* MCS-51MCS-51单片机的单片机的C C语言采用语言采用C51C51编译器编译器( (简称简称C51)C51)C51与ASM51* 对对MSC-51MSC-51的指令系统不要求了解,仅需了解存的指令系统不要求了解,仅需了解存贮器结构贮器结构* 寄存器分配、不同存贮器的寻址及数据类型等寄存器分配、不同存贮器的寻址及数据类型等细节编译器管理细节编译器管理* 提供的库包含许多标准子程序,具有较强的数

2、提供的库包含许多标准子程序,具有较强的数据处理能力据处理能力* 由于具有方便的模块化编程技术,使已编好程由于具有方便的模块化编程技术,使已编好程序可容易地移植序可容易地移植C51程序结构* 同标准同标准C C一样,一样,C51C51的程序由一个个函数组成。的程序由一个个函数组成。函数和汇编语言的函数和汇编语言的“子程序子程序”或或“过程过程 ” ”具具有相同的意义。其中必须有一个主函数有相同的意义。其中必须有一个主函数main()main(),程序的执行从程序的执行从main()main()函数开始,调用其函数开始,调用其 他函他函数后返回主函数数后返回主函数main()main(),最后在主

3、函数中结束,最后在主函数中结束整个程序整个程序C51程序结构全局变量说明全局变量说明 / /* *可被各函数可被各函数引用引用* */ / main() /main() /* *主函主函数数* */ / 局部变量说明局部变量说明 / /* *只在本函数只在本函数引用引用* */ /执行语句执行语句( (包括函数调用语句包括函数调用语句) ) fun1(fun1(形式参数表形式参数表) /) /* *函数函数1 1* */ / 局部变量说明局部变量说明 执行语句执行语句( (包括调用其他函数语句包括调用其他函数语句) ) funn(funn(形式参数表形式参数表) /) /* *函数函数n n*

4、 */ / 局部变量说明局部变量说明 执行语句执行语句 C51数据类型* 常量常量* 在程序运行中其值不变的量在程序运行中其值不变的量* 变量变量* 一个变量由变量名和变量值构成,变量名即是存贮一个变量由变量名和变量值构成,变量名即是存贮单元地址的符号表示,而变量的值就是该单元存放单元地址的符号表示,而变量的值就是该单元存放的内容。定义一个变量,编译系统就会自动为它安的内容。定义一个变量,编译系统就会自动为它安排一个存贮单元,具体的地址值用户不必在意排一个存贮单元,具体的地址值用户不必在意C51数据类型C51C51数据类型数据类型C51语言数据类型类型符号关键字位数表示范围整型有(signed

5、) int16-3276832767(signed) short16-3276832767(signed) long32-21474836482147483647无unsigned int16065535unsigned short int16065535unsigned long 3204294967295实型有float323.4e-383.4e38double641.7e-3081.7e308字符型有char8-128127无unsigned char80255C51数据类型* 位类型位类型bitbit,不能定义位变量指针;也不能定不能定义位变量指针;也不能定义位变量数组义位变量数组*

6、sfr,sfr,特殊功能寄存器。定义特殊功能寄存器。定义80518051单片机的所有单片机的所有内部内部8 8位特殊功能寄存器位特殊功能寄存器* sfr16,16sfr16,16位特殊功能寄存器。定义位特殊功能寄存器。定义80518051单片机单片机内部内部1616位特殊功能寄存器位特殊功能寄存器* sbit sbit 可寻址位。定义可寻址位。定义80518051单片机内部单片机内部RAMRAM中的中的可寻址位或特殊功能寄存器中的可寻址位可寻址位或特殊功能寄存器中的可寻址位变量的存储类型定义举例* char data var1;char data var1;* bit bdata flag;b

7、it bdata flag;* float idata x,y,z;float idata x,y,z;* unsigned int pdata var2;unsigned int pdata var2;* unsigned char xdata var3;unsigned char xdata var3;* sfr SCON=0 x98;sfr SCON=0 x98;* sfr T2=0 xCC;sfr T2=0 xCC;* sbit CY=PSW7;sbit CY=PSW7;* sbit CY=0 xD07;sbit CY=0 xD07;* sbit CY=0 xD7;sbit CY=0

8、xD7;包含文件* C51C51也建立了一个头文件也建立了一个头文件reg51.h (reg51.h (增强型为增强型为reg52.h)reg52.h),在该文件中对所有的特殊功能寄存,在该文件中对所有的特殊功能寄存器的进行了器的进行了sfrsfr定义,定义, 对特殊功能寄存器的有对特殊功能寄存器的有位名称的可寻址位进行了位名称的可寻址位进行了sbitsbit定义,因此,只定义,因此,只要用包含语句要用包含语句#include#include,就可以直,就可以直接引用特殊功能寄存器名,或直接引用位名称接引用特殊功能寄存器名,或直接引用位名称变量定义格式* C51C51中对变量进行定义的格式如下

9、中对变量进行定义的格式如下: : 存储种类存储种类 数据类型数据类型 存储器类型存储器类型 变量名;变量名; 其中其中, “, “存储种类存储种类”和和“存储器类型存储器类型”是可选是可选项。项。 变量的存储种类有四种变量的存储种类有四种: : 自动自动(auto)(auto)、外部、外部(extern)(extern)、静态、静态(static)(static)和寄存器和寄存器(register)(register)。定义变量时省略存储种类选项定义变量时省略存储种类选项, ,则该变量将为则该变量将为自动自动(auto)(auto)变量变量C51的存储类型C51的存储类型存储模式* C51C5

10、1定义变量时如果省略定义变量时如果省略“存储器类型存储器类型”选项选项, , 则按编译时使用的存储器模式则按编译时使用的存储器模式SMALLSMALL、COMPACTCOMPACT或或LARGELARGE来规定默认存储来规定默认存储器类型,确定变量的存储器空间器类型,确定变量的存储器空间, , 函数函数中不能采用寄存器传递的参数变量和过中不能采用寄存器传递的参数变量和过程变量也保存在默认的存储器空间。程变量也保存在默认的存储器空间。 存储模式编译模式存储器类型SMALLSMALLDATADATA,变量被定义在变量被定义在80518051片内数据存储器中片内数据存储器中COMPACTCOMPAC

11、T PDATAPDATA,变量被定义在分页寻址的片外数据存储器中变量被定义在分页寻址的片外数据存储器中, , 每一每一页片外数据存储器的长度为页片外数据存储器的长度为256256字节。这时对变量字节。这时对变量的访问是通过寄存器间接寻址的访问是通过寄存器间接寻址(MOVX Ri)(MOVX Ri)进行进行 ,栈在内部栈在内部RAMRAM中中LARGELARGEXDATAXDATA,变量被定义在片外数据存储器中变量被定义在片外数据存储器中( (最大可达最大可达64K64K字字节节), ), 使用数据指针使用数据指针DPTRDPTR来间接访问变量来间接访问变量(MOVX (MOVX DPTR)DP

12、TR) 指针* 在汇编语言程序中,要取存贮单元在汇编语言程序中,要取存贮单元m m的内容可用直接寻的内容可用直接寻址方式,也可用寄存器间接寻址方式址方式,也可用寄存器间接寻址方式 ,如果用,如果用R1R1寄存寄存器指示器指示m m的地址,用的地址,用R1R1取取m m单元的内容。单元的内容。* 在在C C语言中用变量名表示取变量的值语言中用变量名表示取变量的值( (相当于直接寻址相当于直接寻址) ),也可用另一个变量也可用另一个变量( (如如P)P)存放存放m m的地址,的地址,P P就相当于就相当于R1R1寄寄存器存器 。用。用* *P P取得取得m m单元的内容单元的内容( (相当于汇编的

13、间接寻址相当于汇编的间接寻址方式方式) )这里这里P P即为指针型变量。即为指针型变量。指针定义* MCS-51MCS-51有不同的存贮空间,不同的地址范围,即使对有不同的存贮空间,不同的地址范围,即使对于同一外部数据存贮器,又有用于同一外部数据存贮器,又有用RiRi分页寻址分页寻址(Ri(Ri为八为八位位) )和用和用DPTRDPTR寻址寻址(DPTR(DPTR为十六位为十六位) )两种寻址方式两种寻址方式* 指针本身也是一个变量,有它存放的存贮区和数据长指针本身也是一个变量,有它存放的存贮区和数据长度度* 在指针类型的定义中要说明:被指的变量的数据类型在指针类型的定义中要说明:被指的变量的

14、数据类型和存贮类型;指针变量本身的数据类型和存贮类型;指针变量本身的数据类型( (占几个字节占几个字节) )和存贮类型和存贮类型( (即指针本身存放在什么存贮区即指针本身存放在什么存贮区) )指针定义* 类型定义为类型定义为datadata或或idataidata,表示指针指示内部数据存贮,表示指针指示内部数据存贮器;而器;而pdatapdata表示指针指向外部数据存贮器,用表示指针指向外部数据存贮器,用RiRi间间址,为八位地址址,为八位地址* 类型类型code/xdatacode/xdata表示指针指向外部程序存贮器或外部表示指针指向外部程序存贮器或外部数据存贮器指针,本身数据存贮器指针,

15、本身( (即被指即被指 示地址示地址) )应为十六位长应为十六位长度。度。* 使指针能适用于指向任何存贮空间,则可以定义指针使指针能适用于指向任何存贮空间,则可以定义指针为通用型,此时指针长度为为通用型,此时指针长度为3 3字节,第一字节表示存贮字节,第一字节表示存贮器类型编码,第二、三字节分别表示所指器类型编码,第二、三字节分别表示所指 地址的高位地址的高位和低位和低位存储器类型bdata/ data / idataxdatapdatacode编码0 x000 x010 xfe0 xff指针变量举例*long xdata long xdata * *pxpx; / /* *指针指针pxpx指

16、向指向longlong型型xdataxdata区区( (每个数据占四个单元,指针自身在每个数据占四个单元,指针自身在默认存贮器默认存贮器( (如不指定编译模式在如不指定编译模式在datadata区区) ),指针长度为,指针长度为2 2个字节个字节* */ /*char xdata char xdata * *data pddata pd; / /* *指针指针pdpd指向字符型指向字符型xdataxdata区,自身在区,自身在datadata区,长度区,长度2 2字节字节* */ /*data char xdata data char xdata * *pdpd; / /* *与上例等效与上例

17、等效* */ / *data int data int * *pnpn;( (和和int int * *data pndata pn等效等效) ) / /* *定义一个类型为定义一个类型为intint型的通用型指针,指针自身在型的通用型指针,指针自身在datadata区长度为区长度为3 3字节字节* */ /函数* 库函数库函数 库函数库函数是编译系统为用户设计的一系列标准函是编译系统为用户设计的一系列标准函数数* 用户自定义函数用户自定义函数 用户根据任务编写的函数用户根据任务编写的函数中断* C51C51编译器支持在编译器支持在C C语言程序中直接编写语言程序中直接编写5151单片机的中单

18、片机的中断服务程序,断服务程序,C51C51编译对函数定义进行了扩展,增加了编译对函数定义进行了扩展,增加了一个关键字一个关键字interruptinterrupt,interruptinterrupt是函数定义时的一是函数定义时的一个选项,加上它函数将函数定义成中断服务函数个选项,加上它函数将函数定义成中断服务函数函数类型函数类型函数名函数名( (形式参数表形式参数表) interrupt ) interrupt nusing nnusing n* interrupt interrupt 后面的后面的n n为中断号,为中断号,n n的取值范围为的取值范围为0-310-31,编译器从编译器从8

19、n+38n+3处产生中断向量处产生中断向量中断中断* 中断函数不能进行参数传递,如果中断函数中包含任中断函数不能进行参数传递,如果中断函数中包含任何参数声明都将导致编译出错何参数声明都将导致编译出错* 中断函数没有返回值,如果企图定义一个返回值将得中断函数没有返回值,如果企图定义一个返回值将得到不正确的结果。在定义中断函数时将其定义为到不正确的结果。在定义中断函数时将其定义为voidvoid类型,以明确说明没有返回值类型,以明确说明没有返回值* 在任何情况下都不能直接调用中断函数,否则会产生在任何情况下都不能直接调用中断函数,否则会产生编译错误编译错误* 在中断函数中调用了其它函数,则被调用函

20、数所使用在中断函数中调用了其它函数,则被调用函数所使用的寄存器组必须与中断函数相同的寄存器组必须与中断函数相同中断举例*include include sbit P1_0=P10; sbit P1_0=P10; void timer0 (void) interrupt 1 using 1 /void timer0 (void) interrupt 1 using 1 /* *T0T0中断服务程序入口中断服务程序入口* */ / P1_0 =! P1_0; P1_0 =! P1_0; TH0=-(1000/256); /TH0=-(1000/256); /* *计数初值重装计数初值重装* */

21、/ TL0=-(1000%256); TL0=-(1000%256); void main(void) void main(void) TMOD=0 x01; /TMOD=0 x01; /* *T0T0工作在定时器方式工作在定时器方式1 1* */ / P1_0=0; P1_0=0; TH0=-(1000/256); /TH0=-(1000/256); /* *预置计数初值预置计数初值* */ / TL0=-(1000%256); TL0=-(1000%256); EA=1; /EA=1; /* *CPUCPU开中断开中断* */ / ET0=1; /ET0=1; /* *T0T0开中断开中断

22、* */ / TR0=1; /TR0=1; /* *启动启动T0T0* */ / dodo while(1); while(1); C语言编程实例*完成完成19805198052450324503的编程的编程 *分析:两个乘数比较大,其积更大,采用分析:两个乘数比较大,其积更大,采用unsigned longunsigned long类型,设乘积存放在外类型,设乘积存放在外部数据存贮器部数据存贮器0 0号开始的单元。程序如下:号开始的单元。程序如下: *main() main() * * unsigned long xdata unsigned long xdata * *p; /p; /*

23、*设定指针设定指针p p指向类型为指向类型为unsigned longunsigned long的外部的外部RAMRAM区区* */ / * unsigned long a=19805 unsigned long a=19805; / /* * 设置设置a a为为unsigned longunsigned long类型,并赋初值类型,并赋初值 * */ /* unsigned long b=24503,c; / unsigned long b=24503,c; /* *设置设置b b和积为和积为unsigned longunsigned long类型,并赋初值类型,并赋初值 * */ / *

24、p=0; / p=0; /* *设地址指向设地址指向0 0号单元号单元* */ / * c=a c=a* *b; b; * * *p=c; /p=c; /* *积存入外部积存入外部RAM 0RAM 0号单元号单元* */ / * C语言编程实例* 片内片内RAM 20HRAM 20H单元存放着一个单元存放着一个0 005H05H的数,用查表法,的数,用查表法,求出该数的平方值放入内部求出该数的平方值放入内部RAM 21HRAM 21H单元。单元。 * main()main()* *char x,char x,* *p p *char code tabchar code tab6 6= =0,1

25、,4,90,1,4,9,16,2516,25; ;*p = 0 x20; p = 0 x20; *x = tabx = tab* *p p; ; *p+; p+; * *p=x; p=x; C语言编程实例*片内片内RAMRAM的的20H20H单元存放一个有符号数单元存放一个有符号数x x,函数,函数y y与与x x有如下关系式:有如下关系式: * x xx x0 0 * y= 20H x=0 y= 20H x=0 * x+5 x x+5 x0 0 *设设y y存放于存放于21H21H单元,程序如下单元,程序如下*main()main()* *char x,char x,* *p,p,* *y;

26、y;*p=0 x20; p=0 x20; *y=0 x21; y=0 x21; *for(;)for(;)* *x=x=* *p; p; *if(xif(x0)0)* *y=x; y=x; *if(xif(x0)0)* *y=x+5; y=x+5; *if(x=0)if(x=0)* *y=0 x20; y=0 x20; * * C语言编程实例* 用用P1.0P1.0输出输出1KHz1KHz和和500Hz500Hz的音频信号驱动扬声的音频信号驱动扬声器器, ,作报警信号作报警信号, ,要求要求1KHz1KHz信号响信号响100ms,500Hz100ms,500Hz信号响信号响200ms,200m

27、s,交替进行交替进行,P1.7,P1.7接一开关进行控接一开关进行控制制, ,当开关合上当开关合上, ,响报警信号响报警信号, ,当开关断当开关断KkKk告警告警信号停止信号停止, ,编出程序编出程序. .C语言编程实例*#include*sbit P10=P10;0;*sbit P17=P17;7;*main()main()* *unsigned char i, j;unsigned char i, j;*while(1)while(1)* * while(P17=0) while(P17=0)* *for(i=1;i=150;i+) /for(i=1;i=150;i+) /* *控制音响时

28、间控制音响时间* */ /* P10= P10=P10;P10;*for(j=0;j=50;j+); /for(j=0;j=50;j+); /* *延时完成信号延时完成信号gougou周期时间周期时间* */ /* *for(i=1;i=100;i+) /for(i=1;i=100;i+) /* *控制音响时间控制音响时间* */ /* P10= P10=P10;P10;* for(j=0;j=100;j+); / for(j=0;j=100;j+); /* *延时,完成信号周期时间延时,完成信号周期时间* */ /* * * * C语言编程实例* 在在 下图中下图中8XX518XX51接有五

29、个共阴极数码管的动态显接有五个共阴极数码管的动态显示接口电路,开关打向位置示接口电路,开关打向位置“1”1”时,显示时,显示“12345”12345”字样,当开关打向字样,当开关打向“2”2”时,显示时,显示HELLOHELLO字样字样P1.1P1.789C51P1.0P1.2P1.4P1.3P1.5P1.6P3.0P3.2P3.1P3.3P3.411111373GOEXTAL1XTAL2GNDVccEARST+5V+5VD6D0Q6Q0agg1230P210fC语言编程实例*#include*#define uint unsigned int*#deefine uchar unsigned char*sbitP17=P17;*main ( )*uchar code tab15=0 x86,0 xdb,0 xcf,0 xe6,0 xed ; /*“15”的字形码,因的字形码,因P1.7接的开关,接的开关,最高位送的最高位送的“1”*/ *uchar code tab25=0 xf8,0 xf9,0 xb8,0 xb8,0 x,bf; /*“HELLO”的段码的段码 “1”*/*uchar i;*unit j;*while(1)* * p3=0 x011* for(i=0;i+)* * if(p17=1)P

温馨提示

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

评论

0/150

提交评论