Chinaunix首页 | 论坛 | 博客
  • 博客访问: 659028
  • 博文数量: 205
  • 博客积分: 7891
  • 博客等级: 少将
  • 技术积分: 2168
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-29 13:16
文章分类

全部博文(205)

文章存档

2015年(4)

2014年(5)

2013年(1)

2012年(4)

2011年(51)

2010年(86)

2009年(45)

2008年(9)

分类:

2008-09-22 00:03:02

单片机的学习重在实践,自主!

至于是8051,还是PIC还是。。。自己查去。。。

如果想学单片机,基本配置:PC,还有一套能用的编程试验板,能用就行,没必要太好的,在此又MC1000为例,简单的连上网线,打开连接器——start up--选择com1口,波特率11520——80C52,打开Code Cruiser for 51好的,Every thing is ready!(又上几步视自己硬件情况而定,不清楚的可以去翻说明书)

废话不多说,先写一个简单的流水灯程序:

要想做流水灯,首先让灯亮起来。       

ORG 0000H    /*ORG伪指令,相当于程序的指针*/
    AJMP MAIN  /*AJMP 绝对转移指令*/
ORG 0030H
MAIN:SETB P1.5   /*置低电平,LED阵列有上拉电阻,接口在下,低电平亮*/
     LCALL DELAY  /*调用DELAY*/
     CLR P1.5    /*清零*/
     LCALL DELAY 
     LJMP MAIN   /*长转移重新进入MAIN,跌入死循环*/

/*××××××××以下部分为延迟子程序,相当于..等待..××××××××××*/
DELAY: MOV R7,#0FFH   /*给寄存器R7立即数30H*/
    D1: MOV R6,#255  /*给寄存器R7立即数255*/
    D2: DJNZ R6,D2     /*1转移指令*/
        DJNZ,R7,D1 
        RET
        END  

  最后的RET是子程序结束标志,END是整个程序结束的标志,也是伪指令。

现在打断一下,来介绍一下这个DELAY倒底是等多长时间,

几个名词:机器周期,就是机器访问一次存储器所用的时间;

     晶振周期,就是机器周期的来源,振荡源的周期,一个机器周期包括12个晶振周期;

     若按一个12M的晶振,T=1/fT12μs,所以一个机器周期是1μs,而DJNZ是双周期指令,

  需要2μs,则上面的DELAY时间=0FFH*255*2μs130ms

好了,接着继续。上面只是一个LED闪闪的程序,而想让它漂亮些就接着往下看吧!

 

 如果要想让很多灯闪起来,就要有一点的数电基础,没有的先跟着我来恶补一下:

 

LED电路中具有VCC,上拉电阻,故低电位亮,也是就二进制里的0,而8个这样的灯排在一块儿,如果想让某一个灯亮的话,就是1111 1110,而想让两个灯亮则是1111 1100,只有有几个0,则就可以让几个同时灯亮,还可以调节它们的相对位置。如:10101010则是一亮一暗的搭配。

好了, 现在我们来做一个真正的流水灯:

还是一样的开头:

ORG 0000H

AJMP START

ORG 0030H

START:MOV P1,#0FEH  /*就是刚才所说的11111110P1*/

MAIN: LCALL DELAY

       MOV A,P1

       RL A           /*这个是新的指令,意思是左移1,就是把11111110左移成11111101

       MOV P1,A         己理解*/

       LCALL DELAY

       LJMP MAIN

DELAY: MOV R7,#0FFH

D1: MOV R6,#0FFH

D2: DJNZ R6,D2

     DJNZ R7,D1

RET

END

这个程序其实没有什么新内容,效应果是八个灯交替闪亮,当然如果你看懂了上面的程序,可以创造不团的效果,不过是自己做出来效果那就感觉不一样了,会很有成就感的(只是对于FRESHMAN来说的,老手别笑)

扩展一些内容吧:

ORG 0000H

AJMP MAIN

ORG 0100H

START:MOV P1,#055H

       MOV P2,#055H

LOOP: LCALL DELAY

       MOV A,P1

       RL A

       MOV P1,A

       LCALL DELAY

       MOV A,P0

       RR A

       MOV P0,A

       LCALL DELAY

       LJMP LOOP

/*依然是那个DELAY*/

DELAY: MOV R7,#0FFH  
    D1: MOV R6,#255  
    D2: DJNZ R6,D2    

        DJNZ,R7,D1 
        RET
        END  

 

延时程序再多说一句:

如果想等待更长的时间怎么办呢?多次调用DELAY,呵呵,这也算一种方法,但是要是想延长DELAY时间呢?

多增加循环的次数。

DELAY: MOV R7,#0FFH  
    D1: MOV R6,#255  
    D2: MOV R5,#05H /*不建议很长时间,自己考虑*/

     D3: DJNZ R5,D3

 DJNZ R6,D2    

        DJNZ,R7,D1 
        RET
        END  

自己计算一下这次的等待时间。

最后再加一个循环跑圈的流水灯,第一次接触这东西的时候开发,如有雷同,纯属巧合!

要达到效果是让灯P1.0一直跑到P1.7然后转移到P0.7再到P0.0继续到P1.0如此往复,行成一个圆。

ORG 0000H

AJMP START1

ORG 0100H

START1: MOV P1,#0FEH

         MOV P0,#OFFH

LOOP1: LCALL DELAY

        MOV R4,#007H

   L1: MOV A,P1

        RL A

        MOV P1,A

        LCALL DELAY

        JNZ R4,L1

START2: MOV P1,#0FFH

         MOV P0,#07FH  /*注意这里是7FH,因为是循环*/

LOOP2:LCALL DELAY

       MOV R3,#007H

   L2:MOV A,P0

      RR A

      MOV P0,A

      LCALL DELAY

     DJNZ R3,L2

     LJMP START1

DELAY: MOV R7,#0FFH  
    D1: MOV R6,#255  
    D2: DJNZ R6,D2    

        DJNZ,R7,D1 
        RET
        END  

自己做出来,才是硬道理!MEACHEAL

    
    
 
阅读(1759) | 评论(7) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-06-07 17:54:15

好,写得很不错

chinaunix网友2010-01-24 14:35:56

好,写得太好了

chinaunix网友2009-12-26 18:01:01

有点明白!!!有没再间单点的!

chinaunix网友2009-04-22 21:25:57

用P1,P2口就不用上拉电阻了 直接高电平亮 这样比较方便吧

chinaunix网友2008-11-11 17:13:40

最遥远的距离.......