找回密码
 注册
关于网站域名变更的通知
查看: 130|回复: 2
打印 上一主题 下一主题

单片机教程4第一个单片机小程序

  [复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-7-13 10:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
上一次我们的程序实在是没什么用,要灯亮还要重写一下片子,下面我们要让灯持续地闪烁,这就有一定的实用价值了,比如能把它当成汽车上的一个信号灯用了。怎样才能让灯持续地闪烁呢?实际上就是要灯亮一段时间,再灭一段时间,也就是说要P10持续地输出高和低电平。怎样实现这个要求呢?请考虑用下面的指令是否可行:SETB P1.0CLR P1.0 ……这是不行的,有两个问题,第一,计算机执行指令的时间很快,执行完SETB P1.0后,灯是灭了,但在极短时间(微秒级)后,计算机又执行了CLR P1.0指令,灯又亮了,所以根本分辨不出灯曾灭过。第二,在执行完CLR P10后,不会再去执行SETB P1.0指令,所以以后再也没有机会让灭了。  
) V# Q  @/ q! Q7 g' P
# p7 ?8 X1 d; b8 `+ r
& n: u8 @/ V' ^+ E% X6 j9 b
为了解决这两个问题,我们能做如下设想,第一,在执行完SETB P1.0后,延时一段时间(几秒或零点几秒)再执行第二条指令,就能分辨出灯曾灭过了。第二在执行完第二条指令后,让计算机再去执行第一条指令,持续地在原地兜圈,我们称之为"循环",这样就能完成任务了。以下先给出程序(后面括号中的数字是为了便于讲解而写的,实际不用输入):
1 q, V. L5 p/ b- l3 D8 R
: s: y2 N5 q) J  z/ h+ e/ n;主程序:+ u9 c$ [# F, i; C+ h
LOOP: SETB P1.0    ;(1)熄灭灯
5 W# }. E% L5 ^/ v, a' fLCALL DELAY       ;(2)延时一段时间" E2 P1 j& O, r; Z3 Z
CLR P1.0           ;(3)点亮灯
4 ~! _7 h' v! h. E+ Z* @$ L  C4 D3 oLCALL DELAY        ;(4)延时一段时间2 d( `" {! J4 l. E5 ]( r/ ?( @
AJMP LOOP          ;(5)跳转到第一句LOOP处
;以下子程序6 x  }3 W) z$ A9 x
DELAY: MOV R7,#250 ;(6)
" W# x+ o2 b2 @3 }D1: MOV R6,#250    ;(7)8 Y% J# A. _" v# D, a' w* z" w6 r* B
D2: DJNZ R6,D2     ;(8)
1 B" A; v3 D$ k  J: p       DJNZ R7,D1  ;(9)2 H' ?+ C- q) ?2 A' L
       RET         ;(10)
8 O2 f) l: w- I/ A2 s, o: d
END                ;(11)2 N/ n  v+ j% h$ Z

7 R1 _9 _& J& T  V1 G本例keil工程文件点击这里下载$ x8 o& P# \5 u" q; r

) I, ]- j. L6 Q' F" Q按上面的设想分析一下前面的五条指令。
  
6 c/ w. M2 r2 [& t6 i
$ F. j& K, s# `! b
第一条是让灯灭,第二条应当是延时,第三条是让灯亮,第四条和第二条一模一样,也是延时,第五条应当是转去执行第一条指令。第二和第四条实现的原理稍后谈,先看第五条,AJMP是一条指令,意思是转移,往什么地方转移呢?后面跟的是LOOP,看一下,什么地方还有LOOP,对了,在第一条指令的前面有一个LOOP,所以很直观地,我们能认识到,它要转到第一条指令处。这个第一条指令前面的LOOP被称之为标号,它的用途就是给这一行起一个名字,便于使用。是否一定要给它起名叫LOOP呢?当然不是,起什么名字,完全由编程序的人决定,能称它为A,X等等,当然,这个时候,第五条指令AJMP后面的名字也得跟着改了。  
6 ^1 q3 X, L+ X5 m( l5 A+ P, ]+ q! k3 S0 }
第二条和第四条指令的用途是延时,它是怎样实现的呢?指令的形式是LCALL,这条指令称为调用子程序指令,看一下指令后面跟的是什么,DELAY,找一下DELAY,在第六条指令的前面,显然,这也是一个标号。这条指令的作用是这样的:当执行LCALL指令时,程序就转到LCALL后面的标号所标定的程序处执行,如果在执行指令的过程中遇到RET指令,则程序就返回到LCALL指令的下面的一条指令继续执行,从第六行开始的指令中,能看到确实有RET指令。在执行第二条指令后,将转去执行第6条指令,而在执行完6,7,8,9条指令后将遇到第10条令:RET,执行该条指令后,程序将回来执行第三条指令,即将P10清零,使灯亮,然后又是第四条指令,执行第四条指令就是转去执行第6,7,8,9,10条指令,然后回来执行第5条指令,第5条指令就是让程序回到第1条开始执行,如此周而复始,灯就在持续地亮、灭了。  & c0 r' V/ L1 y) w9 n" ~/ `4 \

