㈠ 单片机汇编语言流水灯程序延时0.5秒 一共四个灯循环
四个灯假设接在P1.0~P1.3上。晶振采用12M,这里用定时器中断方式实现4个灯的流水灯效果,程序如下:
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0ISR
ORG 0030H
MAIN:
MOV TMOD,#01H
MOV TH0,#HIGH(65536-50000) //定时50毫秒初值
MOV TL0,#LOW(65536-50000)
SETB TR0
SETB ET0
SETB EA
MOV R2,#0
MOV A,#0FEH
MOV P1,A
SJMP $
T0ISR:
CLR TR0
MOV TH0,#HIGH(65536-50000)
MOV TL0,#LOW(65536-50000)
SETB TR0
INC R2
CJNE R2,#10,T0E //10次定时0.5秒
MOV R2,#0
RL A
JNB ACC.4,T01
MOV P1,A
RETI
T01:
MOV A,#0FEH
T0E:
RETI
END
㈡ 单片机流水灯用汇编语言写怎么从两边向中间亮再从中间
汇编程序如下:
; 花样流水灯(8个发光二极管以各种形式循环点亮)
; 功能:流水灯(8个发光二极管循环以1S间隔以各种形式循环点亮)
ORG 0000H ;伪指令,指定程序从0000H开始存放
LJMP MAIN ;跳转指令,程序跳转至MAIN处执行
ORG 0030H ;伪指令,指定程序从0030H开始存放
MAIN: MOV SP, #60H ;给堆栈指针赋初值
MOV P1,#0FFH ;给P1口赋值
MOV DPTR,#TABLE;查表
LIGHT: MOV R4,#42 ;设置循环次数
LOOP: MOV A,#42 ;给A赋初值
SUBB A,R4 ;将A的值与R4的值相减,结果存在A中
MOVC A,@A+DPTR ;将A+DPTR的值所对应的TABLE中的值赋给A
MOV P1,A ;将A的值赋给P1口
LCALL DEL1S ;调用1S延时子程序
DJNZ R4,LOOP ;判断R4是否为0,不为0跳转,为0顺序执行
LJMP LIGHT ;跳转指令,跳转至LIGHT处继续执行
;1S延时子程序(11.0592MHz晶振,误差0微秒)
DEL1S: MOV R5, #089H
DL1S0: MOV R6, #0A4H
DL1S1: MOV R7, #013H
DJNZ R7, $
DJNZ R6, DL1S1
DJNZ R5, DL1S0
RET
TABLE: ;定义表格数据
DB 0FFH ;全灭
DB 0FEH 0FDH 0FBH 0F7H 0EFH 0DFH 0BFH 07FH ;依次逐个点亮
DB 0FEH 0FCH 0F8H 0F0H 0E0H 0C0H 080H 000H ;依次逐个叠加
DB 080H 0C0H 0E0H 0F0H 0F8H 0FCH 0FEH 0FFH ;依次逐个递减
DB 07EH 0BDH 0DBH 0E7H 0E7H 0DBH 0BDH 07EH ;两边靠拢后分开
DB 07EH 03CH 018H 000H 000H 018H 03CH 07EH ;两边叠加后递减
DB 000H ;全亮
END ;程序结束指令
C语言程序如下:
/* 该实验是花样流水灯(8个发光二极管以各种方式循环点亮),功能是花样流水灯(8个发光二极管以1S间隔以各种方式循环点亮) */
#include//包含reg.52文件
#define uint unsigned int//宏定义
#define uchar unsigned char//宏定义
void delay(uint z);//声明延时函数
uint a;//定义循环用变量
uchar code table[]={
0xff,//全灭
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,//依次逐个点亮
0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,//依次逐个叠加
0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,//依次逐个递减
0x7e,0xbd,0xdb,0xe7,0xe7,0xdb,0xbd,0x7e,//两边靠拢后分开
0x7e,0x3c,0x18,0x00,0x00,0x18,0x3c,0x7e,//两边叠加后递减
0x00,//全亮
};//定义循环用数据表格
/*亮的现象:先是全灭,然后依次逐个点亮,然后依次逐个叠加,
然后依次逐个递减,然后两边靠拢后分开,然后两边叠加后递减,
最后全亮。循环!*/
void main()//main函数
{
a=0;//给a赋初值
while(1)//while循环
{
P1=table[a];//将a所在的table中的值赋给P1口
delay(1000);//1S延时子程序
a++;//a的值加一
if(a==42)//测试a是否等于42
a=0;//给a赋值
}
}
void delay(uint z)//1ms延时子程序,通过z值改变延时时间
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
㈢ 51单片机用汇编语言如何设计8个轮流呼吸的呼吸灯
因为我不知道你这个板子的硬件,我就假设一下吧,你自己对照着看看,关键是流程
假设如下这八个灯依次接在P0口的八个口上,高电平为灯亮,低电平为灯灭,程序如下
ORG 0000H
AJMP START
START:MOV P0,#01H;()只有第一个灯亮
ACALL DELAY;延迟,不加延迟的话 你根本看不起清到底那个灯亮的
MOV P0,#02H;()只有第二个灯亮
ACALL DELAY
MOV P0,#04H;()只有第三个灯亮
ACALL DELAY
MOV P0,#08H;()只有第四个灯亮
ACALL DELAY
MOV P0,#10H;()只有第五个灯亮
ACALL DELAY
MOV P0,#20H;()只有第六个灯亮
ACALL DELAY
MOV P0,#40H;()只有第七个灯亮
ACALL DELAY
MOV P0,#80H;()只有第八个灯亮
ACALL DELAY
AJMP START;周而复始
DELAY: MOV R6,#40;延迟程序,晶振为3.57MHZ时大概是0.1S
0.1SL1: MOV R5,#246
0.1SL2: NOP
DJNZ R5,0.1SL2
DJNZ R6,0.1SL1
RET
END