热度 20
2012-5-3 12:46
1495 次阅读|
0 个评论
本文最初由【海东青电子】张平发表于ENDCHINA.COM,转载请保留出处和版权信息,谢谢。 前面谈了单片机的硬件,下面重点说说软件。初学者经常提起的一个问题是:汇编、C,应该选哪一个?首先,先明确一个概念:针对单片机编程使用的C语言有个正式的名字,叫C51。跟C有区别吗?有。C51是在C语言基础上针对51单片机的特点做了特殊扩展,主要体现了51单片机的硬件特性。比如,C51中的bit、sbit关键字,标准C里是没有的。可以想象,标准C一般用在桌面电脑上,不需要针对一个“位”来操作,最小操作单位是字节。而单片机中大量的操作就是操作位(管脚),所以位变量是必须的。 本人建议先从C学起。道理很简单:你用过VB在Windows上编程吧?很容易做出个按钮、界面什么的吧?那时候你会用X86的汇编来写程序吗?你可能根本就不知道X86上还有汇编,对吧?Windows上面也能用汇编?当然,其实所有C语言(以及其他所谓高级语言,VB、DELPHI等)编译之后都相当于汇编代码,你直接用汇编写Windows程序也没有问题,问题是你得有很高的编程水平。 所以,从最开始就用C51来编写单片机程序是可行的,但要结合单片机的硬件结构,可能不可避免地要联系到汇编的知识。这句话难懂了,到底要不要学汇编呢?汇编语言的语法本身并不重要,但它直接牵扯到单片机的知识很重要,就是关于单片机的硬件结构和寻址方式。举个例子:定义一个RAM变量,是用data关键字、还是idata关键字?data、idata都是存储器类型修饰符,data、idata定义的变量都是“内部”变量(相对的,xdata定义的就是外部变量了),区别是:data变量是直接寻址的,寻址范围00h~7fh;idata变量是间接寻址的,寻址范围00h~ffh。51单片机不是只有片内128个ram变量地址吗?对;对于51单片机,片内RAM一共128个,用data定义足够了;但我们现在用的都是52单片机呀(不骗你,你学了半天“51”单片机,其实你根本就没有用到51,都是52!),8952是8951的增强型,片内扩展了128个RAM,总共256个RAM,需要用idata来定义RAM变量。准确地说,RAM地址00h~7fh,可以用data或idata来定义(区别是,data变量执行速度更快,为什么?你得去查查51教科书了);RAM地址80h~ffh,只能用idata定义。有个技巧:你先把所有变量定义成data的,如果RAM不够用了,编译器会报错,这时你就得把一些变量定义成idata的就行了。 最后,你也许问了:根本没你说的那么复杂,我看过所有人的C51代码定义变量都很简单,比如 char c; 根本没用data、也没用idata! 是的,C51编译器默认存储类型是data型的,没有写data或idata之类,就相当于data型的! 最后,简单说一下编程代码风格问题。希望大家从一开始就建立一个概念:编程风格比代码技巧重要!或者说,编程风格最重要!什么是编程风格?简单说,就是程序的可读性、规范性。你写的程序要让别人看得懂、容易懂;3个月后也要让自己还能看懂!这不是笑话,随便地定义变量: int aa,bb; 3个月后,你可能真的不知道这个aa到底代表的是什么意思了! 定义变量要取有代表性的单词或缩写,关键行要有注释,这就是基本的代码风格。遗憾的是,学校里老师几乎没人强调这一点。 即使本人已尽力用最通俗的语言来描述单片机的入门开发,但相信很多读者仍不能完全理解这些内容。没关系,这很正常,--单片机、C51本来就不是那么简单的!但只要你保持研究单片机的兴趣和热情,一步一步、坚持不懈,最终一定能掌握他!需要你的耐心和恒心! 本文版权归【海东青电子】张平所有;欢迎转载,但请保留出处和版权信息,谢谢。 有任何建议,请联系作者email:2208117047 A qq.com(A换成@) 欢迎加入单片机技术讨论QQ群:231033072,互相帮助、共同提高。 【完】