返回传动网首页
  论坛首页 → 技术交流 → [转帖]注意C51的一些误区
发表新的主题 发起新的投票 发起新的交易 发起新的任务 回复话题
标题:[转帖]注意C51的一些误区
思念秋天的风
等级:传动小工
权限:普通用户
积分:125
金钱:164
声望:3
经验:32
发帖数:31
注册时间:2007-11-6
收藏 编辑 删除 楼主

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不能使用。 例子: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直接读写的AD7418ARM[/URL],速度最快,生成的代码也最小。 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,如果你明白它的特性。

2008-1-5 17:11:24IP: 保密
gyang
等级:助理工程师
权限:版主
积分:3387
金钱:3096
声望:3
经验:2277
发帖数:2206
注册时间:2007-6-7
编辑 删除 引用 第2楼
比较全面了,楼主辛苦了。
更多深度资料,请点击http://www.chuandong.com/blog/u/590/index.html
2008-1-5 21:30:01IP:保密
缘来如此
等级:中级技工
权限:普通用户
积分:877
金钱:811
声望:6
经验:547
发帖数:545
注册时间:2007-12-24
编辑 删除 引用 第3楼

学习了,辛苦

2008-1-6 19:30:32IP:保密
killinggod
等级:初级技工
权限:普通用户
积分:458
金钱:439
声望:5
经验:270
发帖数:270
注册时间:2007-6-1
编辑 删除 引用 第4楼

什么是C51?

 

2008-1-7 0:22:51IP:保密
10245653
等级:试工
权限:普通用户
积分:270
金钱:284
声望:5
经验:144
发帖数:144
注册时间:2007-12-6
编辑 删除 引用 第5楼
C51其实是一个芯片组代号,NVIDIA方面推出的新一代AMD平台显卡集成芯片组,其中包括了主板最重要的核心-北桥与南桥芯片,该芯片组一共由4个芯片组成,分别是作为北桥的Geforce 6100、Geforce 6150,以及作为南桥的nForce 430和nForce 410,它们的不同组合而构成了种种主板规格配置,这些集成显卡的芯片组市场定位为初级入门市场以及办公领域。与以往低性能集成显卡不同,有三点区别组成了其成功因素:

第一,NVIDIA的新款集成芯片组首先得在TSMC的工厂里加工成90nm的工艺;先进的技术工艺保证了芯片的低成本和低热功耗,稳定、安静是最直接的体会。

第二,GeForce 6150和GeForce 6100型IGP是第一波上市并同时支持DirectX 9和Shader Model 3.0显卡核心的集成芯片组,你购买的很多独立的显卡,如果只Shader Model 2.0,那么玩游戏的时候你将看不到很多特效。

第三,集成芯片组支持NVIDIA公司高保真音效(Azalia标准)的产品,这是组成家庭影院级效果的保证。
2008-1-7 12:01:18IP:保密
lyh-1215
等级:中级技工
权限:普通用户
积分:835
金钱:775
声望:4
经验:557
发帖数:555
注册时间:2007-10-29
编辑 删除 引用 第6楼
原来C51其实是一个芯片组代号。我还想问来着
飞过天空,我才知道,这里不仅有自由,也有孤单。
2008-1-7 13:35:11IP:保密
 快速回复
  • 支持UBB,HTML标签

  • 高级回复
  • 内容

    操作选项: 加精 解精 奖惩 设专题 设公告 解公告 固顶 总固顶 解固顶 结帖 解结帖 锁帖 解锁 移帖 删帖

    网站简介|会员服务|有奖调查|广告业务|联系方式|帮助信息|本站招聘|版权信息|法律声明
    版权所有 © 2006-2008 传动网(ChuanDong.com) 最佳分辨率1024x768
    粤ICP许可证05100281号 经营许可证编号:粤B2-20060497