您的位置 首页 5G

关于单片机的C言语编程基础知识(初学留意)

80C51上的C语言编程C51的特色:(1)学习过C语言的同学在对单片机有了基本了解之后,就可以开始试着写一两个基于单片机的C语言的程序了。C5

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言语对硬件进行操控,学会常用的关键字。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/5g/262193.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部