51单片机用汇编语言编写流水灯程序,就是控制多个LED ,使其在特定时间间隔内,只有一个LED 发光,其他熄灭,用这种方式顺序移动点亮LED的位置,就形成了流水灯的效果。以下是程序:
;假设晶振12MHZ,P1控制8个LED低电平亮
;启动入口========================
ORG 0000H ;复位启动
AJMP START ;
ORG 001BH ;T1中断
AJMP T1INT ;
;定义变量========================
YSJS EQU 30H;延时计数器
LED EQU 31H;LED控制缓冲器
;主程序==========================
START: MOV LED,#0FEH ;初始化数据
MOV YSJS,#0 ;
;
MOV TMOD,#10H ;定时器1工作于方式1,16位定时器
MOV TL1,#0B0H ;设置定时初值
MOV TH1,#3CH ;定时时间=50mS
SETB ET1 ;使能定时器1中断
SETB TR1 ;启动定时器1
SETB EA ;开总中断
MOV P1,LED ;初始化流水灯
;
LOOP: JMP LOOP ;循环等待中断
;
;
T1INT: PUSH PSW ;定时器1中断程序
PUSH ACC ;保护现场
;
MOV TH1,#3CH ;定时时间=50mS
MOV TL1,#0B0H ;
INC YSJS ;
PUSH ACC ;保护ACC
MOV A,YSJI ;
CJNE A,#2,QT1 ;50mS2=100mS
MOV P1,LED ;
MOV A,LED ;
RL A ;累加器A的值循环左移1位
MOV LED,A ;
MOV YSJS,#0 ;
;
QT1: POP ACC ;恢复现场
POP PSW ;
RETI ;返回主程序
END ;汇编程序结束
#include
"reg52h"
#include
"intrinsh"
//循环移动函数要用到的头文件
void
Delay(unsigned
int
t)
//延时子程序
{
unsigned
i;
while(t--!=0)
{
for(i=0;i<500;i++)
{;}
}
}
void
main(void)
{
unsigned
char
temp,num1,num2;
P0=0xff;
//LED初始化
起始状态
灭
P2=0xff;
while(1)
//大循环
{
temp=0xfe;
//送给P0口的初值
点亮一侧第一个灯
for(num1=0;num1<8;num1++)
//循环体用于循环左移用
循环8次
{
P0=temp;
//给P0
P2=0xff;
//P2控制的灯灭
Delay(100);
//延时
temp
=
_crol_(temp
,
1);
//执行一次循环就循环左移一位
与汇编的
RL功能相同
}
temp=0x7f;
//送给P0口的初值
点亮另一侧第一个灯
for(num2=0;num2<8;num2++)
{
P0=temp;
P2=0xff;
Delay(100);
temp
=_cror_(temp,1);
//循环右移
同RR
下面的就是控制P2口了
同上面类似
}
//这个程序实现的效果是:先让P0口控制的LED自右向左点亮(只亮一个灯)再自左向右点亮
然后就是P2口
temp=0xfe;
for(num1=0;num1<8;num1++)
{
P2=temp;
P0=0xff;
Delay(100);
temp
=
_crol_(temp
,
1);
}
temp=0x7f;
for(num2=0;num2<8;num2++)
{
P2=temp;
P0=0xff;
Delay(100);
temp
=_cror_(temp,1);
}
}
}
org 0000h
mov p1,#00h;P1口送00,全灭
clr a;累加器请0
l0:jnb p35,l1;P35为低转l1
k0:jb p35,l2;P35为高转l2
mov r4,#0fh;R4=0fH
l1:inc a;累加器加1
mov p1,a;P1=A
lcall dl;延时
djnz r4,l1;R4减1不为0转l1
ljmp k0;转k0
mov r2,#07h;R2=07H
mov a,#80h;累加器=80H
l4:mov p1,a;P1=A
dl:mov r7,#0c8h;R7=C8H延时外层循环
dl1:mov r6,#7dh;R6=7DH延时内存循环
dl2:djnz r6,dl2;内存循环
djnz r7,dl1;外层循环
ret
l2:mov r2,#07h;R2=07H
mov r5,#01h;R5=1
k1:mov a,#01h;A=1
l3:mov p1,a;P1=A
rl a;A循环左移
lcall dl;延时
djnz r2,l3;R2减1不为0转l3
rr a;A循环右移
lcall dl;延时
djnz r2,l4;R2减1不为0转l4
djnz r5,k1;R5减1不为0转k1
sjmp l0;转l0
end
工具:STC系列51单片机、串口转换器(USB转TTL 或232转TTL)
材料:实验板一块(可以买现成的,也可以买面包板自己搭建),电阻、LED灯 若干,5V电源等。
以下程序可以直接用Keil C 直接编译执行。
//可以通过左移函数_crol_()和右移函数_cror_()来实现LED等的来回流动。
//具体实现方法可以参考如下程序:
#include <reg51h>
#include <intrinsh>
#define uint unsigned int
#define uchar unsigned char
void delay(uint a);
void main()
{
P1=0xfe;
while(1)
{
// 向左循环点亮LED
for(i=0; i<7; i++)
{
P1=_crol_(P1,1); // 左移一位,点亮下一位LED
delay(55);
}
// 向右循环点亮LED
for(i=0; i<7; i++)
{
P1=_cror_(P1,1); // 右移一位,,点亮上一位LED
delay(55);
}
}
}
// 延时函数,延时a毫秒
void delay(uint a)
{
uint x,y;
for(x=a;x>0;x--)
for(y=110;y>0;y--);
}
#include <reg51h>
#include<intrinsh>
#define uchar unsigned char
uchar j,temp;
void delay(unsigned int ms)
{
uchar t;
while(ms--)
for(t=0;t<123;t++);
}
void main()
{
P1=0xff;
delay(500);
temp=0xfe; //有点怪,led接在P23~P26
for(j=0;j<4;j++)
{
P1=temp;
delay(500);
temp=_crol_(temp,1);
}
P1=0xff;
while(1);
}
以上就是关于c51单片机中如何用汇编语言编写流水灯全部的内容,包括:c51单片机中如何用汇编语言编写流水灯、请高手解释一下这个单片机流水灯C语言程序,新手~~、单片机控制流水灯程序注释等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)