
流水灯就是51单片机控制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 ;汇编程序结束
扩展资料:
实现流水灯的三个方法:
第一种,总线方法实现流水灯。这是一种比较笨但又最易理解的方法,采用顺序程序结构,用位指令控制P1口的每一个位输出高低电平,加上延时函数,即可控制每个LED灯的亮灭。
第二种,移位方法实现流水灯采用循环程序结构编程。首先在程序开始给P10口送一个低电平,其它位为高。然后延时一段时间再让低电平往高位移动,这样就实现“流水”的效果了。
第三种,库函数实现流水灯。利用左移函数进行。
不知道你是哪种单片机的C语言,大致应该是输出代码到某个端口,然后灯就亮了。因为是18个灯,所以数值应该是32位的。
以下为假设输出值与点亮灯的关系为二进制某位为1则灯这,为0灯灭。
再假设0x00001是第18盏灯亮,0x200000为第1盏灯亮。
以二进制描述如下:
0000 0000 0000 0000 0000 0000 0000 0000 全灭
0000 0000 0000 0000 0000 0000 0000 0001 18 亮
0000 0000 0000 0000 0000 0000 0000 0010 17
0000 0000 0000 0000 0000 0000 0000 0100 16
0000 0000 0000 0000 0000 0000 0000 1000 15
0000 0000 0000 0001 0000 0000 0000 0000 2
0000 0000 0000 0010 0000 0000 0000 0000 1
具体怎么映射数值要看你的单片机端口输出规则了,以上仅为假设,供参考。
根据灯亮顺序是从左到右还是从右到左,输出的值分别是:
从左到右:输出0x20000点亮1号灯,右移1位,延时;输出0x10000点亮2号灯,右移1位,延时;输出0x8000点亮3号灯依次点亮18个灯后,输出0x3FFFF,延时,输出0x0000,延时可以实现闪烁。
从右到左则输出数值的顺序相反,位移 *** 作为左移1位。闪烁的代码不变。
/-----------------------------------------------
名称:IO口高低电平控制
修改:无
内容:点亮P1口的多个LED灯闪烁
该程序是单片机学习中最简单最基础的,
通过程序了解如何控制端口的高低电平
单片机晶振频率 12MHz
注 IO口 接LED 要共阴极 并 P1口要接上拉电阻
------------------------------------------------/
#include<reg52h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
sbit LED1=P1^0;// 用sbit 关键字 定义 LED到P10端口,LED是自己任意定义且容易记忆的符号
sbit LED2=P1^1;
sbit LED3=P1^2;
sbit LED4=P1^3;
sbit LED5=P1^4;
sbit LED6=P1^5;
sbit LED7=P1^6;
sbit LED8=P1^7;
unsigned int L;//亮L毫秒
unsigned int M;//灭M毫秒
void Delay(unsigned char K) //@12000MHz
{
while(--K)
{
unsigned char i, j;
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
/------------------------------------------------
主函数
------------------------------------------------/
void main (void)
{
L=1000; //0~65535 秒随便写
M=1000; //0~65535 秒随便写
while(1)
{
LED5=1;
Delay(L);
LED5=0;
Delay(M);
LED4=1;
Delay(L);
LED4=0;
Delay(M);
LED6=1;
Delay(L);
LED6=0;
Delay(M);
LED3=1;
Delay(L);
LED3=0;
Delay(M);
LED7=1;
Delay(L);
LED7=0;
Delay(M);
LED2=1;
Delay(L);
LED2=0;
Delay(M);
LED8=1;
Delay(L);
LED8=0;
Delay(M);
LED1=1;
Delay(L);
LED1=0;
Delay(M);
/////////////////////////////////////////////////////////////////////
LED8=1;
Delay(L);
LED8=0;
Delay(M);
LED6=1;
Delay(L);
LED6=0;
Delay(M);
LED4=1;
Delay(L);
LED4=0;
Delay(M);
LED2=1;
Delay(L);
LED2=0;
Delay(M);
LED7=1;
Delay(L);
LED7=0;
Delay(M);
LED5=1;
Delay(L);
LED5=0;
Delay(M);
LED3=1;
Delay(L);
LED3=0;
Delay(M);
LED1=1;
Delay(L);
LED1=0;
Delay(M);
}
}
以上就是关于51单片机中如何用汇编语言编写流水灯全部的内容,包括:51单片机中如何用汇编语言编写流水灯、关于单片机C语言的流水灯设计。。。。、单片机流水灯设计等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)