单片机汇编语言程序,我想写一个循环点亮的LED,然后用外部中断0接到一个按键上,怎么写我需要详细的程序

单片机汇编语言程序,我想写一个循环点亮的LED,然后用外部中断0接到一个按键上,怎么写我需要详细的程序,第1张

循环点亮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中断产生等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9464574.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存