循环点亮LED灯,也就是流水灯效果的控制,可以用定时器来控制,这样做相对代码量较少而时间比较精确,外部中断0接以按键,可以控制动态效果的启停。程序如下:
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP EXT0 ;外部中断0,控制流水灯启停
ORG 000BH
LJMP T0ISR ;定时0控制流水灯循环点亮
ORG 0030H
MAIN:
MOV TMOD,#01H ;设置定时器0工作模式
MOV TH0,#HIGH(65536-60000) ;60毫秒定时
MOV TL0,#LOW(65536-60000)
SETB ET0
SETB EA
MOV A,#0FEH ;LED等初始化
MOV P0,A
SJMP $
EXT0:
CPL TR0
RETI
T0ISR:
CLR TR0
MOV TH0,#HIGH(65536-60000)
MOV TL0,#LOW(65536-60000)
SETB ET0
RL A
MOV P0,A ;循环点亮LED灯
RETI
END
ORG 00H
LJMP START
ORG 30H
START: MOV A, #7FH
LOOP: RL A
INC A
MOV P1, A
LCALL DELAY
LJMP LOOP
DELAY: MOV R5, #5
DELAY01: MOV R6, #200
DELAY02: MOV R7, #250
DELAY03:
DJNZ R7, DELAY03
DJNZ R6, DELAY02
DJNZ R5, DELAY01
RET
END
#include "reg51h"
unsigned char P1BUF=0XFE;
unsigned int YSJS=0;
bit led;
void main(void)
{
TMOD |= 0X10; //定时器1工作于方式1,16位定时器
TH1 = 0XFF; //定时器1定时时间=500uS
TL1 = 0X06; //
ET1 = 1; //使能定时器1中断
TR1 = 1; //开启定时器1
EA =1;
while(1)
{
}
}
void TIMER1(void) interrupt 3 //定时器1中断函数使用默认寄存器组
{
TH1 = 0XFF; //定时器1定时时间=500uS
TL1 = 0X06;
P3^5=!P3^5; //输出方波
YSJS++;
if(YSJS==1000)
{
P1 = P1BUF;
led = P1BUF & 0X80;
P1BUF <<= 1; //预备下一位
if(led)P1BUF = P1BUF | 1;
}
}
实现流水灯的方式有很多种(中断,定时器,延时等等),看用哪种方式,最简单的是延时做流水灯,那么在死循环里面增加按键检测,判断出有按键按下来时,再进入死循环,程序不往下走就可以暂停,再按跌出死循环。
#include //51系列单片机定义文件
#define uchar unsigned char //定义无符号字符
#define uint unsigned int //定义无符号整数
void delay(uint); //声明延时函数
void main(void)
{
uint i;
uchar temp;
uint Flag1=0; 按键标志位bai
uint Flag2=0;
while(1)
{
Flag1 = keyscan();
if(Flag1==1)(Flag2=~Flag2); //如果一旦检测到一次按键扫描就把标志位2 打开;再次就关闭;
if(Flag2==1)// 如果标志位打开就开始流水灯
{
temp=0x01;
for(i=0;i<8;i++) //8个流水灯逐个闪动
{
P1=~temp;
delay(100); //调用延时函数
temp<<=1;
}
}
扩展资料:
单片机编程就是硬件是单片机,基于单片机进行的程序开发,在有周围外设支持的情况下,用软件来控制的部分通过单片机编程来实现。单片机能识别的语言是硬件语言即汇编,因此编程就是围绕汇编来实现,有直接用汇编程序来编写的,但是较难调试的编写,特别是一上规模就更不易实现,因此常用高级语言来写然后通过编译器转化成汇编。
参考资料来源:百度百科-单片机C语言编程
ORG 00H ;开始地址
JMP MAIN ;跳转到主程序
ORG 03H ;外部中断0地址
JMP EXT1 ;跳转
ORG 13H ;外部中断1地址
JMP EXT2 ;跳转
MAIN:
MOV IE, #85H ;使能中断 0,1
SETB TCON2 ;边沿触发
SETB TCON0 ;边沿触发
SJMP $ ;--没有这一句,程序,自己就去执行中断函数了
EXT1:
MOV P2, #0 ;清0,点亮发光二极管
RETI
EXT2:
MOV P2, #0FFH ;置1,关闭
RETI
END
做好中断现场保护和还原就可以解决这个问题了。
INT:PUSH PSW;先现场保护
PUSH ACC;
PUSH 00H;R0
PUSH 01H;R1
PUSH 02H;R2
PUSH 03H;R3
PUSH 04H;R4
PUSH 05H;R5
PUSH 06H;R6
PUSH 07H;R7
MOV A,#0AAH
MAG:
MOV P2,A
LCALL DELAY
RL A
JNB P33,MAG
MOV A,#1
MOV R2,#7
POP 07H;R7;现场还原
POP 06H;R6
POP 05H;R5
POP 04H;R4
POP 03H;R3
POP 02H;R2
POP 01H;R1
POP 00H;R0
POP ACC;
POP PSW;
RETI
这个流水灯是很普通的一种花样,假设LED接P1口,程序如下:
ORG 0000H
LJMP MAIN
0RG 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 A,#0FEH
MOV P1,A
MOV R2,#20
SJMP $
T0ISR:
CLR TR0
MOV TH0,#HIGH(65536-50000)
MOV TL0,#LOW(65536-50000)
SETB TR0
DJNZ R2,T0E ;1秒未到直接退出
MOV R2,#20
RL A
MOV P1,A ;1秒一变的花样流水灯。
T0E:
RETI
END
以上就是关于单片机汇编语言程序,我想写一个循环点亮的LED,然后用外部中断0接到一个按键上,怎么写我需要详细的程序全部的内容,包括:单片机汇编语言程序,我想写一个循环点亮的LED,然后用外部中断0接到一个按键上,怎么写我需要详细的程序、89c51实现流水灯的汇编程序、求汇编程序:6M晶振51单片机控制流水灯从右到左逐个点亮同时从p3.5脚输出1KHZ方波,用T1中断产生等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)