原创 转帖 c51的一些误区

2008-1-22 11:30 3024 10 11 分类: MCU/ 嵌入式

 


 


 


1)C忌讳绝对定位。 常看见初学者要求使用_at_,这是一种谬误,把C当作ASM看待了。在C中变量
的定位是编译器的事情,初学者只要定义变量和变量的作用域,编译器就把一个固定地址给这个
变量。怎么取得这个变量的地址?要用指针。比如unsigned char data x;后,x的地址就是
&x, 你只要查看这个参数,就可以在程序中知道具体的地址了。所以俺一看见要使用绝对定位的
人,第一印象就是:这大概是个初学者。

2)设置SP的问题。 原因和1差不对,编译器在把所有变量和缓冲区赋予地址后,自动把最后一
个字节开始的地方,作为SP的开始位置,所以初学者是不必 要去理会的。这体现C的优越性,很
多事情C编译时候做了。

3)用C的主程序结构: #i nclude <reg52.h> 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中:
#i nclude <reg52.h> /*C编译器内部自带的H文件,使用<>*/ #i nclude "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,如果你明白它的特性。

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户42640 2008-3-31 14:55

讨厌的广告,全删了,郁闷

用户1053025 2006-9-25 17:03

什么链接?视频?似乎我们现在还不支持。不好意思啦:D
相关推荐阅读
用户42640 2012-03-28 09:28
评论:@小野兽的小草窝 博客中提到的“【博客 大赛】虚焊,你伤不起~~”
这个确实很重要,不起眼的问题会折腾人很久 ...
用户42640 2010-11-05 14:14
怎样用Realview MDK生成bin文件?
怎样用Realview MDK生成bin文件?       使用RVCT的fromelf.exe工具进行转换。也就是说首先将源文件编译链接成*.axf的文件,然后使用fromelf.exe工具将*....
用户42640 2010-10-28 21:35
新塘M051中文技术参考手册
  今天无意中在网上看到的,这个要比研讨会上光盘上提供的那个中文版详细很多,看了一下,就是英文手册的完整翻译版 需要的朋友可以到这里下载:http://www.wang1jin.com/bbs/vie...
用户42640 2010-10-26 16:50
保护三极管基础
这次出现的问题是使用了ULN2003,由于直接用它的输入级接入模块的输入端,因此出现了问题。 由于电缆上存在分布电感和分布电容,因此很容易出现耦合,在ISO7637的实验中,存在高频脉冲250V,20...
用户42640 2010-08-10 09:04
广岛无冤魂
1945年8月6日,美国的B-29“空中堡垒”轰炸机向日本广岛投下代号为”男孩”(Boy)的原子弹,实施了人类首次核轰炸。 总听到有些人(尤其是中国人)说,战争是日本军国主义者全面发动的,日本人民是受...
用户42640 2010-07-15 16:59
RT-Thread学习笔记--- 初步认识RT-Thread
最近对RT-Thread很感兴趣,准备学习一下,硬件使用安富莱开发板2.0。软件使用keil MDK   RT-Thread的目录结构 其中Bsp是针对各个具体的平台,可以认为是用户代码。为了方...
我要评论
1
10
关闭 站长推荐上一条 /3 下一条