世界俱乐部杯赛

C51 单片机使用避坑指南:误区与注意事项全解析

出处:网络整理 发布于:2025-07-09 10:30:49

在学习和使用 C51 的过程中,初学者往往会陷入一些误区,同时也需要注意一些关键要点。下面将详细分析 C51 单片机的常见误区和相关注意事项。

误区一:C 忌讳定位


很多初学者常要求使用_at_,这其实是把 C 语言当作汇编语言(ASM)看待的一种谬误。在 C 语言里,变量的定位是编译器的工作。初学者只需定义变量及其作用域,编译器就会为变量分配一个固定地址。若要获取变量的地址,需使用指针。例如,定义unsigned char data x;后,x的地址就是&x,通过查看这个参数,就能在程序中知晓具体地址。所以,一旦看到有人要使用定位,印象大概率就是初学者。

误区二:设置 SP 的问题


这与个误区的原因类似。编译器在为所有变量和缓冲区分配地址后,会自动将一个字节开始的地方作为栈指针(SP)的起始位置,因此初学者无需操心此事。这正体现了 C 语言的优越性,许多工作在编译时就已完成。

正确的 C 主程序结构


一个的成功 C 程序结构如下:


c#include <reg52.h> void main(void) {

    while(1); } 


这里的头部文件是引用的外部资源文件,包含硬件信息以及外部模块提供的可用函数和变量说明。可以用文本方式打开reg52.h仔细研究,会对写程序有所启发。

构成 C 项目的方法


在 C 语言中,常用项目来管理程序。项目一般分为 C 文件块和头部文件块两大部分。通常会把不同功能写在不同的 C 文件中,依据项目管理规则,将所有文件连接起来,就能得到可烧录的 HEX 文件或 BIN 文件。这些 C 文件中,有且仅有一个包含main()函数,就像上述示例中的 C 文件。通过头部文件将各个不同的 C 文件连接起来。一个 C 文件基本上要对应一个 H 头部文件,该 H 文件包含本 C 文件中可供外部使用的变量和函数,未在 H 文件中列出的则是 C 文件的内部函数和变量,外部 C 文件无法使用。

51 家族单片机


51 家族单片机均基于 8031,在此基础上有很多扩展。有的将程序放在内部,如 89c (S) 51;有的增加了 RAM,如 89c (S) 52;有的增加了一些专用硬件,如 80C552;有的改变了时钟时序,如 W77E58。市面上常用的主要有 ATMEL 公司的 AT89X 系列、PHILIPS 的 P87 (89) x、台湾 WINBD 的 w77 (78) x 系列、Cygnal 的 C8051Fx 系列。
[此处插入 51 家族单片机的图片]

51 单片机结构的 C 描述


这里不详细阐述 51 单片机的具体结构,主要引导初学者快速理解其物理结构。和 IO 及其它硬件设备的地址名称,可在相应的 C 头部文件中找到。例如,51 对应reg51.h,52 对应reg52.h,以此类推,如 winbond 的 78E58 对应w78e58.h。这些头部文件中有如下描述:


  • sfr:用于定义一个 8 位的设备。
  • sfr16:用于定义一个 16 位的设备。
  • sbit:用于定义一个位的设备。
    使用这些语句定义后,就可在 C 语言中像汇编一样使用这些硬件设备,这是单片机应用相较于标准 C 语言的特殊之处,其它差别较小。

data、idata、xdata、pdata 的区别


  • data:固定指前面 0x00 - 0x7f 的 128 个 RAM,可以用累加器(acc)直接读写,速度快,生成的代码也。
  • idata:固定指前面 0x00 - 0xff 的 256 个 RAM,其中前 128 个与 data 的 128 个完全相同,只是访问方式不同。idata 是用类似 C 语言中的指针方式访问的,汇编语句为mov ACC, @Rx
  • xdata:外部扩展 RAM,一般指外部 0x0000 - 0xffff 空间,用数据指针(DPTR)访问。
  • pdata:外部扩展 RAM 的低 256 个字节,地址出现在 A0 - A7 上时进行读写,用movx ACC, @Rx读写。不过,C51 似乎存在对此的一些问题,建议少用,但它也有优点,具体用法属于中级问题,这里暂不提及。

startup.a51 的作用


和汇编语言一样,在 C 语言中定义的变量和数组的初始化在startup.a51中完成。若在定义全局变量时带有数值,如unsigned char data xxx = 100;startup.a51中就会有相关赋值;若没有赋值,startup.a51会将其清零。初始化完成后,还会设置 SP 指针。对于非变量区域,如堆栈区,不会进行赋值或清零操作。有人喜欢修改startup.a51以满足一些想法,但这是不必要且可能出错的。例如,在掉电保护时想保存一些变量,可利用非变量区域的特性,定义一个指针变量指向堆栈底部 0xff 处来实现,而无需修改startup.a51。实际上,只要明白其特性,任何时候都无需修改startup.a51

关键词:C51 单片机  

版权与免责声明

凡本网注明“出处:维库电子市场网”的所有作品,版权均属于维库电子市场网,转载请必须注明维库电子市场网,//trbgizp.cn,违反者本网将追究相关法律责任。

本网转载并注明自其它出处的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品出处,并自负版权等法律责任。

如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。

OEM清单文件: OEM清单文件
*公司名:
*联系人:
*手机号码:
QQ:
有效期:

扫码下载APP,
 一键连接广大的电子世界。

在线人工客服

买家服务:
卖家服务:
技术客服:

0571-85317607

网站技术支持

13606545031

客服在线时间周一至周五
 9:00-17:30

关注官方微信号,
第一时间获取资讯。

建议反馈

联系人:

联系方式:

按住滑块,拖拽到最右边
>>
感谢您向阿库提出的宝贵意见,您的参与是维库提升服务的动力!意见一经采纳,将有感恩红包奉上哦!