初学C51者应注意的地方

发布者:灵感之翼最新更新时间:2023-01-03 来源: zhihu关键字:初学  C51  误区 手机看文章 扫描二维码
随时随地手机看文章

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

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文件的内部函数和变量,外部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文件,使用<>*/
#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者应注意的地方

上一篇:Keil软件的安装及Keil C51和Keil MDK兼容配置
下一篇:C51单片机指针实例

推荐阅读最新更新时间:2024-11-12 09:18

bit 和sbit的区别
bit和sbit都是C51扩展的变量类型。 bit和int char之类的差不多,只不过char=8位, bit=1位而已。都是变量,编译器在编译过程中分配地址。除非你指定,否则这个地址是随机的。这个地址是整个可寻址空间,RAM+FLASH+扩展空间。bit只有0和1两种值,意义有点像Windows下VC中的BOOL。 sbit是对应可位寻址空间的一个位,可位寻址区:20H~2FH。一旦用了sbi xxx = REGE^6这样的定义,这个sbit量就确定地址了。sbit大部分是用在寄存器中的,方便对寄存器的某位进行操作的。
[单片机]
C51-全双工串行通信
全双工串行通信
[单片机]
C51-全双工串行通信
Keil软件的安装及Keil C51和Keil MDK兼容配置
最近很多学员碰到了一个keil安装的问题。 学习51单片机,用的是Keil C51版本开发,做STM32项目的时候,又要用KeIl MDK版本开发。 那如何配置,可以让C51和MDK 兼容呢? 首先我们,先了解一下 Keil C51 和Keil MDK的区别: Keil C51: 支持绝大部分8051内核的微控制器开发工具。 Keil MDK: MDK主要适用于ARM内核的单片机,支持ARM7,ARM9,Cortex-M4/M3/M1,Cortex-R0/R3/R4等,软件内的数据库包含了很多厂商的芯片。 Keil C51 和MDK是同一个公司开发的, 理论上它们不能相互兼容 。 不过, 我们无际单片机编程研究了一种方法,
[单片机]
UPS应用中的误区及过电压防护
本文结合实际,针对UPS应用当中的过电压防护需求,提出适当的解决方案。    1.过电压防护概念的变化   当远处发生雷击时,雷电浪涌通过电网或通讯线路传输到设备端,虽然不一定立即损毁设备,也会对设备内部造成累计性损害。另外,随着经济的快速发展,设备遭受来自线路上的其它浪涌干扰(例如各种动力设备启动运行时对电网所带来的操作过电压现象)的可能性也很高,其对设备的影响可能更大。   因此,再简单直观地认定“没有雷电就不需要过电压防护”,显然是不正确的。可以说,目前的过电压防护工作已经由传统的防雷转向直击雷、雷电电磁脉冲、地电位反击和操作过电压的综合防护。    2.UPS应用中的“防雷”误区   2.1误区之一:“
[电源管理]
C51: 2块 24C02 的读写
/*/函数功能, 向U2写入12345,向U3写入67890,再分别读出, 在 LCD1602 显示 */ #include reg51.h #include intrins.h //变量声明 #define uchar unsigned char #define uint unsigned int //延时 1ms void delayms() { uchar i; for(i=0;i 250;i++); for(i=0;i 80;i++); } void delaynms(uint s) { uint tem; for(tem=0;tem s;tem++) { delayms(); } }
[单片机]
<font color='red'>C51</font>: 2块 24C02 的读写
c51 单片机中断函数
以串口中断为例: 如: void serial() interrupt 4 { } 和 void serial_uart() interrupt 4 { } 两个函数的功能都是定义串口中断函数。函数名字不一样不重要,重要的是函数名字后面的interrupt 4(中断向量表地址)要正确。
[单片机]
三种常用的CRC16校验算法的C51程序的优化
CRC校验又称为循环冗余校验,是数据通讯中常用的一种校验算法。它可以有效的判别出数据在传输过程中是否发生了错误,从而保障了传输的数据可靠性。 CRC校验有多种方式,如:CRC8、CRC16、CRC32等等。在实际使用中,我们经常使用CRC16校验。CRC16校验也有多种,如:1005多项式、1021多项式(CRC-ITU)等。在这里我们不讨论CRC算法是怎样产生的,而是重点落在几种算法的C51程序的优化上。 计算CRC校验时,最常用的计算方式有三种:查表、计算、查表+计算。一般来说,查表法最快,但是需要较大的空间存放表格;计算法最慢,但是代码最简洁、占用空间最小;而在既要求速度,空间又比较紧张时常用查表+计算法
[单片机]
C51——STC89C51RC单片机的基本特性
STC89C51RC单机是STC公司推出的新一代高速、低功耗、超强抗干扰的单片机,指令代码完全兼容传统的8051单片机,12时钟/机器周期和6时钟/机器周期可以任意选择。其中HD版本和90C版本内部集成了MAX810专用复位电路。该电路在6MHz时可以稳定工作,如果系统工作在12Mhz或以上,建议使用外部RC上电复位电路。 主要特点有: 1. 指令代码完全兼容传统8051单片机; 2. 工作电压范围:3.3V - 5.5V; 3. 工作频率范围:0 - 40MHz,实际工作频率可以达到48MHz; 4. 用户应用存储空间:8KB Flalsh 5. 片上RAM资源:512B 6. GPIO数量:35个 7. 程序下载方式:Rx
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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