51单片机C语言编程.ppt

上传人:wuy****n92 文档编号:70755659 上传时间:2023-01-27 格式:PPT 页数:31 大小:402.50KB
返回 下载 相关 举报
51单片机C语言编程.ppt_第1页
第1页 / 共31页
51单片机C语言编程.ppt_第2页
第2页 / 共31页
点击查看更多>>
资源描述

《51单片机C语言编程.ppt》由会员分享,可在线阅读,更多相关《51单片机C语言编程.ppt(31页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、单片机C51编程一、C51与标准C的差异1、库函数不同2、头文件不同3、数据类型有一定区别4、增加了存储模式5、增加了中断函数6、输入、输出不同,C51通过串口进行。二、C语言与汇编语言 单片机C语言编程与汇编语言编程的差异:1、用汇编语言编写单片机程序必须要考虑其存储器结构,资源分配是汇编语言编程中的一大负担。而且不同的存储器操作对象寻址方式不同,访问的指令也不同。3、汇编语言编程,子程序调用要考虑现场的保护与恢复,要考虑工作寄存器的分组使用,避免资源冲突。C语言编译系统自动完成这些工作。如MOV,MOVC,MOVX访问的空间不同。2、汇编语言中的指令繁多,功能单一。如单片机中大量的转移类指

2、令在C语言中均由分支程序实现。4、汇编语言编写中的循环程序是通过转移指令重复执行来现实的,C语言则通过循环语句来实现。6、用C语言编写的单片机应用程序:(1)所有操作对象都可以看成变量或常量,没有寻址方式(数据传送由赋值语句实现,所有运算都通过表达式实现)。(2)不用像汇编语言那样须具体组织、分配存储器资源和处理端口数据.(3)子程序调用时,C语言程序的编译系统自动进行现场的保护。(5)C语言语法简单,语句紧凑,容易理解和掌握。(4)在C语言编程中,对数据类型与变量的定义,必须要与单片机的存储结构相关联,否则编译器不能正确地映射定位。5、汇编语言编程中使用大量的算术逻辑运算指令在单片机C语言编

3、程中全部由相应的运算表达式实现。三、C51的数据类型数数 据据 类类 型型长长 度度大大 小小unsigned charunsigned char1 1字节字节0 0255255charchar1 1字节字节-128-128+127+127unsigned intunsigned int2 2字节字节0 06553565535intint2 2字节字节-32768-32768+32767+32767unsigned longunsigned long4 4字节字节0 042949672954294967295longlong4 4字节字节-2147483648-2147483648+21474

4、83647+2147483647floatfloat4 4字节字节1.75494E-381.75494E-383.402823E+383.402823E+38*1 13 3字节字节对象的地址对象的地址bitbit位位0 0或或1 1sfrsfr1 1字节字节0 0255255sfr16sfr162 2字节字节0 06553565535sbitsbit位位0 0或或1 1 1 1、特殊功能寄存器类型:特殊功能寄存器类型:在在C51C51中对特殊功能寄存器的访问必须先用中对特殊功能寄存器的访问必须先用sfrsfr或或sfr16sfr16进行声明。进行声明。sfr P0=0 x80;sfr P0=0

5、 x80;/*P0/*P0口的寄存器地址为口的寄存器地址为0 x80*/0 x80*/两种使用特殊功能寄存器的方法:1)、先定义再使用:2)、包含51单片机的头文件:#include void main(void)void main(void)uchar var1;uchar var1;var1=P1=P1 .while(1);while(1);2 2、位类型、位类型 这也是这也是C51C51中扩充的数据类型,用于访问中扩充的数据类型,用于访问MCS-51MCS-51单片机单片机中的可寻址的位单元。在中的可寻址的位单元。在C51C51中,支持两种位类型:中,支持两种位类型:bitbit型和型和

6、sbitsbit型。它们在内存中都只占一个二进制位,其值可以是型。它们在内存中都只占一个二进制位,其值可以是“1 1”或或“0 0”。bit flags;/*bit flags;/*在在bdatabdata区定义一个位变量区定义一个位变量*/*/sfr P0=0 x80;sfr P0=0 x80;/*/*因因P0P0口的寄存器是可位寻址的口的寄存器是可位寻址的*/sbit P0_0=P00;sbit P0_0=P00;/*/*所以所以P0_0P0_0为为P0P0中的中的P0.0P0.0引脚引脚*/除了以上定义方式外,还可以用除了以上定义方式外,还可以用P0.0P0.0的地址去写,如:的地址去写

