ORG 0000H
LJMP START
ORG 0023H
LJMP UARTInterrupt
;这段程序没有意义呀,永远执行不了
MOV R1,#8EH ;AUXR
MOV A,#40H ;T1
ORL A,@R1
MOV @R1,A ;T1, 1T Mode
START:
MOV SP,#60H
LCALL InitUART
LOOP:
;add your code here!
LJMP LOOP
InitUART:
MOV TMOD,#20H
MOV SCON,#50H
MOV TH1,#0DCH
MOV TL1,TH1
MOV PCON,#00H
SETB EA
SETB ES
SETB TR1
RET
UARTInterrupt:
JB RI,IsUART_Receive
CLR TI
RETI
IsUART_Receive:
CLR RI
PUSH ACC
MOV A,SBUF
;========================
;add your code here!
;========================
POP ACC
RETI
SendOneByte:
CLR ES
CLR TI
MOV SBUF,A
WaitSendFinish:
JNB TI,WaitSendFinish
CLR TI
SETB ES
RET
END
;其余没有什么问题,就是只接受数据,发送没有调用。
总的来说程序思想没问题,但是在串行通讯的接收部分有些乱。
说一下你读程序提出的问题,因为
;//SCON bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0;// SM0 SM1 SM2 REN TB8 RB8 TI RI
所以
mov A,#02Hanl A,SCON;//a=00000010b 与 SCON
cjne A,#2,receive
和
mov A,#01Hanl A,SCON;//a=00000001b 与 SCON
cjne A,#1,quit
实际上就是通过'与'运算获取SCON的TI位和RI位是否是1的信息,所以完全可以通过
JNB TI,RECEIVE;//判断是不是串行输出中断和
JNB RI,QUIT;//判断是不是串行输入中断替代。
下面是修改后的程序,对串行通讯进行了整理。因为在百度私信中得不到你的回复,所以是按“锁存器锁存'段码'与'位码',进而驱动数码管”,对DIS做的求改。
;//字符格式串行输入;//字符格式串行输出
;//波特率24kps = 2^SMOD晶振频率/[3212(256-TH1)]
;//波特率24kps 119808MHz 256-0xf3=13
;//波特率24kps 110592MHz 256-0xf4=12
;//SCON bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
;// SM0 SM1 SM2 REN TB8 RB8 TI RI
DIS_DUAN EQU 30H
DIS_WEI EQU 31H
SBUFASCII EQU 32H
ORG 0000H
LJMP START
ORG 0023H
LJMP SEND
ORG 0030H
;//主函数
START:
MOV P0,#0FFH
LCALL FIRST
HERE:
SJMP HERE
;//初始化
FIRST:
MOV DPTR,#TAB
MOV TMOD,#20H
;//MOV TH1,#0FDH
;//MOV TL1,#0FDH
MOV TH1,#0F3H
MOV TL1,#0F3H
SETB TR1
MOV SCON,#50H
SETB EA
SETB ES
SETB PS
RET
;//串行通讯中断子程序
SEND:
;//MOV A,#02H
;//ANL A,SCON
;//CJNE A,#2,RECEIVE
JNB TI,RECEIVE;//判断是不是串行输出中断
CLR TI
SETB REN;//允许接收
RECEIVE:
;//MOV A,#01H
;//ANL A,SCON
;//CJNE A,#1,QUIT
JNB RI,QUIT;//判断是不是串行输入中断
CLR RI
MOV R7,SBUF
MOV A,R7
CLR C
SUBB A,#30H
MOVC A,@A+DPTR
MOV DIS_DUAN,A
MOV DIS_WEI,#01H
ACALL DIS
MOV SBUF,R7
CLR REN;//在此清零REN 关闭了串行接收
QUIT:
RETI
;//显示子程序
DIS:
MOV P0,DIS_DUAN
SETB P27
NOP
NOP
CLR P27
MOV P0,DIS_WEI
SETB P26
NOP
NOP
CLR P26
RET
TAB:;//共阳数码管段码表
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
END
//发送端
#include "commonh"
uchar keyStatusList[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar keyValueList[]={1,2,3,4,5,6,7,8};
void main()
{
uchar keyStatus=0,i;
TMOD=0x20;
TH0=0xFD;
TL0=0xFD;
TR1=1;
SCON=0x40;
while(1)
{
keyStatus=P1;
for(i=0;i<8;i++)
{
if(keyStatus==keyStatusList[i])
{
SBUF=keyValueList[i];
while(TI==0);
TI=0;
}
}
}
}
//接收端
#include "commonh"
void main()
{
TMOD=0x20;
TH0=0xFD;
TL0=0xFD;
TR1=1;
SCON=0x50;
while(1)
{
while(RI==0);
RI=0;
P1=font[SBUF];
}
}
初始化程序如下:
MOV SCON, #50H ;设置串口方式1,允许接收
MOV T2CON, #00110100B ;设置T2
MOV T2MOD, #0
MOV RCAP2H, #0FFH
MOV RCAP2L, #0FAH
MOV TH2, #0FFH
MOV TL2, #0FAH
……
程序如下:
;----------------------------------------
ORG 0000H
SJMP START
ORG 0023H
LJMP UART_INT
;----------------------------------------
START:
MOV SP, #60H
MOV SCON, #50H ;方式1,8-n-1
MOV TMOD, #20H
MOV TH1, #0FDH ;波特率设置
MOV TL1, #0FDH ;9600@110592MHz
SETB TR1
SETB ES ;开放中断
SETB EA
LOOP:
MOV A, P2 ;读出的拨码开关信息
DJNZ R7, $ ;延时
DJNZ R6, $ - 2
MOV B, P2 ;再读
CJNE A, B, LOOP ;消抖
MOV SBUF, A ;向串口发送
MOV P1, A ;在本机显示
JNB TI, $
CLR TI
SJMP LOOP
;----------------------------------------
UART_INT:
PUSH ACC
JB TI, U_EXIT
CLR RI
MOV A, SBUF ;读出串口收到的信息
MOV P0, A ;送P0口显示
U_EXIT: POP ACC
RETI
;----------------------------------------
END
以上就是关于汇编语言之串口通信全部的内容,包括:汇编语言之串口通信、串口调试助手向单片机发送数字0-9 汇编程序 自己改的 不知道能不能行 求大神指导、汇编语言写单片机串口控制程序,求大佬等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)