新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 单片机的“语言”规范

单片机的“语言”规范

作者:时间:2013-01-26来源:网络收藏
以上的程序,我们都是用的软件定时,这对系统来说是不划算的。因为这样,CPU绝大部分时间都消耗在了计数上面。实际上CPU还有更重要的事情去处理,我们要把CPU从计数里解放出来。下面我们使用定时器计时来实现我们的电路功能,那么,程序应当怎样来写呢?从上面的编程思路框图中,我们可以看到,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语言,那真是如虎添翼呢。

  希望我们这种程序的规范写法能对正在学习汇编语言的朋友有所帮助。当然,看一两篇文章并不能够学会汇编语言,重要的还是多写多练,才能真正进入单片机编程的殿堂。


上一页 1 2 3 下一页

评论


相关推荐

技术专区

关闭