您的位置 首页 硬件

初学C51的一些误区和注意事项

1)C忌讳绝对定位常看见初学者要求使用_at_,这是一种谬误,把C当作ASM看待了。在C中变量的定位是编译器的事情,初学者只要定义变量和变量

1) C忌讳肯定定位

常看见初学者要求运用_at_,这是一种过错,把C当作ASM看待了。在C中变量的定位是编译器的工作,初学者只需界说变量和变量的效果域,编译器就把一个固定地址给这个变量。怎样获得这个变量的地址?要用指针。

比方unsigned char data x;后,x的地址便是&x,你只需检查这个参数,就能够在程序中知道详细的地址了。所以俺一看见要运用肯定定位的人,第一印象便是:这大概是个初学者。

2)设置SP的问题

原因和1差不多,编译器把一切变量和缓冲区赋予地址后,主动把最终一个字节开端的当地,作为SP的开端方位,所以初学者是不用要去理睬的。这表现C的优越性,许多工作在C编译的时分做了。

3)用C的主程序结构:

#include

void main(void)

{

while(1);

}

这是个最小的成功的C程序,包括头部文件和程序主体。

头部文件的名词解释:引证的外部资源文件,这个文件包括了硬件信息和外部模块供给的可运用的函数和变量的阐明。能够用文本办法翻开reg52.h,细心研讨下,会有一些写程序的领会。

4)这样构成一个C项目

在C中,常用项目来办理。项目一般分为两大块:C文件块和头部文件块。咱们常把不同功用写在不同的C文件中,依托项目的办理,最终把一切文件连接起来,这样就能够得到能够烧录的HEX文件或BIN文件。这些C文件中,有且只需仅有一个包括main()函数,和3)中相同的C文件。用头部文件把各个不同的C相互连接起来。一个C文件基本上要对应有一个H头部文件,这个H文件就包括本C文件中能够供给给外面运用的变量和函数,没有在H文件中列出的文件,能够算是该C文件的内部函数和变量,外部C不能运用。

比方:

a.C:

unsigned char i;

unsigned char mWork;

void Test1(void)

{

mWork++;

}

void Test2(void)

{

i++;

}

a.h文件中:

extern unsigned char i;

extern void Test1(void);

这样主程序M.c中:

#include

#include “a.h”

void main(void)

{

Test1();

while(1)

{

i++;

}

}

5) 51宗族

中心都是根据8031的,有许多在此中心上进行扩展,有的把程序存储器放在内部:89c(S)51..,有的增加了RAM:89c(S)52..,有的增加了一些专用硬件80C552…,有的改动时钟时序W77E58…。市面上现在常用的主要有ATMEL公司的AT89X系列,PHILIPS的P87(89)x,台湾WINBOND的w77(78)x系列,Cygnal的C8051Fx系列。

6) 51单片机结构的C描绘

这儿不讲51的详细结构,仅仅引导初学者快速了解51单片机的物理结构。寄存器和IO及其它硬件设备的地址称号,在相应的C头部文件中能够找到。51为reg51.h,52为reg52.h,以此类推,比方winbond的78E58就为w78e58.h。这些H文件中的描绘:sfr,界说一个8位的寄存器。sfr16,界说一个16位的寄存器。sbit,界说一个寄存器位。用这些句子界说后,就能够在C中象汇编相同运用这些硬件设备,这是单片机使用比规范C特别的当地,其它不同很少。

7)在51系列中data,idata,xdata,pdata的差异

data:固定指前面0x00-0x7f的128个RAM,能够用acc直接读写的,速度最快,生成的代码也最小。

idata:固定指前面因x00-0xff的256个RAM,其间前128和data的128完全相同,仅仅由于拜访的办法不同。idata是用相似C中的指针办法拜访的。汇编中的句子为:mov ACC,@Rx(不重要的弥补:c中idata做指针式的拜访效果很好)

xdata:外部扩展RAM,一般指外部0x0000-0xffff空间,用DPTR拜访,汇编指令为:movx ACC,@DPTR

pdata:外部扩展RAM的低256个字节,地址出现在A0-A7上时读写,用movx ACC,@Rx读写。这个比较特别,并且C51好象对此有BUG,主张少用。但也有他的长处,详细用法归于中级问题,这儿不提。

8)startup.a51的效果

和汇编相同,在C中界说的那些变量和数组的初始化就在startup.a51中进行,假如你在界说全局变量时带有数值,如unsigned char data xxx=100;,那startup.a51中就会有相关的赋值。假如没有=100,startup.a51就会把他清零。 (startup.a51==变量的初始化)。

这些初始化结束后,还会设置SP指针。对非变量区域,如仓库区,将不会有赋值或清零动作。有人喜爱改startup.a51,为了满意自己一些想当然的喜好,这是不用要的,有或许过错的。比方掉电维护的时分想保存一些变量,但改startup.a51来完成是很笨的办法,实践只需使用非变量区域的特性,界说一个指针变量指向仓库低部:0xff处就可完成。为什么还要去改?能够这么说:任何时分都能够不需要改startup.a51,假如你理解它的特性。

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部