80C51上的C言语编程 C51的特征:
(1)学习过C言语的同学在对单片机有了根本了解之后,就能够开端试着写一两个根据单片机的C言语的程序了。C51言语承继了ANSI C 的绝大部分的特性,根本的语法相同,同学们上手会比较快。可是,由于C51言语是对硬件进行操控的编程言语,其自身又在硬件结构上有所扩展以增强C言语对硬件的操控,如关键字sbit,data,code等(后边会讲他们是做什么的)。
(2)由于单片机不是咱们平常用的计算机,他的英文名为MCU(微操控器),特色体现在这个“微”字。因此,它里边的硬件资源是十分少的,所以你在写程序的时分就要留意对RAM(存储数据)和ROM(存储程序)的运用。说白了,便是也程序的时分要尽量精简,如各种算法,不要让体系担负太大。少用浮点运算,能够运用unsigned的无符号型数据,就不要运用有符号的(当你写程序时,你会发现许多方位都用的unsigned,不像咱们在ANSI C里边不同,不太留意,C51里边就十分留意资源的操控)。防止乘除,多用移位运算(写走马灯程序时,会运用到,很有意思,不是咱们幻想的用循环操控)。
根本的特性了解之后,咱们来讲下,详细的东西:
首要,是C51针对硬件操控添加的一些关键字,数据类型。
(1)bit : 和咱们平常用的int,char相同,只不过int是两个字节(16位,16bit),char是单字节(8位,8bit),bit便是一位,取值规模是0和1,相似windows编程里的BOOL。
(2)sbit : sbit是对应可位寻址空间的一个位,可位寻址区:20H~2FH。一旦用了sbit xxx = REGE^6这样的界说(例如,sibt a = P0^0,界说P0口的第0位为变量a,此刻对a赋值0或许1时,便是在对P0口的第0位进行操控,赋低电平或高电平),这个sbit量就确认地址了。(sbit大部分是用在特别功用寄存器中的,便利对寄存器的某位进行操作的。)
(3)sfr:用于界说特别功用寄存器(8位的)(在程序中会写头文件#include,在Keil中右键点击翻开reg51.h,就能够看到许多sfr的界说),如sfr P0 = 0x80,就界说了端口P0。
(4)sfr16:同上用于16位的
其次,C51还供给了对8051一切存储区的拜访。
8051芯片的存储区从逻辑上分为内部数据存储区,外部数据存储区和程序存储区(表里一致编址)。
80C51有4KB的内部程序存储区(片内ROM)(0000H~0FFFH),其间前43单元有特别用途,0000H~0002H无条件跳转,0003H~002AH用于寄存中止程序(中止程序这儿不解说)
256B的内部数据存储区(片内RAM),分为低128B和高128B,有不同效果(可见硬件资源有多小了吧,所以咱们要节约运用),低128B又分为为作业寄存器区,又称通用寄存器(00H~1FH),位寻址区(20H~2FH,之前的sbit便是对应位寻址空间中的一位),数据缓冲区(30H~7FH,这个区域便是给用户用得,没有任何约束,总共80个单位)
高128B为特别功用寄存器(便是上面说的sfr),详细的内容在许多书上面都有。
http://www.mytutorialcafe.com/Microcontroller%20Special%20Function%20Register.htm
给个英文的sfr的解说的网址,不过没必要看,看书就行了。
在这儿讲这么多的原因是由于C51中在对变量进行声明的时分还能够清晰的指定存储空间。关键字有:DATA,IDATA,BDATA(RAM中高128B),CODE等。
(1)DATA指定RAM中低128B,能够在一个机器周期内直接寻址,寻址速度最快,所以应该把常常运用的变量放在DATA区
例如:unsigned char data system_status = 0;
(2)BDATA指定的是RAM中的位寻址区,在这个区域界说的变量能够进行位操作,什么意思呢?举例吧
unsigned char bdata status_byte,这儿界说变量status_byte,是一个单字节(8位)的数据变量,咱们能够对这个变量中的一位进行置0或置1的操作。咱们把 status_byte=0x00,即变量里边的8位都置为了0,前面讲过一个sbit,用于位寻址区域中的一位,sbit a = status_byte^2;a = 1,表明把变量 status_byte的第2方位为了1(0,1,2,3,4,5,6,7共八位),所以变量 status_byte就等于了0x02;
(3)CODE 程序存储区,他里边的内容是不变的,咱们要运用的一些固定数据存于这个里边就不必占用RAM的空间了,比方咱们学习数码管显现程序时,数码管上面的每一个数字都对应一个16进制的数字,咱们能够把它存到程序存储区中去,例如:
unsigned char code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
关于特别功用寄存器sfr的运用,咱们以一个简略的程序为例,在80C51芯片的P0^0上接上一个发光二极管LED,一个电阻RES和一个电源VCC,三者串联,电流方向是从电源流向P0^0口。给80C51接上电源,接地,晶振,复位电路。假如运用proteus仿真,则这些电路不必接。
在Keil软件中写程序
#include
sbit a = P0^0;
void main(){
a = 0;
while(1);
}
由于芯片刚刚上电,P0管束为高电位,咱们在程序中把它置为0;电流就能够流过LED,所以LED灯就会发光。并用while(1)让程序停在这儿。
一个最简略的单片机C言语程序就写完了。讲了这么多期望同学们了解,C51对C言语的扩展有所了解,知道能够经过C言语对硬件进行操控,学会常用的关键字。