首先搞清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 *** 作汇编语言程序解释等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)