(玩电子) 电子技术学习与研究
当前位置单片机教程网 >> 基础教程 >> 浏览文章

4课:第一个单片机小程序

作者:佚名   来源:本站原创   点击数:x  更新时间2007年08月16日   字体

上一次我们的程序实在是没什么用要灯亮还要重写一下片子下面我们要让灯中地闪烁这就有一定的实用价值了比如能把它当成汽车系一个信号灯用了怎样才能让灯中地闪烁呢实际上就是要灯亮一段时间再灭一段时间也就是说要P10中地输出高和低电平怎样实现这个要求呢请考虑用下面的指令是否可行

SETB P1.0

CLR P1.0 ……

这是不行的有两个问题第一计算机执行指令的时间很快执行完SETB P1.0后灯是灭了但在极短时间微秒级后计算机又执行了CLR P1.0指令灯又亮了所以根本分辨不出灯曾灭过第二在执行完CLR P10后不会再去执行SETB P1.0指令所以以后再也没有机会让灭了

为了解决这两个问题我们能做如下设想第一在执行完SETB P1.0后延时一段时间几秒或零点几秒再执行第二条指令就能分辨出灯曾灭过了第二在执行完第二条指令后让计算机再去执行第一条指令中地在原地兜圈我们称之为"循环"这样就能完成任务了

以下先给出程序后面括号中的数字是为了便于讲解而写的实什用输入

;主程序:
LOOP: SETB P1.0    ;(1)熄灭灯
LCALL DELAY        ;(2)延时一段时间
CLR P1.0           ;(3)点亮灯
LCALL DELAY        ;(4)延时一段时间
AJMP LOOP          ;(5)跳转到第一句LOOP处

;以下子程序
DELAY: MOV R7,#250 ;(6)
D1: MOV R6,#250    ;(7)
D2: DJNZ R6,D2     ;(8)
       DJNZ R7,D1  ;(9)
       RET         ;(10)
END                ;(11)

本例keil工程文件点击这里下载

按上面的设想分析一下前面的五条指令

第一条是让灯灭第二条应当是延时第三条是让灯亮第四条和第二条一模一样也是延时第五条应当是转去执行第一条指令第二和第四条实现的原理稍后谈先看第五条AJMP是一条指令意思是转移往什么地方转移呢后面跟的是LOOP看一下什么地方还有LOOP对了在第一条指令的前面有一个LOOP所以很直观地我们能认兜它要转到第一条指令处这个第一条指令前面的LOOP被称之为标号它的用途就是给这一行起一个名字便于使用是否一定要给它起名叫LOOP呢当然不是起什么名字完全由编程序的人决定能称它为AX等等当然这个时候第五条指令AJMP后面的名字也得跟着改了

第二条和第四条指令的用途是延时它是怎样实现的呢指令的问是LCALL这条指令称为调用子程序指令看一下指令后面跟的是什么DELAY找一下DELAY在第六条指令的前面显然这也是一个标号这条指令的作用是这样的当执行LCALL指令时程序就转到LCALL后面的标号所标定的程序处执行如果在执行指令的过程中遇到RET指令则程序就返回到LCALL指令的下面的一条指令继续执行从第六行开始的指令中能看到确实有RET指令在执行第二条指令后将转去执行第短指令而在执行完条指令后将遇到第保条令RET执行该条指令后程序将回来执行第三条指令即将P10清零使灯亮然后又是第四条指令执行第四条指令就是转去执行第678910条指令然后回来执行第5条指令第5条指令就是让程序回到第1条开始执行如此周而复始灯就在中地亮灭了

在标号DELAY标志的这一行到RET这一行中的所有程序这是一段延时程序大概延时零点几秒至于具体的时间以后我们再学习如何计算 程序的最后一行是END这不是一条指令它只是告诉我们程序到此结束它被称为"伪指令"

   单片机内部结构分析为了知道延时程序是如何工作的我们必需首先了解延时程序中出现的一些符号就从R1开始R1被称之为工作寄存器什么是工作寄存器呢让我们从现实生活中来找找答案如果出一道数学题123+567让你回答结果是多少你会马上答出是690再看下面一道题123+567+562要让你要上回答就不这么不难了吧课们会怎样做呢如果有张纸就不难了我们先算出123+567=690把690写在纸上然后再算690+562得到结果是1252这其中1252是我们想要的结果而690并非我们所要的结果但是为了得到最终结果我们又不得不先算出690并记下来这其实是一个中间结果计算机中做运算和这个类似为了要得到最终结果一般要做很多步的中间结果这些中间结果要有个地方放才行把它们放哪呢放在前面提到过的ROM中能吗显然不行因为计算机要将结果写进去而ROM是不能写的所以在单片机中另有一个区域称为RAM区RAM是随机存取存储器的英文缩写它能将数据写进去特别地在MCS-51单片机中将RAM中分出一块区域称为工作寄存器区上面程序用到的R6R7就是在这个区里面这我们会在第7课有详细的介绍其实如果我们用C语言来写程序的话用根本不用了解工作寄存器这个概念了因为C编译器会自动处理.看上面的程序如果用c来写就是

#include <at89x52.h>

void DELAY()   //延时函数
{ unsigned char i,j;
    for(i=0;i<250;i++)
    {
        for(j=0;j<200;j++);
    }
}

void main() //程序从这里开始执行
{
while(1) //这句的作用就是反复的执行下面这个{}中包含的4句
    {
     P1_0=1;  //(1)熄灭灯
     DELAY(); //(2)延时一段时间
     P1_0=0;  //(3)点亮灯
     DELAY(); //(4)延时一段时间
    }
}

   在汇编例子中程序是从第一条语句开始执行的而c不同在c语言里程序是从main() 这里开始执行的关于(1)(2)(3)(4) 这几句的解释和上面的汇编一样不再敖述循环部分这里是用了一个while(1) 语句下面打了一个大括号这样大括号中的这4条语句就会按(1)->(2)->(3)->(4) ->(1)->(2)->(3)->(4) ->(1)->(2)->(3)->(4)……永远不停的执行下去这样灯就会中的亮灭再亮再灭实现了闪烁效果关于延时函数下节课再叙有什么不懂的大家可以在下面提问

发表评论告诉好友收藏此文关闭窗口

文章评论

ձһhƬձƵ ձƵɫwww ձƵ:ɫ