首先我觉得要让我们对单片机感兴趣,这是关键,在学习中寻找乐趣才是硬道理。
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位。
当然我们不只是可以用软件进行延时还可以用硬件进行延时就是利用定时器来实现延时。
文章评论(0条评论)
登录后参与讨论