c51点亮第一盏灯

  • C51语言VS标准C语言

1)库函数不同。例如,在标准C中,库函数printf和scanf,常用于屏幕打印和接收字符,而在C51语言中,主要用于串行口数据的收发。

2)数据类型有一定区别。在C51中增加几种8051单片机的数据类型,在标准C的基础上又扩展了4种类型。例如,8051单片机包含位操作空间和丰富的位操作指令,因此,C51语言与标准C语言相比增加了位类型。

3)C51语言变量存储模式与标准C语言中变量存储模式数据不一样。标准C最初是为通用计算机设计的,在通用计算机中只有一个程序和数据统一寻址的内存空间,而C51语言中变量的存储模式与8051单片机的各种存储器区紧密相关。

4)数据存储类型不同。8051存储区可分为内部数据存储区、外部数据存储区以及程序存储区。

   内部数据存储区可分为3个不同的C51存储类型:data、idata和bdata。

   外部数据存储区分为2个不同的C51存储类型:xdata和pdata。

   程序存储区只能读不能写,可能在8051内部或者在外部,C51语言提供的code存储类型用来访问程序存储区。

5)标准C语言没有处理单片机中断的定义,而C51语言中有专门的中断函数。

6)头文件不同。C51语言头文件必须把8051单片机内部的外设硬件资源(如定时器、中断、I/O等)相应的特殊功能寄存器写入到头文件内,而标准C不用。

7)程序结构的差异。由于8051单片机的硬件资源有限,它的编译系统不允许太多的程序嵌套。其次,标准C语言所具备的递归特性不被C51语言支持。

二、C51数据类型

C51的扩展数据类型

  1)位变量bit的值可以是1(true),也可是0(false)。

2)特殊功能寄存器sfr。8051单片机的特殊功能寄存器分布在片内数据存储区的地址单元80H~FFH之间,“sfr”数据类型占用一个内存单元。利用它可访问8051单片机内部的所有特殊功能寄存器。

   例如:sfr P1=0x90这一语句定义了P1端口在片内的寄存器,在程序后续的语句中可以用“P1=0xff”,使P1的所有引脚输出为高电平的语句来操作特殊功能寄存器。

3)特殊功能寄存器sfr16。

 “sfr16”数据类型占用两个内存单元,用于操作占两个字节的特殊功能寄存器。例如:“sfr16 DPTR=0x82”语句定义了片内16位数据指针寄存器DPTR,其低8位字节地址为82H,高8位字节地址为83H。在程序的后续语句中就可对DPTR进行操作。

4)特殊功能位sbit。

   sbit是指AT89S51片内特殊功能寄存器的可寻址位。例如:

    sfr PSW=0xd0; //定义PSW寄存器地址为0xd0

sbit OV=PSW^2; //定义OV位为PSW.2

   符号“^”前是特殊功能寄存器名字,“^”后的数字定义特殊功能寄存器可寻址位在寄存器中的位置,取值必须是0~7。

三、 _at_ 关键字

关键字 _at_ 可对指定的存储器空间的绝对地址访问,格式如下:

[存储器类型] 数据类型说明符 变量名 _at_ 地址常数

其中,存储器类型为C51能识别的数据类型;数据类型为C51支持的数据类型;地址常数用于指定变量的绝对地址,必须位于有效的存储器空间之内;使用 _at_ 定义的变量必须为全局变量。

例:使用关键字 _at_ 实现绝对地址的访问

void  main(void)

{   

data unsigned char y1 _at_ 0x50; //在data区定义字节变量y1,地址为50H

    xdata unsigned int y2 _at_ 0x4000;//在xdata区定义字变量y2,地址为4000H

    y1=0xff;

    y2=0x1234;

     while(1);

}

  • 点亮第一个LED

#include <reg51.h>

Sbit  LED1 = P1^0; //定义端口号

Void delay()

{

While(i--); //粗略延时

}

Void  main() //循环亮灭

{

While(1)

{

LED1 = 1;

Delay(100);//延时

LED1 = 0;

}

}

 

猜你喜欢

转载自blog.csdn.net/rd1996/article/details/81215333