《匠人手记》推荐网上购书渠道:
  互动出版网(china-pub)   >>>
  当当网(dangdang)   >>>
  卓越亚马逊网    >>>
  淘宝网(taobao)   >>>
  更多购书渠道……   >>> 

设为首页加入收藏联系匠人管理入口21IC首页21IC博客21IC社区侃单片机回复的贴参与的贴

天气预报
百宝日历
载入中...

百宝专栏

载入中...
最新货色

载入中...

粉丝评论

载入中...

载入中...



百宝信息

载入中...

百宝流量

(2006-07-01开始)


匠人手记

C51的一些误区和注意事项
程序匠人 发表于 2006-8-1 15:27:00  阅读全文 | 回复(0) | 引用通告 | 编辑

                         C51的一些误区和注意事项 

1)C忌讳绝对定位。 常看见初学者要求使用_at_,这是一种谬误,把C当作ASM看待了。在C中变量
的定位是编译器的事情,初学者只要定义变量和变量的作 用域,编译器就把一个固定地址给这个
变量。怎么取得这个变量的地址?要用指针。比如unsigned char data x;后,x的地址就是
&x, 你只要查看这个参数,就可以在程序中知道具体的地址了。所以俺一看见要使用绝对定位的
人,第一印象就是:这大概是个初学者。

2)设置SP的问题。 原因和1差不对,编译器在把所有变量和缓冲区赋予地址后,自动把最后一
个字节开始的地方,作为SP的开始位置,所以初学者是不必 要去理会的。这体现C的优越性,很
多事情C编译时候做了。 

3)用C的主程序结构: #i nclude <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); 这样主程序M.c中: 
#i nclude <reg52.h> /*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,如果你明白它的特性。

看《匠人手记》,与匠人同行!北航出版,正在热卖!

发表评论:
载入中...

芯片专题

器件专题

软件专题

硬件专题

综合专题

项目专题

原创专题

器件检测
LCD LED
按键 触摸键
E2PROM
电池 电机
电阻 电容 电感

指令系统
软件算法
编程规范
滤波算法
串行通讯

PCB设计
I2C PWM
红外遥控
充电技术
中断 ADC 

匠人手记
匠人夜话
网络心路
一周热点串烧
从零开始玩PIC
DIY旋转时钟

广告5号位 [投放]


学习板、开发板、编程器、下载器、仿真器(查看详情……)

广告3号位 [投放]

站内搜索


站外搜索


百度  google
mp3  歌词 
图片  FLASH 
知道  文档
新闻  词典 
地图  mp3 
软件  天网 
雅虎  爱问 
搜狗  讯雷 
网讯  华军 
天空 

21IC器件搜索
百宝箱分站
  • 《匠人的百宝箱》21IC站
  • 《匠人的百宝箱》21IC笔记团队
  • 《匠人手记》21IC书友会
  • 《匠人的百宝箱》MCUBLOG站
  • 《匠人的百宝箱》MCUBLOG笔记团队
  • 《匠人的百宝箱》EDN站
  • 《匠人手记》EDN书友会
  • 《匠人的百宝箱》与非网站
  • 《匠人的百宝箱》新浪站
  • 《匠人的百宝箱》百度站
  • 《匠人的百宝箱》网易126站
  • 《匠人的百宝箱》网易163站
  • 《匠人的百宝箱》互动出版网站
  • 广告4号位 [投放]

     
     

    匠人原创

    推荐阅读

    往日酷贴

     

    友情连接

     [更多酷站连接]

     

     

     

     

    [欢迎交换连接]

    [百宝箱之与非门分舵]

    [电脑圈圈的家当]

    [IC921的博客]

    [hotpower 的水潭]

    [八楼的呼吸]

    [柔月阁]

    [PIC论坛]

    [SMARTCODE电子书斋]

    [阿摆手记]

    [电子伙伴]

    [xwj的文君阁]

    [所长的BLOG]

    [海边淘沙]

    [单片机开发联盟]

    [数字电视之家]

    [软件开发之窗]

    [unaided的笔记]

    [小飞的笔记]

    [ICC AVR开发网]

    [我爱研发网]

    [infernal的笔记]

    [网址之家]

    [好东西网址大全]

    [美萍中文精选]

    [水牛的仓库]

    [逍遥电子]

    [ningpanda的博客]

    [雄鹰的空中加油站]

    [一网见天下]

    [Armoric]

    [股剩是怎样炼成的]

    [嵌入式365]

    [C-Design]

    [AVR猎手的地盘]

    [中国高校自动化网]

    [SunK]