单片机的“语言”规范
那么,规范的写法又有怎样的要求呢?下面我们对照着规范写法的三部分内容来看一下。
规范写法的第一部分是"预定义",预定义部分就是要求我们在使用单片机管脚接口的时候先要给接口定义一个名称,而不要直接使用单片机接口名。如我们在程序中不要直接使用p0.0之类的。另外,我们在使用RAM中的存储单元的时候,也不要直接使用单元地址,也要在预定义部分给它定义一个单元名称。如我们要把一个计数值存储在30h存储单元里,我们就可以在预定义部分写上"counter equ 30h"语句,以后在程序中,我们直接使用"counter"这个名字就可以了。这样写的好处就是以后如果电路中单片机的管脚接口有所变动,或是存储单元需要修改,我们只需在预定义部分改动一下,而程序部分则一点也不需要动。这就是预定义的方便之处。
"主程序"与"子程序"的区分则更加重要。可以这样说吧,在编写程序时,能够实现某些具体功能的程序段,我们最好不要把它放在主程序里面,而要把它写成子程序。如上面的程序示例中,延时1s程序写成子程序,这样很好,但是让LED灯亮灭的这些功能程序段也应当写成子程序,这样就会更好。那有朋友问了,你都写成了子程序,那主程序部分干什么?问得好,其实编写程序,主程序部分我们尽量让它不去做具体的事情,因为它还有更重要的事情去做。我们把具体的事情放给子程序去做,而主程序,我们是让它扮演指挥,协调,检查子程序的工作。看到了吗,主程序和子程序就是这样的关系,主程序是我们的大脑,而子程序则是我们的手和脚,它们是指挥和被指挥的关系。那么,主程序如何"指挥"子程序呢,具体的说,就是"调用".
从开始写程序,我们的脑海里就应该建立起"预定义""主程序""子程序"这三个模块,在具体写程序的时候,我们就是向这三个模块里填充内容,而这就是我们所说的规范写法。
基于这样的思想,上面示例一的程序,要怎样写才是符合规范的呢,请看下面的程序示例二。
//程序功能:三个LED灯依次各亮灭1s,(用规范的写法改写)
//第一部分:预定义
led_light1 bit p0.0 //定义管脚
led_light2 bit p0.1
led_light3 bit p0.2
org 0000h //程序开始
ljmp main
org 0030h
//第二部分:主程序
main:
acall led1 //调用led1子程序
acall led2 //调用led2子程序
acall led3 //调用led3子程序
ajmp $ //待机状态
//第三部分:子程序
led1: //led1子程序
clr led_light1 //点亮第一个LED灯
acall delay1s
setb led_light1 //熄灭第一个LED灯
acall delay1s
ret
led2: //led2子程序
clr led_light2 //点亮第二个LED灯
acall delay1s
setb led_light2 //熄灭第二个LED灯
acall delay1s
ret
led3: //led3子程序
clr led_light3 //点亮第三个LED灯
acall delay1s
setb led_light3 //熄灭第三个LED灯
acall delay1s
ret
delay1s: //延时1s子程序
(中间内容略)
ret
end //程序结束
请注意预定义部分除了"定义管脚",我们使用了伪指令"org"定义了"程序开始",这样是为了避开5个中断服务子程序的入口地址部分,使程序从0030h开始。而"main"程序里只有三条调用指令,就完成了指挥的功能。只有这样写程序,主程序部分才能够发挥它应有的作用。而所有的具体功能的实现,我们都放到了子程序里,这样的程序结构看起来就清楚多了。
当然,这个程序因为简单,我们没有感觉到这种规范的写法有什么好处,反而觉得它比第一种方法还要复杂。实际上,随着电路的功能越来越多,程序的内容也会跟着越来越多,那个时候,你就会越来越发现我们这种规范写法的优越性来了。
因为电路的主要功能,我们可以到主程序部分去查找,而具体的实现功能的方法,我们则可以到子程序部分去查找,这样的程序结构让写程序的人觉得有章可循,循序渐进;让看程序的人也觉得层次清晰,一目了然。
果真是这样吗?下面我们改变一下这个电路的功能,让这三个灯的亮灭循环进行下去,那么这个程序应当怎样写呢?其实很简单,我们只要在示例程序二的主程序(main)里稍微改动一下就可以。请看改动过的main程序:
main:
loop: acall led1
acall led2
acall led3
ajmp loop //循环
当然,这种改动过于简单,在这里只是想让大家看看,main程序其实只有两种工作状态,一种是待机状态,一种就是循环状态。
以上的程序,我们都是用的软件定时,这对单片机系统来说是不划算的。因为这样,CPU绝大部分时间都消耗在了计数上面。实际上CPU还有更重要的事情去处理,我们要把CPU从计数里解放出来。下面我们使用定时器计时来实现我们的电路功能,那么,程序应当怎样来写呢?从上面的编程思路框图中,我们可
- FPGA的DSP性能揭秘(06-16)
- 基于单片机通用引脚的软件UART设计(10-16)
- 分时操作系统思想在单片机中的具体应用 (10-30)
- 基于AT89C51+DSP的双CPU伺服运动控制器的研究(05-26)
- 关于RTX51 TINY的分析与探讨(05-30)
- 基于MC9S12DGl28单片机的智能寻迹车设计(04-03)