/ B( I( B& s7 ^9 S( V, [: u/ e在标号DELAY标志的这一行到RET这一行中的所有程序,这是一段延时程序,大概延时零点几秒,至于具体的时间,以后我们再学习如何计算。 程序的最后一行是END,这不是一条指令,它只是告诉我们程序到此结束,它被称为"伪指令"。   9 D* [( P; c$ A7 T5 g6 u" ?4 M
+ K: ~" y; [+ y/ y7 @$ G
单片机内部结构分析:
+ q' |9 _, U9 j0 l$ o7 U: R: G# s为了知道延时程序是如何工作的,我们必需首先了解延时程序中出现的一些符号,就从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中分出一块区域,称为工作寄存器区,上面程序用到的R6,R7就是在这个区里面,这我们会在第7课有详细的介绍。其实如果我们用C语言来写程序的话用根本不用了解工作寄存器这个概念了因为c编译器会自动处理.看上面的程序如果用c来写就是
5 _3 C( T0 f  ^4 Y% b1 v7 K# [$ w7 @4 N
#include
void DELAY()   //延时函数
1 n" Q' y  G9 ?9 B! j2 x. e8 X3 S{ unsigned char i,j;
* r0 n' U  Y: R& ^    for(i=0;i<250;i++)7 G: x( r  k$ `
    {9 k, Y6 f. o  m; i8 R1 z4 x1 B
        for(j=0;j<200;j++);
3 H: B& l- }2 v% Q    } & T/ B2 m0 e1 x# y" `& j( ?, ]/ B
}
void main() //程序从这里开始执行
( N4 K7 M) l' D  u+ O2 f# X
{8 c' |) f0 C1 j% O0 N
while(1) //这句的作用就是反复的执行下面这个{}中包含的4句; j7 y6 j' d% |$ [
    {8 Y. @* a( f' t& L& ^
     P1_0=1;  //(1)熄灭灯% A0 o8 {8 i1 U! k. y5 |5 l
     DELAY(); //(2)延时一段时间
3 W" I* w; k/ h, ]
     P1_0=0;  //(3)点亮灯  V+ }: y+ R3 D; B- {! j9 X
     DELAY(); //(4)延时一段时间! K. |% {" p2 o2 h0 T
    }0 _) [: x* M9 @$ Z0 p" U  S
}
   在汇编例子中程序是从第一条语句开始执行的,而c不同在c语言里程序是从main() 这里开始执行的,关于(1)(2)(3)(4) 这几句的解释和上面的汇编一样,不再敖述。循环部分这里是用了一个while(1) 语句下面打了一个大括号,这样大括号中的这4条语句就会按(1)->(2)->(3)->(4) ->(1)->(2)->(3)->(4) ->(1)->(2)->(3)->(4)……永远不停的执行下去。这样灯就会持续的亮灭再亮再灭实现了闪烁效果,关于延时函数下节课再叙。有什么不懂的大家可以在下面提问
0 S1 [- ]- e2 M2 _

该用户从未签到

2#
发表于 2022-7-13 11:10 | 只看该作者
我也是从初学者过来的,看到有楼主这样的人,帮新手解决问题,非常开心

该用户从未签到

3#
发表于 2022-7-13 13:24 | 只看该作者
总是有人愿意带新人的。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-18 21:11 , Processed in 0.125000 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表