深圳市华胄科技有限公司 >> MCU专题 >> 单片机编程


单片机教程:单片机编程入门四



提交者 电子007  在  2007-9-12 14:46:01 

上一篇 下一篇
单片机教程26课
单片机编程入门四


一、 程序的完善


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


SETB P10


CLR P10


……


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


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


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


;主程序:


LOOP: SETB P10     ;(1)


    LCALL DELAY   ;(2)


    CLR P10     ;(3)


    LCALL DELAY   ;(4)


    AJMP LOOP    ;(5)


;以下子程序


DELAY: MOV R7,#250  ;(6)


D1: MOV R6,#250    ;(7)


D2: DJNZ R6,D2    ;(8)


  DJNZ R7,D1     ;(9)


  RET         ;(10)


  END         ;(11)


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


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


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


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


二、单片机内部结构分析:


  为了知道延时程序是如何工作的,我们必需首先了解延时程序中出现的一些符号, 就从R1开始,R1被称之为工作寄存器。什么是工作寄存器呢?让我们从现实生活中来找找答案。如果出一道数学题:123+567,让你回答结果是多少,你会马上答出是690,再看下面一道题:123+567+562,要让你要上回答,就不这么容易了吧?我们会怎样做呢?如果有张纸,就容易了,我们先算出123+567=690,把690写在纸上,然后再算690+562得到结果是1552。这其中1552是我们想要的结果,而690并非我们所要的结果,但是为了得到最终结果,我们又不得不先算出690,并记下来,这其实是一个中间结果,计算机中做运算和这个类似,为了要得到最终结果,往往要做很多步的中间结果,这些中间结果要有个地方放才行,把它们放哪呢?放在前面提到过的ROM中可以吗?显然不行,因为计算机要将结果写进去,而ROM是不可以写的,所以在单片机中另有一个区域称为RAM区(RAM是随机存取存储器的英文缩写),它可以将数据写进去。


  特别地,在MCS-51单片机中,将RAM中分出一块区域,称为工作寄存器区。


单片机机系列--单片机教程---单片机教程:单片机编程--单片机教程:单片机编程入门四


作者:技术资料



单片机教程,五系列(55讲)电子书全集下载

论坛精选:
■ 单片机c语言,10小时学会C 语言 (一)
第一章 C 语言简介与Turbo C 的使用
■ 单片机c语言,10小时学会C 语言 (二)
第二章 C 程序的结构
■ 单片机c语言,10小时学会C 语言 (三)
第三章 常数与变数
■ 单片机c语言,10小时学会C 语言 (四)
第四章 基本输出入函式
■ 单片机c语言,10小时学会C 语言 (五)
第五章 流程图与抉择指令
■ 单片机c语言,10小时学会C 语言 (六)
第六章 循环与自动重复
■ 单片机c语言,10小时学会C 语言 (七)
第七章 数组与指针
■ 单片机c语言,10小时学会C 语言 (八)
第八章 函数与呼叫
■ 单片机c语言,10小时学会C 语言 (九)
第九章 档案存取

1 楼  提交者:boboleo 在 2007-9-20 14:38:23
太好了!!!! 楼主万岁!!
2 楼  提交者:Guest 在 2007-9-27 18:59:24
gthtgf
3 楼  提交者:独孤九剑 在 2007-9-27 20:17:20
确实不错
4 楼  提交者:306663570 在 2007-9-28 7:24:50
vb 
5 楼  提交者:g13958239257 在 2007-9-28 9:37:58
kuai 
6 楼  提交者:Guest 在 2007-9-28 12:12:47
cc
7 楼  提交者:Guest 在 2007-9-28 13:02:19
hao
8 楼  提交者:实在不服 在 2007-9-28 16:13:30
好贴,真是好贴
9 楼  提交者:plcpic 在 2007-9-28 17:35:14
10 楼  提交者: 在 2007-9-28 17:43:07
好啊
11 楼  提交者:id4huazhoucn 在 2007-9-28 21:57:19
赞楼主好文章,慢慢学习中
12 楼  提交者:acm111mca 在 2007-9-29 11:24:36
赞楼主好文章,慢慢学习中
13 楼  提交者:黄生 在 2007-9-29 11:55:33
好啊,很好的入门教材
14 楼  提交者:Guest 在 2007-9-29 19:56:41
好啊
15 楼  提交者:wujie314159 在 2007-9-29 20:32:10
你好坏,不教直接看到,
16 楼  提交者:lyralos 在 2007-9-29 22:02:33
想问你一个问题
就是如何用PIC单片机实现发出警报
17 楼  提交者:hilproz 在 2007-9-30 0:44:37
看看
18 楼  提交者:Guest 在 2007-9-30 8:20:26
dsadfasd
19 楼  提交者:luck1 在 2007-9-30 14:24:45
很好 啊
20 楼  提交者:tisa 在 2007-9-30 15:12:31
hui
21 楼  提交者:饶明 在 2007-9-30 16:52:48
谢谢
22 楼  提交者:匆匆过客 在 2007-9-30 22:05:28
dddddd
23 楼  提交者:ltianbin 在 2007-10-1 8:52:38
确实不错
24 楼  提交者:笨人 在 2007-10-1 9:59:34
见到好贴一定要回!
25 楼  提交者:zuowangcai 在 2007-10-1 19:01:04
hao 
26 楼  提交者:mhe1236 在 2007-10-2 6:24:24
FGHFGFHFGHFHFHFH
27 楼  提交者:Guest 在 2007-10-2 9:55:56
fjds
28 楼  提交者:hnhblyc 在 2007-10-2 15:51:10
帖子不错,但似乎太简单了.
29 楼  提交者:hnhblyc 在 2007-10-2 15:54:54
我们的第一个实验好象就是延时控制,这个程序大约延时1.5s(6mhz).
30 楼  提交者:xiaobin418 在 2007-10-3 8:56:35
帖子不错
上一篇 下一篇
当前第〖1〗页 共有30页 转到第 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30