单片机的“语言”规范
以看到,LED灯的亮灭有6种状态,下面是一种编程方法,大家请看编程示例三:
//程序功能:三个LED灯依次各亮灭1s,用定时器延时
//第一部分:预定义
led_light1 bit p0.0 //定义管脚
led_ light2 bit p0.1
led_ light3 bit p0.2
counter equ 30h //定义计数寄存器
org 0000h //程序开始
ljmp main
org 000bh
ljmp int_t0 //定时器T0中断入口地址
org 0030h
//第二部分:主程序
main:
acall init_t0
ajmp $ //等待中断
//第三部分:子程序
init_t0: ;初始化定时器T0子程序
mov tmod,#01h
mov tl0,#low(65536-50000) //50ms初值
mov th0,#high(65536-50000)
setb ea
setb et0
setb tr0
mov counter,#0
mov r2,#0
ret
int_t0;定时器T0中断子程序
mov tl0,#low(65536-50000)
mov th0,#high(65536-50000)
inc counter
mov r0,counter
cjne r0,#20,lp1
mov counter,#00h //12MHz晶振,定时1s
acall led_flash
lp1: reti
led_flash; LED灯闪子程序
mov dptr,#table //散转程序
mov a,r2
add a,r2
jmp @a+dptr
table: ajmp led1
ajmp led2
ajmp led3
ajmp led4
ajmp led5
ajmp led6
led1: clr led_ light1 //led状态1
mov r2,#1
ajmp lp2
led2: setb led_ light1 //led状态2
mov r2,#2
ajmp lp2
led3: clr led_ light2 //led状态3
mov r2,#3
ajmp lp2
led4: setb led_ light2 //led状态4
mov r2,#4
ajmp lp2
led5 clr led_ light3 //led状态5
mov r2,#5
ajmp lp2
led6: setb led_ light3 //led状态6
mov r2,#0
clr tr0 //定时器停止计数
lp2: ret
end //程序结束
在这个程序里,大家需要注意这样几个问题:
1.在主程序部分main里,除了初始化T0之外,主程序什么也没有做,这就对了。因为我们总是强调主程序还要有更重要的事情去处理,所以它要把一些小事情,具体的事情放手给子程序去处理。这就好像我们吃饭时用筷子夹菜,我们不要时时用脑子想"要把夹的菜放进嘴里",我们的手就会自动把菜放进我们的嘴里。因为这样的小事情就不要再麻烦我们的大脑了,只有这样把大脑解放出来,我们在吃饭时大脑才可以思考其他的事情,才可以跟其他人交谈而又不耽误吃饭。单片机只有能处理许多复杂的事情,才能够显示出它的强大功能来,所以我们在编程时一定注意让主程序部分少做具体的事,多做指挥的事。
2.一个完整的程序绝对不是从第一行到最后一行这样依次写下来的。我们说规范的程序由三部分组成,有的语句是在写程序的时候边写边补充进去的。例如我们在写定时器定时1s的部分时,需要一个计数存储单元,于是我们便在"第一部分预定义"里加进了"counter equ 30h "这条语句。如果程序中要使用堆栈,我们还要先给堆栈指针SP赋值,以规定堆栈栈顶的位置。实际的程序编写就是如此。
3.在本程序中,我们使用了散转语句,其实这样真有点杀鸡用牛刀了。还可以有更简单的写法。我们这样写,一方面是想让大家试一试散转语句的用法,而另一方面是想向大家表明我们只注重方法(程序的规范写法)而不强调技巧。
说到学习单片机,使用C语言编程是大势所趋。但是话又说回来,单片机的学习毕竟与硬件电路有很多的联系,而学习汇编语言则会对单片机的硬件结构有更多的了解。所以学习汇编语言与学习C语言并不矛盾。使用C语言编程的,可以了解一下汇编语言,以便更深理解单片机的结构;使用汇编语言编程的,如果想尽快进入应用领域,则应该再学习C语言。而我们这种汇编程序的规范写法是与C语言的编程思想完全一致的。
也就是说有了这种规范写法的训练,再学习C语言,那真是易如反掌。就像你学习开车,学会了开手动档的汽车,让你开自动档的汽车,你会有什么感觉?一定是不在话下吧。但是反过来会怎样呢?所以从汇编语言学习单片机的朋友不会吃亏,如果再学会了C语言,那真是如虎添翼呢。
希望我们这种程序的规范写法能对正在学习汇编语言的朋友有所帮助。当然,看一两篇文章并不能够学会汇编语言,重要的还是多写多练,才能真正进入单片机编程的殿堂。
- FPGA的DSP性能揭秘(06-16)
- 基于单片机通用引脚的软件UART设计(10-16)
- 分时操作系统思想在单片机中的具体应用 (10-30)
- 基于AT89C51+DSP的双CPU伺服运动控制器的研究(05-26)
- 关于RTX51 TINY的分析与探讨(05-30)
- 基于MC9S12DGl28单片机的智能寻迹车设计(04-03)