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

发布者:张延强最新更新时间:2013-05-30 来源: 21ic关键字:初学者  C51  误区 手机看文章 扫描二维码
随时随地手机看文章

这里讲述一些初学者学习C51的一些误区和注意事项。高手的特别应用不包括在内。

1)C忌讳绝对定位。

常看见初学者要求使用_at_,这是一种谬误,把C当作ASM看待了。在C中变量的定位是编译器的事情,初学者只要定义变量和变量的作

用域,编译器就把一个固定地址给这个变量。怎么取得这个变量的地址?要用指针。比如unsigned char data x;后,x的地址就是&x,

你只要查看这个参数,就可以在程序中知道具体的地址了。所以俺一看见要使用绝对定位的人,第一印象就是:这大概是个初学者。

2)设置SP的问题。

原因和1差不对,编译器在把所有变量和缓冲区赋予地址后,自动把最后一个字节开始的地方,作为SP的开始位置,所以初学者是不必

要去理会的。这体现C的优越性,很多事情C编译时候做了。

3)用C的主程序结构:

#include >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);[page]

这样主程序M.c中:

#include >reg52.h< /*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的一些误区和注意事项

上一篇:单片机编程中关于堆栈的一些问题
下一篇:51单片机的中断优先级及中断嵌套

推荐阅读最新更新时间:2024-03-16 13:25

C51在程序设计中的头文件用法
我们在用c语言编程是往往第一行就是reg51.h或者其他的自定义头文件,我们怎么样来理解呢? 1)“文件包含”处理。 程序的第一行是一个“文件包含”处理。 所谓“文件包含”是指一个文件将另外一个文件的内容全部包含进来。程序中包含REG51.h 文件的目的是为了要使用P1 (还有其他更多的符号)这个符号,即通知C 编译器,程序中所写的P1 是指80C51 单片机 的P1 端口而不是其它变量。这是如何做到的呢? 打开reg51.h 可以看到这样的一些内容: (此文件一般在C:\KEIL\C51\INC下 ,INC文件夹根目录里有不少头文件,并且里面还有很多以公司分类的文件夹,里面也都是相关产品的头文件。如果我们要使用自己写的头文件,使
[单片机]
Vicor网络研讨会 最大负载:脉冲功率的误区
报名参加 最大负载:脉冲功率的误区 指定符合脉冲负载峰值要求的电源系统不仅成本高昂,而且还会带来不必要的、又大又重的电源。参加本次网络研讨会,您将了解 Vicor 电源组件如何帮助开发人员利用电源平均技术为脉冲负载的电源系统显著缩减成本与尺寸。 Vicor 中国区技术支持彭煜歆谈到: 为什么常规电源必须调整尺寸才能符合峰值功率要求; 什么是功率平均技术以及这项技术所带来的优势; 如何实施功率平均技术; 支持功率平均技术的电源组件。 参会对象 适用于为脉冲负载或间歇负载设计电源系统的任何人。参加研讨会都将了解使用功率平均技术优化其设计的方法,从而可获得巨大的优势。 本研讨会完全免费,但需报
[电源管理]
MCS51系列单片机软件抗干扰技术中的误区介绍
单片机中存在这样一种广泛流传的误解:在MCS-51系列单片机中,只要用指令使程序从起始地址开始执行,就可以复位单片机,摆脱干扰。通过一个简单的实验,揭示了软件复位的可靠方法。   有的单片机(如8098)有专门的复位指令,某些增强型MCS-51系统单片机虽然没有复位指令,但片内集成了WATCHDOG电路,故抗干扰也不成问题。而普及型MCS-51系列单片机(如8031和8032)既然无复位指令,又不带硬件WATCHDOS,如果没有外接硬件WATCHDOG电路,就必须采用软件抗干扰技术。常用的软件抗干扰技术有:软件陷阱、指令冗余、软件WATCHDOG等,它们的作用是在系统受干扰时能及时发现,再用软件的方法使系统复位。所谓软件复位就是
[单片机]
Keil C51 与 ARM 并存的方法
很多朋友都在想,怎么让keil C51与ARM能够并存使用。有安装经验的朋友都知道,安好C51后再安ARm,C51不能正常工作;安好ARM后再安C51,ARM不能正常工作. 网上也有相关解决办法,不过不怎么样,要么不详细,要么就是复制粘贴。不多说看图片: 第一:先安装C51(必须先安装C51,不能先安装ARM,否则会失败。) iframe id="iframe_0.5839969520457089" src="data:text/html;charset=utf8,%3Cimg%20id=%22img%22%20src=%22http://image55.360doc.com/DownloadImg/2012/10/1720/2
[单片机]
Keil <font color='red'>C51</font> 与 ARM 并存的方法
C51串口的SCON寄存器及工作方式
一,串行口控制寄存器SCON 它用于定义串行口的工作方式及实施接收和发送控制。字节地址为98H,其各位定义如下表: D7 D6 D5 D4 D3 D2 D1 D0 SM0 SM1 SM2 REN TB8 RB8 TI RI SM0、SM1:串行口工作方式选择位,其定义如下: SM0、SM1 工作方式 功能描述 波特率 0 0
[单片机]
c51单片机中断详解--适合初学者
工程图 第一题 **每次亮一个灯的流水灯,定义P1为led1。 外部中断0允许中断:EX0=1;下降沿触发:IT0=1;总开关:EA=1; 中断要执行的是P0引脚的4个二极管闪六次。 其实这里还有个想说的是,IE在中断请求的时候,会置位为1,然后CPU同意并执行中断程序后,IE自动清零。为什么说这个,这个可以在以后的一些情况,作为中断条件。 第二题 每次亮一个灯的流水灯和第一题的一样; 中断0下降沿触发也和第二题一样; 中断0程序是:P1引脚每次亮两个二极管的流水灯 讨论一下:每次亮两个二极管,如果低电平亮,那就要11111100B→11110011B。 个人觉得在中断中使用while造成的后果是很致命的,
[单片机]
<font color='red'>c51</font>单片机中断详解--适合<font color='red'>初学者</font>
keil c51中的变量常量函数的定位
使用KeilC51软件,可以很方便地将代码或者数据绝对定位到某个地址。 1、代码定位: 方法1:使用伪指令CSEG。比如要将MyFunc1定位到代码区C:0x1000,则新建一个A51文件,添加以下内容: PUBLIC MYFUNC1 CSEG AT 1000H MYFUNC1: ;其它代码 RET 在其它源文件中,就可以调用MyFunc()函数了。需要注意的是,编译器不检测传递参数的数目,仅检测函数是否有返回值。 方法2:使用BL51 Locate选项。比如在main.c中定义了一个MyFunc2函数,并且要将该函数定位到代码区C:0x2000,则从菜单中选择Project- Options for Target 'Ta
[单片机]
Keil C51 总线外设操作问题的深入分析
阅读了《单片机与嵌入式系统应用》2005年第10期杂志《经验交流》栏目的一篇文章《Keil C5l对同一端口的连续读取方法》(原文)后,笔者认为该文并未就此问题进行深入准确的分析。文章中提到的两种解决方法并不直接和简单。笔者认为这并非是Keil C51中不能处理对一个端口进行连续读写的问题,而是对Keil C51的使用不够熟悉和设计不够细致的问题,因此特撰写本文。 本文中对原文提到的问题,提出了三种不同于原文的解决方法。每种方法都比原文中提到的方法更直接和简单,设计也更规范。(无意批评,请原文作者见谅) 1 问题回顾和分析 原文中提到:在实际工作中遇到对同一端口反复连续读取,Keil C5l编译并未达到预期的结果。原文作
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved