• / 31
  • 下载费用:10 金币  

51单片机C语言编程.ppt

关 键 词:
51单片机C语言编程.ppt
资源描述:
单片机 C51编程一、 C51与标准 C的差异1、库函数不同2、头文件不同3、数据类型有一定区别4、增加了存储模式5、增加了中断函数6、输入、输出不同, C51通过串口进行。二、 C语言与汇编语言 单片机 C语言编程与汇编语言编程的差异:1、用汇编语言编写单片机程序必须要考虑其 存储器结构 ,资源分配是汇编语言编程中的一大负担。而且不同的存储器操作对象寻址方式不同,访问的指令也不同。3、汇编语言编程,子程序调用要考虑现场的保护与恢复,要考虑工作寄存器的分组使用,避免资源冲突。 C语言编译系统自动完成这些工作。如 MOV, MOVC,MOVX访问的空间不同。2、汇编语言中的指令繁多,功能单一。如单片机中大量的转移类指令在 C语言中均由分支程序实现。4、汇编语言编写中的循环程序是通过转移指令重复执行来现实的, C语言则通过循环语句来实现。6、用 C语言编写的单片机应用程序:( 1)所有操作对象都可以看成变量或常量,没有寻址方式( 数据传送由赋值语句实现,所有运算都通过表达式实现 )。( 2)不用像汇编语言那样须具体组织、分配存储器资源和处理端口数据 .( 3)子程序调用时, C语言程序的编译系统自动进行现场的保护。( 5) C语言语法简单,语句紧凑,容易理解和掌握。( 4) 在 C语言编程中,对数据类型与变量的定义, 必须要与单片机的存储结构相关联 ,否则编译器不能正确地映射定位。 5、汇编语言编程中使用大量的算术逻辑运算指令在单片机 C语言编程中全部由相应的运算表达式实现。三、 C51的数据类型数 据 类 型 长 度 大 小unsigned char 1字节 0~ 255char 1字节 -128~ +127unsigned int 2字节 0~ 65535int 2字节 -32768~ +32767unsigned long 4字节 0~ 4294967295long 4字节 -2147483648~ +2147483647float 4字节 ±1.75494E-38 ~ ±3.402823E+38* 1~ 3字节 对象的地址bit 位 0或 1sfr 1字节 0~ 255sfr16 2字节 0~ 65535sbit 位 0或 11、 特殊功能寄存器类型:在 C51中对特殊功能寄存器的访问必须先用 sfr或 sfr16进行声明。sfr P0= 0x80; /*P0口的寄存器地址为 0x80*/两种使用特殊功能寄存器的方法:1)、先定义再使用:2)、包含 51单片机的头文件:#include void main(void){ uchar var1;var1 = P1while(1);} 2、位类型这也是 C51中扩充的数据类型,用于访问 MCS-51单片机中的可寻址的位单元。在 C51中,支持两种位类型: bit型和sbit型。它们在内存中都只占一个二进制位,其值可以是“1”或 “0”。 bit flags; /* 在 bdata区定义一个位变量 */sfr P0= 0x80; /*因 P0口的寄存器是可位寻址的 */sbit P0_0=P0^0; /*所以 P0_0为 P0中的 P0.0引脚 */除了以上定义方式外,还可以用 P0.0的地址去写,如:sbit P0_0=0x80;区别: 用 bit定义的位变量 在 C51编译器编译时,在不同的时候位地址是可以变化的, 而用 sbit定义的位变量 必须与 51单片机的一个可以寻址位单元或可位寻址的字节单元中的某一位联系在一起,在 C51编译器编译时,其对应的位地址是 不可变化的。四、新增存贮类型变量是在程序运行过程中其值可以改变的量。一个变量由两部分组成:变量名和变量值。在 C51中, 变量在使用前必须对变量进行定义,指出变量的数据类型和存储模式 。以便编译系统为它分配相应的存储单元。定义的格式如下:数据类型说明符 [存储器类型 ] 变量名 1[=初值 ],变量名 2[=初值 ]… ;存储器类型 描 述data 直接寻址的片内 RAM低 128B,访问速度快bdata 片内 RAM的可位寻址区( 20H~2FH),允许字节和位混合访问idata 间接寻址访问的片内 RAM,允许访问全部片内RAMpdata 用 Ri间接访问的片外 RAM的低 256Bxdata 用 DPTR间接访问的片外 RAM,允许访问全部 64k片外 RAMcode 程序存储器 ROM 64k空间2、六种存储器类型:【 例 】 变量定义存储种类和存储器类型相关情况。char data varl; /*在片内 RAM低 128B定义用直接寻址方式访问的字符型变量 var1*/int idata var2; /*在片内 RAM256B定义用间接寻址方式访问的整型变量 var2*/unsigned long data var3; /*在片内 RAM128B定义用直接寻址方式访问的自动无符号长整型变量 var3*/float xdata var4; /*在片外 RAM64KB空间定义用间接寻址方式访问的外部实型变量 var4*/int code var5; /*在 ROM空间定义整型变量 var5*/unsign char bdata var6; /*在片内 RAM位寻址区 20H~2FH单元定义可字节处理和位处理的无符号字符型变量 var6*/五、 存储模式C51编译器支持三种存储模式: SMALL模式、 COMPACT模式和 LARGE模式。不同的存储模式对变量默认的存储器类型不一样。( 1) SMALL模式。 SMALL模式称为小编译模式,在 SMA-LL模式下,编译时,函数参数和变量被默认在片内 RAM中,存储器类型为 data。( 2) COMPACT模式。 COMPACT模式称为紧凑编译模式,在 COMPACT模式下,编译时,函数参数和变量被默认在片外 RAM的低 256字节空间,存储器类型为 pdata。( 3) LARGE模式。 LARGE模式称为大编译模式,在LARGE模式下,编译时函数参数和变量被默认在片外 RAM的64K字节空间,存储器类型为 xdata。六、 绝对地址访问1. 使用指针采用指针的方法,可实现在 C51程序中对任意指定的存储器地址进行操作。例如:#define uchar unsigned char#define uint unsigned intvoid test_memory(void) {uchar idata ivar1;uchar xdata *xdp; /*定义一个指向 xdata存储器空间的指针 */char data *dp; /*定义一个指向 data存储器空间的指针 */uchar idata *idp; /*定义一个指向 idata存储器空间的指针 */xdp=0x1000; /*xdata指针赋值,指向 xdata存储器地址 1000H处 */*xdp=0x5A; /*将数据 5AH送到 xdata的 1000H单元 */dp=0x61; /*data指针赋值,指向 data存储器地址 61H处 */*dp=0x23; /*将数据 23H送到 data的 61H单元 */idp= /*idp指向 idata区变量 ivar1*/*idp=0x16; } /*等价于 ivar1=0x16*/2、使用 C51运行库中预定义宏C51编译器提供了一组宏定义来对 51系列单片机的 code、 data、 pdata和 xdata空间进行绝对寻址。规定只能以无符号数方式访问,定义了 8个宏定义,其函数原型如下:#define CBYTE((unsigned char volatile code *) 0 )#define DBYTE((unsigned char volatile 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 )这些函数原型放在 absacc.h文件中。使用时须用预处理命令把该头文件包含到文件中,形式为: #include 。其中: CBYTE以字节形式对 code区寻址,DBYTE以字节形式对 data区寻址,PBYTE以字节形式对 pdata区寻址,XBYTE以字节形式对 xdata区寻址,CWORD以字形式对 code区寻址,DWORD以字形式对 data区寻址,PWORD以字形式对 pdata区寻址,XWORD以字形式对 xdata区寻址。【 例 】 绝对地址对存储单元的访问#include /*将绝对地址头文件包含在文件中 */#include /*将寄存器头文件包含在文件中 */#define uchar unsigned char /*定义符号 uchar为数据类型符 unsigned char*/#define uint unsigned int /*定义符号 uint为数据类型符 unsigned int*/void main(void){ uchar var1;uint var2;var1=XBYTE[0x0002]; /*访问片外 RAM的 0002字节单元 */var2=XWORD[0x0004]; /*访问片外 RAM的 0004~0005单元 */ while(1);} 3、使用 C51扩展关键字 _at_使用 _at_对指定的存储器空间的绝对地址进行访问,一般格式如下:[存储器类型 ] 数据类型 标识符 _at_ 地址常数;其中,存储器类型为 data、 bdata、 idata、 pdata等如省略则按存储模式规定的默认存储器类型确定变量的存储器区域;数据类型为 C51支持的数据类型。地址常数用于指定变量的绝对地址,必须位于有效的存储器空间之内;使用 _at_定义的变量必须为全局变量。【 例 】 通过 _at_实现绝对地址的访问。#define uchar unsigned char /*定义符号 uchar为数据类型符 unsigned char*/#define uint unsigned int /*定义符号 uint为数据类型符 unsigned int*/data uchar x1 _at_ 0x40; /*在 data区中定义字节变量x1,它的地址为 40H*/xdata uint x2 _at_ 0x2000; /*在 xdata区中定义字变量x2,它的地址为 2000H*/void main(void) { x1=0xff;x2=0x1234;while(1);}由于标准 C没有处理单片机中断的定义,由此 C51增加了一个扩展关键字 interrupt。使用 interrupt将一个函数定义成中断服务函数。对于中断服务函数,编译时会自动添加了相应的现场保护、恢复现场等,因而用户在编程时可不必考虑这些问题,减小了编程的繁琐程度。 中断函数一般形式为: viod 函数名 ( ) interrupt n using n interrupt后的 n是中断号, n取值为 0~4,分别对应 5个中断源: 外中断 0、 T0中断、外中断 1、 T1中断 、串行口中断 。using后的 n是中断函数中所采用的工作寄存器组号, n取值0~3,分别对应 通用工作寄存器区:第 0组、第 1组、第 2组、第 3组。using是选项可 省略 。若没有使用 using,中断函数中使用原指定的工作寄存器组,但使用前将其内容保存到堆栈中,返回时复原。4、 C51的中断函数例:使用一个 “ +” 键和一个 “ -” 键来进行数据的的修改,若用 INT0和 INT1作 “ +” 键和 “ -” 键的输入, P1口接一个数码管,显示加、减操作数据的变化信息。系统上电后初始显示数据 0,每按一次加键,加 1显示,加到 9后再按加键自动回 0;每按一次减键,减 1显示,减到 0后再按减键,自动回 9;画出接线电路图,编程实现。 #include#define uchar unsigned char#define uint unsigned int//段码uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x07};//按键计数char Key_Counts=0;sbit AddKey=P3^2;sbit SubKey=P3^3;//延时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_Counts#define uchar unsigned char#define uint unsigned int//段码uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00};sbit BEEP=P3^7;//上次按键和当前按键的序号,该矩阵中序号范围 0~15,// 16表示无按键uchar Pre_KeyNo=16 ,KeyNo=16;//延时void DelayMS(uint x){uchar i;while(x--) for(i=0;i4^0x0f;switch(Tmp) //对 0~3 列分别附加起始值 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;}//关蜂鸣器void Close_Beep(void ){BEEP=0;}//主程序void main( ){P0=0x00;Close_Beep( );while(1)//显示键号void Show_Count_ON_DSY(uchar y ){if(KeyNo16) P0=~DSY_CODE[KeyNo];ELSE P0=~ DSY_CODE[0];}{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( ); }}} }
展开阅读全文
  微传网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
0条评论

还可以输入200字符

暂无评论,赶快抢占沙发吧。

关于本文
本文标题:51单片机C语言编程.ppt
链接地址:https://www.weizhuannet.com/p-11246024.html
微传网是一个办公文档、学习资料下载的在线文档分享平台!

网站资源均来自网络,如有侵权,请联系客服删除!

 网站客服QQ:80879498  会员QQ群:727456886

copyright@ 2018-2028 微传网络工作室版权所有

     经营许可证编号:冀ICP备18006529号-1 ,公安局备案号:13028102000124

收起
展开