7、,如:sbit P0_0=0 x80;sbit P0_0=0 x80;区别:区别:用用bitbit定义的位变量定义的位变量在在C51C51编译器编译时,在不同的时编译器编译时,在不同的时候位地址是可以变化的,候位地址是可以变化的,而用而用sbitsbit定义的位变量定义的位变量必须与必须与5151单单片机的一个可以寻址位单元或可位寻址的字节单元中的某一片机的一个可以寻址位单元或可位寻址的字节单元中的某一位联系在一起,在位联系在一起,在C51C51编译器编译时,其对应的位地址是编译器编译时,其对应的位地址是不可不可变化的。变化的。四、新增存贮类型四、新增存贮类型 变量是在程序运行过程中其值可以改

8、变的量。一个变量是在程序运行过程中其值可以改变的量。一个变量由两部分组成:变量名和变量值。变量由两部分组成:变量名和变量值。在在C51C51中,中,变量在使用前必须对变量进行定义,指出变量在使用前必须对变量进行定义,指出变量的数据类型和存储模式变量的数据类型和存储模式。以便编译系统为它分配。以便编译系统为它分配相应的存储单元。定义的格式如下:相应的存储单元。定义的格式如下:数据类型说明符数据类型说明符 存储器类型存储器类型 变量名变量名1=1=初值初值,变量,变量名名2=2=初值初值;存储器类型存储器类型描描 述述 data data直接寻址的片内直接寻址的片内RAMRAM低低128B128B

9、,访问速度快,访问速度快 bdata bdata片内片内RAMRAM的可位寻址区(的可位寻址区(20H2FH20H2FH),允许字节),允许字节和位混合访问和位混合访问 idata idata间接寻址访问的片内间接寻址访问的片内RAMRAM,允许访问全部片内,允许访问全部片内RAMRAM pdata pdata用用RiRi间接访问的片外间接访问的片外RAMRAM的低的低256B256B xdata xdata用用DPTRDPTR间接访问的片外间接访问的片外RAMRAM,允许访问全部,允许访问全部64k64k片外片外RAMRAM code code程序存储器程序存储器ROM 64kROM 64k

10、空间空间2 2、六种存储器类型:、六种存储器类型:【例例】变量定义存储种类和存储器类型相关情况。变量定义存储种类和存储器类型相关情况。char data varlchar data varl;/*/*在片内在片内RAMRAM低低128B128B定义用直接寻址方定义用直接寻址方式访问的字符型变量式访问的字符型变量var1*/var1*/int idata var2 int idata var2;/*/*在片内在片内RAM256BRAM256B定义用间接寻址方式访定义用间接寻址方式访问的整型变量问的整型变量var2*/var2*/unsigned long data var3unsigned lo

11、ng data var3;/*/*在片内在片内RAM128BRAM128B定义用直接寻定义用直接寻址方式访问的自动无符号长整型变量址方式访问的自动无符号长整型变量var3*/var3*/float xdata var4float xdata var4;/*/*在片外在片外RAM64KBRAM64KB空间定义用间接寻空间定义用间接寻址方式访问的外部实型变量址方式访问的外部实型变量var4*/var4*/int code var5 int code var5;/*/*在在ROMROM空间定义整型变量空间定义整型变量var5*/var5*/unsign char bdata var6unsign c

12、har bdata var6;/*/*在片内在片内RAMRAM位寻址区位寻址区20H2FH20H2FH单元定义可字节处理和位处理的无符号字符型变量单元定义可字节处理和位处理的无符号字符型变量var6*/var6*/五、五、存储模式存储模式 C51C51编译器支持三种存储模式:编译器支持三种存储模式:SMALLSMALL模式、模式、COMPACTCOMPACT模式和模式和LARGELARGE模式。不同的存储模式对变量默认的存储器类模式。不同的存储模式对变量默认的存储器类型不一样。型不一样。(1 1)SMALLSMALL模式。模式。SMALLSMALL模式称为小编译模式,在模式称为小编译模式,在S

13、MA-SMA-LLLL模式下,编译时,函数参数和变量被默认在片内模式下,编译时,函数参数和变量被默认在片内RAMRAM中,中,存储器类型为存储器类型为datadata。(2 2)COMPACTCOMPACT模式。模式。COMPACTCOMPACT模式称为紧凑编译模式,模式称为紧凑编译模式,在在COMPACTCOMPACT模式下,编译时,函数参数和变量被默认在片模式下,编译时,函数参数和变量被默认在片外外RAMRAM的低的低256256字节空间,存储器类型为字节空间,存储器类型为pdatapdata。(3 3)LARGELARGE模式。模式。LARGELARGE模式称为大编译模式,在模式称为大编

