来源 CEPARK网站http://www.cepark.com/Index.html 作者: hnrain
这里讲述一些初学者学习C51的一些误区和注意事项。高手的特别应用不包括在内。
1)C忌讳绝对定位。
8Z7v9}s9k$N Fh40185常看见初学者要求使用_at_,这是一种谬误,把C当作ASM看待了。在C中变量的定位是编译器的事情,初学者只要定义变量和变量的作电子园51单片机学习网6~v e.Ko3q#Gg j
用域,编译器就把一个固定地址给这个变量。怎么取得这个变量的地址?要用指针。比如unsigned char data x;后,x的地址就是&x,
]9D-@KwI]'ha z40185你只要查看这个参数,就可以在程序中知道具体的地址了。所以俺一看见要使用绝对定位的人,第一印象就是:这大概是个初学者。
M ~Akl^.YF401852)设置SP的问题。
,_&c1[?&\$J+y'I0R"}40185原因和1差不对,编译器在把所有变量和缓冲区赋予地址后,自动把最后一个字节开始的地方,作为SP的开始位置,所以初学者是不必
-FB:V FwIz40185要去理会的。这体现C的优越性,很多事情C编译时候做了。
a*}E*T|l,e0?8X401853)用C的主程序结构:电子园51单片机学习网Q+Nu/i'X(? y
#include <reg52.h>
^wf|r:A2p40185void main(void)电子园51单片机学习网 Rj V,vhM6CY/e
{电子园51单片机学习网Ob](Cp B6[u
while(1);电子园51单片机学习网 N:Hk.m.y&K}2]
}
Ky(UF0xaD40185这是个最小的成功的C程序,包括头部文件和程序主体。电子园51单片机学习网!e yiO1[F
头部文件的名词解释:引用的外部资源文件,这个文件包括了硬件信息和外部模块提供的可使用的函数和变量的说明。可以用文本方
5KKl/Z!Sx M:i6M^40185式打开reg52.h,仔细研究下,会有一些写程序的体会。电子园51单片机学习网jZ2H+r7b}
4)这样构成一个C项目电子园51单片机学习网"WG^0EzQ
在C中,常用项目来管理。项目一般分为两大块:C文件块和头部文件块。电子园51单片机学习网-_y6qlI;~
我们常把不同功能写在不同的C文件中,依靠项目的管理,最后把所有文件连接起来,这样就可以得到可以烧录的HEX文件或BIN文件。电子园51单片机学习网\}y2MR[`
这些C文件中,有且只有唯一一个包括main()函数,和3)中一样的C文件。电子园51单片机学习网?(SS6c0shj:r
用头部文件把各个不同的C互相连接起来。一个C文件基本上要对应有一个H头部文件,这个H文件就包含本C文件中可以提供给外面使
!U5SU"I%L5OT W9c40185用的变量和函数,没有在H文件中列出的文件,可以算是该C文件的内部函数和变量,外部C不能使用。电子园51单片机学习网-xQZ ?V#n)z QX6Bx!Q
例子:a.C:电子园51单片机学习网 |Wwc/i7m
unsigned char i;电子园51单片机学习网'B7K"^y E CHI0q
unsigned char mWork;电子园51单片机学习网y,bCQ%PB
void Test1(void)
nklV"s)d q"jT40185{电子园51单片机学习网A,]/I DJ#\(r7Qt?
mWork++;
-@i2kOi5L6FwH40185}
8@f$Wdj+Kgg | V40185void Test2(void)
.C9lX)d"N`b |_40185{电子园51单片机学习网 g.yi/p._*o8f"k|
i++;电子园51单片机学习网!l'|&e6Y5fV
}电子园51单片机学习网S*MZF l8};Eb(u
a.h文件中:
4e:u8_2S3d'~5~/Bn[[40185extern unsigned char i;
BT JjX@`U40185extern void Test1(void);电子园51单片机学习网2Ck$]0e7u5vtq7PG6J
这样主程序M.c中:
m.b8E?Rd)XX;j7k40185#include <reg52.h> /*C编译器内部自带的H文件,使用<>*/电子园51单片机学习网WHB C#K0Xmv
#include "a.h" /*自定义的H文件,一般用""*/电子园51单片机学习网 f2\B4m%i|3l
void main(void)
f{8D;I`)m_X40185{电子园51单片机学习网F ?1C2{/_k c
Test1(); /*使用a.c模块文件中的函数*/
s9O)i&i_"F y;L1Ui40185while(1){
${D IB\\ I3S)z40185i++; /*使用a.c模块文件中的变量*/电子园51单片机学习网4Nz#NnQ Ar
}
ob0a`3oQ2Yd'U40185}
l|9@/O+`9f401855)51家族
C D ^Vq40185核心都是基于8031的,有很多在此核心上进行扩展,有的把程序存储器放在内部:89c(S)51..,有的增加了RAM:89c(S)52..,有的增加
f3s"P`4t-C40185了一些专用硬件80C552...,有的改变时钟时序W77E58...。市面上现在常用的主要有ATMEL公司的AT89X系列,PHILIPS的P87(89)x,台
6~\b%[i1d\9{ n40185湾WINBOND的w77(78)x系列,Cygnal的C8051Fx系列。电子园51单片机学习网(q?#Hl6@,cR&B!msR
6)51单片机结构的C描述电子园51单片机学习网G5QPv?K
这里不讲51的具体结构,只是引导初学者快速理解51单片机的物理结构。寄存器和IO及其它硬件设备的地址名称,在相应的C头部文件电子园51单片机学习网K \wh\e"{ Q
中可以找到。51为reg51.h,52为reg52.h,以次类推,比如winbond的78E58就为w78e58.h这些H文件中的描述:电子园51单片机学习网h Ok/KO%i;Y;?6]X#s
srf,定义一个8位的设备。电子园51单片机学习网^7@})l/o#q'Z*v
srf16,定义一个16位的设备。电子园51单片机学习网_[_OS9LO;Vh
sbit,定义一个位的设备。
]1c;H+gfk.Q40185用这些语句定义后,就可以在C中象汇编一样使用这些硬件设备,这是单片机应用比标准C特殊的地方,其它差别很少。电子园51单片机学习网Eq3t aR
7)在51系列中data,idata,xdata,pdata的区别电子园51单片机学习网0U+f$rD)E {I+mf
data:固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小。
)SD7LYY'qb40185idata:固定指前面0x00-0xff的256个RAM,其中前128和data的128完全相同,只是因为访问的方式不同。idata是用类似C中的指针方式
J6?9Q%] Q\ L40185访问的。汇编中的语句为:mox ACC,@Rx.(不重要的补充:c中idata做指针式的访问效果很好)电子园51单片机学习网Sb-N,U)|VU5U
xdata:外部扩展RAM,一般指外部0x0000-0xffff空间,用DPTR访问。
)m!M}w Xz*tm ~N40185pdata:外部扩展RAM的低256个字节,地址出现在A0-A7的上时读写,用movx ACC,@Rx读写。这个比较特殊,而且C51好象有对此BUG,
(f'd$sT(uj*_*K/_40185建议少用。但也有他的优点,具体用法属于中级问题,这里不提。
%a8D.tm p]3Jo5|401858)startup.a51的作用
.sy-Y GX40185和汇编一样,在C中定义的那些变量和数组的初始化就在startup.a51中进行,如果你在定义全局变量时带有数值,如unsigned char电子园51单片机学习网;j-?^;{O"Mz[
data xxx="100";,那startup.a51中就会有相关的赋值。如果没有=100,startup.a51就会把他清0。(startup.a51==变量的初始化)。
kPc{~3`+Zg!p40185这些初始化完毕后,还会设置SP指针。对非变量区域,如堆栈区,将不会有赋值或清零动作。
?"B6y/a(roL*~*@X40185有人喜欢改startup.a51,为了满足自己一些想当然的爱好,这是不必要的,有可能错误的。比如掉电保护的时候想保存一些变量,
$~%Km AN m8eJ40185但改startup.a51来实现是很笨的方法,实际只要利用非变量区域的特性,定义一个指针变量指向堆栈低部:0xff处就可实现。,
%v'z7B^&H\3`2T AX X.|40185为什么还要去改?
m}/i @P V;RT_+rp40185可以这么说:任何时候都可以不需要改startup.a51,如果你明白它的特性。电子园51单片机学习网S0`yf3ai+A I.Q
文章评论(0条评论)
登录后参与讨论