原创 开篇——流水灯

2011-4-24 00:36 1880 9 9 分类: MCU/ 嵌入式

首先我觉得要让我们对单片机感兴趣,这是关键,在学习中寻找乐趣才是硬道理。


一,      流水灯


1.  电路图



先解释下电路,流水灯单片机P1口通过一个74ls373来控制,此处373使能端由P0口接出的第一脚来控制。然后373输出接8个LED二极管的阴极,阳极接排阻在接上VCC.


源程序:汇编语言


;*******************************************************


;文件名:流水灯


;文件说明:地址线选中 P2.7 ADCS  Q0是流水灯片选高直通


;*******************************************************


ADCS     EQU       P2.7


LED_CS EQU       P0.0


       ORG      0000H   ;起始地址


MAIN:


       MOV      SP,#60H ;给堆栈指针赋初值


       SETB     ADCS   ;置高ADCS使74ls573连通


       SETB     LED_CS ;置高LED_CS


       MOV      A,#0FEH ;给累加器A赋初值0FEH


LOOP:


       MOV      P1,A ;将累加器A中的内容赋给P1口


       RR  A        ;将累加器A中的8位数循环右移


       CALL     DELAY ;调用延时子函数


       JMP       LOOP  ;跳转到标号LOOP处


;*************************************


;延时子程序


;*************************************


DELAY:


       MOV      R0,#10H ;将10赋给寄存器R0中


DELAY1:


       MOV      R1,#7FH;将7FH赋给寄存器R1中


DELAY2:


       MOV      R2,#7FH ;将7F赋给寄存器R2中


       DJNZ     R2,$    ;R2自减,判断是否减为0,如果减为0则继续执行,没减到0则执行该语句


       DJNZ     R1,DELAY2;


       DJNZ     R0,DELAY1


       RET;子程序返回


       END;程序结束


讲讲汇编语言吧,刚开始得时候很多人都是从模仿开始的然后才尝试自己编写程序.首先就是寄存器的寻址方式


MOV      A,Rn 也就是说将寄存器Rn中的内容赋给累加器A中,看多了自然就记得了,也不用强行记忆,还有就是MOV        A,direct 例如MOV        A,40H就是将40H地址中的内容装到累加器A中。基本上MOV这条指令就是这样的功能,将后面的传递到前面。还有就是间接寻址,例如MOV     A,@R0,R0中装的内容是40H则把40H中的数据传送到累加器A中。程序中还用到DJNZ指令,例如DJNZ         R0,标号。 将寄存器R0中的内容自减直到减为0则执行下一条语句,否则转移到标号处。


2.C语言版本:


/*******************************************************


文件名:流水灯


文件说明:地址线选中 P2.7 ADCS  Q0是流水灯片选高直通


*******************************************************/


#include<reg52.h>;头文件


#include<intrins.h>


#define uchar unsigned char


#define uint unsigned int


sbit ADCS=P2^7;


sbit LED_CS=P0^0;


/*******************************************************


函数名称:delay(uint z)


函数功能:延时子程序


*******************************************************/


void delay(uint z)


{


       uint x,y;


       for(x=z;x>0;x--)


              for(y=110;y>0;y--);


}


/*******************************************************


函数名称:main()


函数功能:主函数


*******************************************************/


void main()


{


       uchar temp;


       ADCS=1;


       LED_CS=1;


       temp=0xfe;//给变量赋初值


       while(1)


       {


              P1=temp;//将temp中的内容赋给P1口


              temp=_crol_(temp,1);//调用循环左移函数


              delay(300);//延时一段时间


       }


}


本C语言程序中用到了CROL函数,他是包含在头文件INTRINS.H中的。


_crol_ 字符循环左移


  _cror_ 字符循环右移


  _irol_ 整数循环左移


  _iror_ 整数循环右移


  _lrol_ 长整数循环左移


  _lror_ 长整数循环右移


  _nop_ 空操作8051 NOP 指令


_testbit_ 测试并清零位8051 JBC


还有就是函数名: _testbit_


  原 型:bit _testbit_(bit x);


功 能:_testbit_产生一个JBC 指令,该函数测试一个位,当置位时返回1,否则返回0。如果该位置为1,则将该位复位为0。8051 的JBC 指令即用作此目的。_testbit_只能用于可直接寻址的位;在表达式中使用是不允许的。


在本程序中使用格式是     temp=_crol_(temp,1)既是将temp中的内容循环左移1位。


当然我们不只是可以用软件进行延时还可以用硬件进行延时就是利用定时器来实现延时。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
9
关闭 站长推荐上一条 /3 下一条