汇编语言之串口通信

汇编语言之串口通信,第1张

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,#02H

anl A,SCON;//a=00000010b 与 SCON

cjne A,#2,receive

mov A,#01H

anl 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 汇编程序 自己改的 不知道能不能行 求大神指导、汇编语言写单片机串口控制程序,求大佬等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存