14、译模式,在LARGELARGE模式下,编译时函数参数和变量被默认在片外模式下,编译时函数参数和变量被默认在片外RAMRAM的的64K64K字节空间,存储器类型为字节空间,存储器类型为xdataxdata。六、六、绝对地址访问绝对地址访问1.1.使用指针使用指针 采用指针的方法,可实现在采用指针的方法,可实现在C51C51程序中对任意指定的存储器地址进程序中对任意指定的存储器地址进行操作。例如:行操作。例如:#define#define uchar uchar unsigned charunsigned char#define#define uintuint unsigned int unsig

15、ned intvoid test_memory(void)void test_memory(void)uchar uchar idata idata ivar1;ivar1;uchar uchar xdataxdata*xdp;/*xdp;/*定义一个指向定义一个指向xdataxdata存储器空间的指针存储器空间的指针*/char char datadata *dp;/*dp;/*定义一个指向定义一个指向datadata存储器空间的指针存储器空间的指针*/uchar uchar idataidata *idp;/*idp;/*定义一个指向定义一个指向idataidata存储器空间的指针存储器空

16、间的指针*/xdp=0 x1000;/*xdp=0 x1000;/*xdataxdata指针赋值,指向指针赋值,指向xdataxdata存储器地址存储器地址1000H1000H处处*/*xdp=0 x5A;/*xdp=0 x5A;/*将数据将数据5AH5AH送到送到xdataxdata的的1000H1000H单元单元*/dp=0 x61;/*data dp=0 x61;/*data指针赋值,指向指针赋值,指向datadata存储器地址存储器地址61H61H处处*/*dp=0 x23;*dp=0 x23;/*/*将数据将数据23H23H送到送到datadata的的61H61H单元单元*/idp=

17、&ivar1;idp=&ivar1;/*idp/*idp指向指向idataidata区变量区变量ivar1*/ivar1*/*idp=0 x16;*idp=0 x16;/*/*等价于等价于ivar1=0 x16*/ivar1=0 x16*/2、使用C51运行库中预定义宏 C51编译器提供了一组宏定义来对51系列单片机的code、data、pdata和xdata空间进行绝对寻址。规定只能以无符号数方式访问,定义了8个宏定义,其函数原型如下:#define CBYTE(unsigned char volatile code*)0)#define DBYTE(unsigned char volati

18、le data*)0)#define PBYTE(unsigned char volatile pdata*)0)#define XBYTE(unsigned char volatile xdata*)0)#define CWORD(unsigned int volatile code*)0)#define DWORD(unsigned int volatile data*)0)#define PWORD(unsigned int volatile pdata*)0)#define XWORD(unsigned int volatile xdata*)0)这些函数原型放在这些函数原型放在abs

19、acc.habsacc.h文件中。使用时须用预处理命令把文件中。使用时须用预处理命令把该头文件包含到文件中,形式为:该头文件包含到文件中,形式为:#include#include 。其中:其中:CBYTECBYTE以字节形式对以字节形式对codecode区寻址,区寻址,DBYTEDBYTE以字节形式对以字节形式对datadata区寻址,区寻址,PBYTEPBYTE以字节形式对以字节形式对pdatapdata区寻址,区寻址,XBYTEXBYTE以字节形式对以字节形式对xdataxdata区寻址,区寻址,CWORDCWORD以字形式对以字形式对codecode区寻址,区寻址,DWORDDWORD以

20、字形式对以字形式对datadata区寻址,区寻址,PWORDPWORD以字形式对以字形式对pdatapdata区寻址,区寻址,XWORDXWORD以字形式对以字形式对xdataxdata区寻址。区寻址。【例例】绝对地址对存储单元的访问绝对地址对存储单元的访问#include /*#include /*将绝对地址头文件包含在文件中将绝对地址头文件包含在文件中*/#include /*#include /*将寄存器头文件包含在文件中将寄存器头文件包含在文件中*/#define uchar unsigned char /*#define uchar unsigned char /*定义符号定义符号u

21、charuchar为数据类为数据类 型符型符unsigned char*/unsigned char*/#define uint unsigned int /*#define uint unsigned int /*定义符号定义符号uintuint为数据类型为数据类型 符符unsigned int*/unsigned int*/void main(void)void main(void)uchar var1;uchar var1;uint var2;uint var2;var1=XBYTE0 x0002;/*var1=XBYTE0 x0002;/*访问片外访问片外RAMRAM的的0002000

22、2字节单元字节单元*/var2=XWORD0 x0004;/*var2=XWORD0 x0004;/*访问片外访问片外RAMRAM的的0004000500040005单元单元*/.while(1);while(1);3 3、使用、使用C51C51扩展关键字扩展关键字_at_at_ 使用使用_at_at_对指定的存储器空间的绝对地址进行访问,对指定的存储器空间的绝对地址进行访问,一般格式如下:一般格式如下:存储器类型存储器类型 数据类型数据类型 标识符标识符 _at_ _at_ 地址常数;地址常数;其中,存储器类型为其中,存储器类型为datadata、bdatabdata、idataidata、

