历史上的今天
返回首页

历史上的今天

今天是:2025年04月07日(星期一)

正在发生

2021年04月07日 | 分析C51单片机的一些误区和注意事项

2021-04-07 来源:eefocus

简介:常看见初学者要求使用_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不能使用。 例子: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文件,使用<>*/ #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,如果你明白它的特性。


推荐阅读

史海拾趣

Alpha Industries公司的发展小趣事

Alpha Industries一直致力于面料的研发与创新。近年来,公司借助电子技术的支持,成功研发出一种智能面料。这种面料具有自动调节温度、防水透气等功能,为士兵提供更为舒适的穿着体验。智能面料的研发不仅提升了Alpha Industries产品的科技含量,也进一步巩固了其在军事服装领域的领先地位。

Foxboro I C T Inc公司的发展小趣事

为了提高生产效率和产品质量,Alpha Industries决定引入数字化生产线。通过与电子设备制造商合作,公司成功建立起一条自动化生产线,实现了从设计到生产的无缝对接。数字化生产线的建立不仅提高了生产效率,还降低了生产成本,使得Alpha Industries的产品更具市场竞争力。

Diamond SA公司的发展小趣事

在电子行业竞争日益激烈的背景下,Diamond SA公司开始寻求通过并购来实现规模扩张和资源整合。他们精心挑选了一些具有潜力的目标企业,通过谈判和交易成功完成了并购。这些并购不仅为Diamond SA公司带来了更多的技术资源和市场份额,还增强了公司的整体竞争力。

厦门法拉(faratronic)公司的发展小趣事

FMI公司始终坚持以客户为中心的发展理念,致力于为客户提供定制化的频率控制解决方案。公司拥有一支专业的研发团队和完善的生产流程,能够根据客户的具体需求进行产品设计和生产。无论是标准产品还是定制产品,FMI都能确保高质量和快速交付。这种灵活的服务模式使得FMI在客户中树立了良好的口碑,并为公司赢得了更多的商业合作机会。

Bussmann (Eaton)公司的发展小趣事

2011年,Bussmann的母公司Cooper集团被EATON集团收购,Bussmann随之成为EATON旗下的一个产品系列。EATON集团作为一家多元化的动力管理企业,在电气和航空航天领域有着深厚的积累。通过整合EATON集团的资源和技术优势,Bussmann得以在更广泛的领域开展业务,并进一步提升其在电路保护领域的竞争力。

Coors Components Inc公司的发展小趣事

在面对激烈的市场竞争时,Coors Components Inc公司果断调整市场策略,将目标市场从高端用户转向中端市场。通过优化产品线、提升服务质量以及加强品牌营销,公司成功吸引了大量中端市场的消费者。这一策略调整不仅使公司的销售额大幅提升,还为其未来的发展奠定了坚实的基础。

问答坊 | AI 解惑

choride 20kva UPS的串口问题

现正做一台CHORIDE 20KVAUPS远程监控,是1997的机子,跟据厂家协议对UPS发命令可就是没反应,接口是232,接235,拨码是SW1(12345ON 678OFF),SW2(12OFF 345678ON) 有哪大哥知道是怎么回事,在这先谢了。 [ 本帖最后由 zhzhiqiang 于 2008-11-26 23: ...…

查看全部问答>

论文

基于FPGA的多路开关稳压电源的设计…

查看全部问答>

寻找负载电路的设计

我有一个电路板,输出为直流24V,3A左右。现在想设计一个电路充当电路板负载的电路,实际应用中的负载为电磁阀和继电器。请教大师们有没有合适的电路推荐或者给点建议,先谢过。…

查看全部问答>

送分100分:冬天电脑开机后,风扇要先响一会,风扇噪声的成因是什么。[

冬天电脑开机后,风扇要先响一会,风扇噪声的成因是什么。 不要告诉我润滑油的原因,我想知道噪声的底层的成因,比如是来自扇片,还是来自转轴,具体又是什么过程产生了噪声。…

查看全部问答>

在哪里能买到很好的网络(PHY)芯片?

在哪里能买到很好的网络(PHY)芯片? 另外, ARM7环境下,哪位大侠有各种网络芯片(PHY)的网速测试结果? 请问什么样的网络芯片(要求是单口的PHY芯片)速度最好?稳定性最高? …

查看全部问答>

关于KEIL的错误提示

我编译完程序后点击错误提示,正常情况下光标会跳到错误行哈,可我点击错误提示后跳出对话框说路径未找到,例如:“F:\\开发\\主程序\\D未能找到”。请教高手这个错误是怎么发生的啊?该如何改正啊?…

查看全部问答>

TCPMP播放视频 很卡

移植了一个tcpmp程序到wince中,可是播放视频很卡,我把片源的清晰度转换到 320*240 就不卡了 ,请问是什么原因,有没有什么方法可以解决此问题,(不能通过转换),谢谢…

查看全部问答>

将S2E例程修改成静态IP不成功!纠结!求坛友帮助!!

        这几天一直在调试S2E这个例程!因为手头没有带DHCP功能的服务器!所以需要将例程修改成静态IP才能运行!!         在bjmonsoon老师的帮助下 知道要修改config,c ...…

查看全部问答>

难得来一次,发一些资料(模拟电路设计)

很久没来,看到EEWORLD发展的这么好,激动啊,呵呵 发一些资料,求一些芯币来搞资料,呵呵。 SOSO,我现在在搞电源芯片的设计。  …

查看全部问答>

LPC17XX USB

大家有没有USB的LPC17XX的详细点说明呀。…

查看全部问答>