用汇编语言编写一个51单片机的程序

用汇编语言编写一个51单片机的程序,第1张

首先搞清LED管是高电平导通还是低电平导通。

如果是低电平导通,P1赋0x00时,发光管全亮,0xff时,全灭。

具体程序

#define uint unsigned int

#define uchar unsigned char

void delay(uint time_out)

{

uint i,j;

for(i=0;i<time_out;i++)

{

for(j=0;j<110;j++)

{;}

}

}

void main(){

while(1)

{

P1=0xfe; //第1个管亮

delay(500);

P1=0xfd; //第2个管亮

delay(500);

P1=0xfb; //依次类推

delay(500);

P1=0xf7;

delay(500);

P1=0xef;

delay(500);

P1=0xdf;

delay(500);

P1=0xbf;

delay(500);

P1=0x7f;

delay(500);

}

}

程序大致如此,delay函数负责延迟500ms有问题自己再调试调试

1:

KEY1 EQU P22

KEY2 EQU P21

KEY3 EQU P20

RED EQU P14

YELLOW EQU P15

GREEN EQU P16

ORG 0000H

LJMP MAIN

ORG 0030H

MAIN:

SETB RED

SETB YELLOW

SETB GREEN

LP:

JB KEY1,LP1

CLR RED

SJMP LP

LP1:

JB KEY2,LP2

CLR YELLOW

SJMP LP

LP2:

JB KEY3,MAIN

CLR GREEN

SJMP LP

END

2:

KEY1 EQU P22

ORG 0000H

LJMP MAIN

ORG 0030H

MAIN:

MOV R0,#0

LP:

JB KEY1,DISP

JNB KEY1,$

INC R0

CJNE R0,#10,DISP

MOV R0,#0

DISP:

MOV DPTR,#LEDTAB

MOV A,R0

MOVC A,@A+DPTR

MOV P0,A

SJMP LP

TABLE: ; 共阴极数码管显示代码表

DB 3FH,06H,5BH,4FH,66H ;01234

DB 6DH,7DH,07H,7FH,6fh ;56789

END

ORG 00H ;程序初始地址

SJMP STAR ;跳转到STAR

ORG 1BH ;定时器T1的中断向量地址

SJMP T1S ;跳转到T1S

ORG 30H ;程序地址30H,即STAR标号地址

STAR: MOV R2,#99 ;将十进制数99送入R2中

MOV R4,#20 ;将十进制数20送入R4中

MOV IE,#88H ;开启EA和ET1

MOV TMOD,#10H ;使用T1的工作方式1

MOV TH1,#3CH ;给T1赋初值,这里是定时50ms

MOV TL1,#0B0H

SETB TR1 ;开启T1

MOV A,R2 ;将R2中的值送入A中

MOV B,#10 ;将十进制数10送入B中

DIV AB ;将A中的数除以B中的数,商在A中,余数在B中

ACALL SEG7 ;调用SEG7

MOV P1,A ;将A中值送入P1

MOV A,B ;将B中值送入A

ACALL SEG7 ;调用SEG7

MOV P2,A ;将A中值送入P2

SJMP $ ;死循环,等待中断

SJMP STAR

T1S: MOV TH1,#3CH ;中断程序,重新赋初值T1 50ms

MOV TL1,#0B0H

DJNZ R4,T1S0 ;R4中值先减1再看是否为0,若不为0则跳转到T1S0,若为0则顺序往下执行

MOV R4,#20 ;给R4重新赋值十进制数20,因此定时时间应该为1秒

DJNZ R2,T1S1 ;R2中值先减1再看是否为0,若不为0则跳转到T1S1,若为0则顺序往下执行

/CLR TR1/

SJMP T1S1 ;跳转到T1S1

T1S0: RETI ;中断返回

T1S1: MOV A,R2 ;将R2中的值送入A中

MOV B,#10 ;将十进制数10送入B中

DIV AB ;将A中的数除以B中的数,商在A中,余数在B中

ACALL SEG7 ;调用SEG7

MOV P1,A ;将A中值送入P1

MOV A,B ;将B中值送入A

ACALL SEG7 ;调用SEG7

MOV P2,A ;将A中值送入P2

CJNE R2,#0,T1S2 ;将R2中的值与十进制数0比较,若为0则跳转到T1S2,否则顺序执行

MOV R2,#100 ;给R2赋十进制数100

T1S2: RETI ;中断返回

SEG7: INC A ;A中的值加1

MOVC A,@A+PC ;先将PC中的值加1,然后与A相加,然后以此值为地址,将该地址中的数据送入A中

RET ;返回

DB 0C0H,0F9H,0A4H,0B0H;数据

DB 99H,92H,82H,0F8H

DB 80H,90H,88H,83H

DB 0C6H,0A1H,86H,8EH

END ;程序结束

=========================================================

我就是逐句解释了一下,至于程序要实现什么功能,我就不清楚了,要跟硬件相关

时间精确的延时程序要用汇编语言来编写。

计算延迟时间要查询每一条程序的执行周期数,然后加起来就是了。

在12m晶振的系统中,每个机器周期是1微秒

借用一下:

举例来说明吧:

delay:

mov r0,#10 ;1(周期)

delay1:

mov r1,#100 ;1

djnz r1,$ ;2

djnz r0,delay1 ;2

ret ;2

周期数=1+((1+(2100)+2)10)+2=2033

延迟时间=2033周期1微秒=2033微秒

从到这个程序开始到返回到调用的那个程序用了2033微秒

六个问题就是120分了,呵呵,开个玩笑

你知道在51中数据传送指令有几条告诉你,是29条,里面没有mov

Rn,Rn这样的指令,为什么呢?因为单片机不允许同时有两个访存工作寄存器组的 *** 作,p1呢,它不是工作寄存器,明白吗?

你知道在51中工作寄存器组有几组?上电复位后单片机用的是哪一组?为什么只能有一组是可用的呢,其它几组干什么去了?工作寄存器组的存储单元呢?单片机是怎么识别当前用的是哪一组?为什么要有好几组工作寄存器呢?

告诉你,是4组,分别是0,、1、2、3;上电复位后单片机用的是第0组;因为汇编指令里只有一个R0、R1、R2、R3、R4、R5、R6、R7,你要是往R0中存数据,只能是一个单元,所以是一组,其它几组呢,让它们闲着,等需要用的时候切过去;4组工作寄存器,每组8个单元,共32个单元,从片内RAM00H开始到1FH,自己算算,32个单元;在SFR(特殊功能寄存器)中有个PSW(程序状态字)的寄存器,它里面有两个位叫RS0、RS1,00、01、10、11组合,明白?上电复位后PSW要被清零的,就是00组合,他就是第0组工作寄存器的识别信号,明白?为什么要有好几组工作寄存器呢?那是为了程序调用的,发生子程序调用,保护主程序的工作状态,你要给子程序重新设一组工作寄存器,当然,你要是用不到工作寄存器,不切换也行,怎么切换呢?这你不会不知道了吧,给psw寄存器送个值把RS0、RS1的二进制数改了不就行了?

够明白的了吧?再要是不知道就看书去,太丢人了

以上就是关于用汇编语言编写一个51单片机的程序全部的内容,包括:用汇编语言编写一个51单片机的程序、51单片机汇编编程、51单片机LED *** 作汇编语言程序解释等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存