23、pdatapdata等等如省略则按存储模式规定的默认存储器类型确定变量的存如省略则按存储模式规定的默认存储器类型确定变量的存储器区域;储器区域;数据类型为数据类型为C51C51支持的数据类型。地址常数用于指定支持的数据类型。地址常数用于指定变量的绝对地址,必须位于有效的存储器空间之内;变量的绝对地址,必须位于有效的存储器空间之内;使用使用_at_at_定义的变量必须为全局变量。定义的变量必须为全局变量。【例例】通过通过_at_at_实现绝对地址的访问。实现绝对地址的访问。#define uchar unsigned char /*定义符号定义符号uchar为数据类为数据类 型符型符unsign

24、ed char*/#define uint unsigned int /*定义符号定义符号uint为数据类型为数据类型 符符unsigned int*/data uchar x1 _at_ 0 x40;/*在在data区中定义字节变量区中定义字节变量 x1,它的地址为它的地址为40H*/xdata uint x2 _at_ 0 x2000;/*在在xdata区中定义字变量区中定义字变量 x2,它的地址为它的地址为2000H*/void main(void)x1=0 xff;x2=0 x1234;.while(1);由于标准C没有处理单片机中断的定义,由此C51增加了一个扩展关键字interru

25、ptinterrupt。使用interruptinterrupt将一个函数定义成中断服务函数。对于中断服务函数,编译时会自动添加了相应的现场保护、恢复现场等,因而用户在编程时可不必考虑这些问题,减小了编程的繁琐程度。中断函数一般形式为:viod 函数名()interruptinterrupt n n usingusing n n interrupt interrupt后的 n n是中断号,n n取值为04,分别对应5个中断源:外中断0、T0中断、外中断1、T1中断、串行口中断。usingusing后的 n n是中断函数中所采用的工作寄存器组号,n n取值03,分别对应通用工作寄存器区:第0组、

26、第1组、第2组、第3组。usingusing是选项可省略省略。若没有使用usingusing,中断函数中使用原指定的工作寄存器组,但使用前将其内容保存到堆栈中,返回时复原。4 4、C51C51的中断函数的中断函数例:使用一个“+”键和一个“-”键来进行数据的的修改,若用INT0和INT1作“+”键和“-”键的输入,P1口接一个数码管,显示加、减操作数据的变化信息。系统上电后初始显示数据0,每按一次加键,加1显示,加到9后再按加键自动回0;每按一次减键,减1显示,减到0后再按减键,自动回9;画出接线电路图,编程实现。#include#define uchar unsigned char#defi

27、ne uint unsigned int/段码uchar code DSY_CODE=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f,0 x07;/按键计数char Key_Counts=0;sbit AddKey=P32;sbit SubKey=P33;/延时void DelayMS(uint x)uchar i;while(x-)for(i=0;i9)Key_Counts=0;else if(SubKey)DelayMS(10);if(SubKey)while(SubKey);-Key_Counts;if(Key_Co

28、unts0)Key_Counts=9;Show_Counts_ON_DSY(Key_Counts);例:设计单片机与44矩阵键盘接口并驱动一数码管显示的电路,P1口接键盘,P0口接共阴数码管,按数字键(0 9),在数码管上显示相应的键号,按其它键数码管清零,编程实现。#include#define uchar unsigned char#define uint unsigned int/段码uchar code DSY_CODE=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90,0 x88,0 x83,0 xc6,0 xa1

29、,0 x86,0 x8e,0 x00;sbit BEEP=P37;/上次按键和当前按键的序号,该矩阵中序号范围015,/16表示无按键uchar Pre_KeyNo=16,KeyNo=16;/延时void DelayMS(uint x)uchar i;while(x-)for(i=0;i40 x0f;switch(Tmp)/对03 列分别附加起始值0,1,2,3 case 1:KeyNo+=0;break;case 2:KeyNo+=1;break;case 4:KeyNo+=2;break;case 8:KeyNo+=3;/开蜂鸣器void Open_Beep(void)BEEP=1;/关蜂

30、鸣器void Close_Beep(void)BEEP=0;/主程序void main()P0=0 x00;Close_Beep();while(1)/显示键号void Show_Count_ON_DSY(uchar y)if(KeyNo16)P0=DSY_CODEKeyNo;ELSE P0=DSY_CODE0;if(CH_Key()!=0)DelayMS(10);if(CH_Key()!=0)Keys_Scan();/获取键序号 if(Pre_KeyNo!=KeyNo )Show_Count_ON_DSY(KeyNo)Open_Beep();Pre_KeyNo=KeyNo;if(CH_Key()!=0)DelayMS(10);else Close_Beep();

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com