`
superhj1987
  • 浏览: 205727 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

C51的一些误区和注意事项

阅读更多

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不能使用。 
例子:
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 /*C编译器内部自带的H文件,使用<>*/ #include "a.h" /*自定义的H文件,一般用""*/ 
void main(void) { 
Test1(); /*使用a.c模块文件中的函数*/ 
while(1){ 
i++; /*使用a.c模块文件中的变量*/ 
} 
}

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文件中的描述: 
srf,定义一个8位的设备。 
srf16,定义一个16位的设备。 
sbit,定义一个位的设备。 
用这些语句定义后,就可以在C中象汇编一样使用这些硬件设备,这是单片机应用比标准C特殊的地方,其它差别很少。

7)在51系列中data,idata,xdata,pdata的区别 
data:固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小。 
idata:固定指前面0x00-0xff的256个RAM,其中前128和data的128完全相同,只是因为访问的方式不同。idata是用类似C中的指针方式访问的。汇编中的语句为:mox ACC,@Rx.(不重要的补充:c中idata做指针式的访问效果很好) 
xdata:外部扩展RAM,一般指外部0x0000-0xffff空间,用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就会把他清0。(startup.a51==变量的初始化)。 这些初始化完毕后,还会设置SP指针。对非变量区域,如堆栈区,将不会有赋值或清零动作。 有人喜欢改startup.a51,为了满足自己一些想当然的爱好,这是不必要的,有可能错误的。比如掉电保护的时候想保存一些变量, 但改startup.a51来实现是很笨的方法,实际只要利用非变量区域的特性,定义一个指针变量指向堆栈低部:0xff处就可实现。, 为什么还要去改? 可以这么说:任何时候都可以不需要改startup.a51,如果你明白它的特性。

分享到:
评论

相关推荐

    C51单片机一些误区和注意事项

    ### C51单片机误区与注意事项详解 #### 一、C51单片机的绝对定位误区 在C51编程中,很多初学者容易陷入一个误区——使用`_at_`这样的语法来实现变量的绝对定位。实际上,这种做法并不推荐。C语言本身的设计理念...

    C51单片机的一些误区和注意事项

    ### C51单片机的学习误区与注意事项详解 #### 一、C51单片机绝对定位误区 在学习C51单片机的过程中,一个常见的误区是试图使用`_at_`这样的关键字来实现绝对定位。实际上,在C语言中,变量的定位是由编译器自动...

    分析C51单片机的一些误区和注意事项.pdf

    C51单片机的编程误区和注意事项 C51单片机,基于经典的8051架构,至今仍然是嵌入式系统领域内非常重要的微控制器之一。由于C51单片机在硬件上与传统的8051系列有所不同,一些初学者在编程时常常会陷入误区。本文将...

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

    "初学者学习C51的一些误区和注意事项" 本文旨在为初学者学习C51提供一些误区和注意事项的指南,帮助初学者避免常见的错误和提高编程效率。 1.忌讳绝对定位 在C51编程中,初学者经常犯的一个错误就是使用_at_来...

    新手必看,C51的一些误区和注意事项

    【C51编程误区与注意事项】C51是专为51系列单片机设计的C语言编译器,新手在学习过程中容易陷入一些误区,本文将对此进行详细阐述。 首先,C51编程中避免绝对定位。新手常尝试使用_at_来指定变量的内存位置,但这是...

    分析C51单片机的一些误区和注意事项

    在学习和使用C51编程时,初学者可能会遇到一些常见误区和需要注意的事项。以下是对这些要点的详细解释: 1) **避免绝对定位误区**:在C语言中,变量的内存分配由编译器自动处理,不需要像汇编语言那样使用_at_进行...

    单片机初学者学习C51时的一些误区和注意事项

    在学习C51编程的过程中,初学者常常会遇到一些误区和需要注意的事项。首先,对于“C忌讳绝对定位”的概念,初学者可能会误解C语言的内存管理和汇编语言的区别。在C语言中,使用_at_声明变量的绝对地址是不必要的,...

    C语言编程技巧、优化的文章

    主要是一些有关C编程技巧,优化...学习C51的一些误区和注意事项.doc 编程修养.pdf C源程序优化.doc 51单片机C编程变的简单.pdf C语言的规范.doc EmbededC.pdf C源程序常见错误分析.htm volatile作用.doc linux内存.pdf

    C语言编程自我总结.doc

    #### 二、中断处理注意事项 - **中断程序编写**: - **使用using语句**:在编写中断程序时,应明确指定寄存器组(第1、2、3组),避免与`main()`函数发生冲突。 - **寄存器组管理**:不同优先级的中断可以使用...

    初学者编程最简练的指导

    本文档旨在指导初学者学习C51的编程,避免一些常见的误区和注意事项,不包括高手的特别应用。 一、忌讳绝对定位 在C语言中,变量的定位是编译器的事情,初学者只要定义变量和变量的作用域,编译器就把一个固定地址...

Global site tag (gtag.js) - Google Analytics