51单片机的串行口按工作方式1进行串行数据通信,假定波特率为2400b/s编写程序
3个回答
迪凯特科技(北京)有限公司_
2025-01-03
展开全部
展开全部
ORG 0000H
AJMP MAIN ;上电,转向主程序
ORG 0023H ;串行口的中断入口地址
AJMP SERVE ;转向中断服务程序
ORG 0040H ;主程序
MAIN: MOV SP,#60H ;设置堆栈指针
MOV SCON ,#50H
MOV PCON ,#00H
MOV TMOD,#20H
MOV TH1,#0F3H
MOV TL1,#0F3H
SETB TR1
MOV R0 ,#20H ;置发送数据区首地址
MOV R1 ,#40H ;置接收数据区首地址
MOV R7 ,#10H ;置发送字节长度
MOV R6 ,#10H ;置接收字节长度
SETB ES ;允许串行口中断
SETB EA ;CPU允许中断
MOV A ,@R0 ;取第一个数据发送
MOV SBUF ,A ;发送第一个数据
SJMP $ ;等待中断
SERVE: JNB RI ,SEND ;TI=1,为发送中断
CLR RI
MOV A ,SBUF ;读出接收缓冲区内容
MOV @R1 ,A ;读入接收缓冲区
DJNZ R6 ,L1 ;判断数据块发送完否
SJMP L2 ;数据块接收完,转L2
L1:INC R1 ;修改数据区指针
L2:RETI ;中断返回
SEND:
CLR TI ;清除发送中断标志
DJNZ R7 ,L3 ;判断数据块发送完否
SJMP L4 ;数据块接收完,转L4
L3: MOV A ,@R0 ;取数据发送
MOV SBUF ,A ;发送数据
INC R0 ;修改数据地址
L4:
RETI ;中断返回
END
AJMP MAIN ;上电,转向主程序
ORG 0023H ;串行口的中断入口地址
AJMP SERVE ;转向中断服务程序
ORG 0040H ;主程序
MAIN: MOV SP,#60H ;设置堆栈指针
MOV SCON ,#50H
MOV PCON ,#00H
MOV TMOD,#20H
MOV TH1,#0F3H
MOV TL1,#0F3H
SETB TR1
MOV R0 ,#20H ;置发送数据区首地址
MOV R1 ,#40H ;置接收数据区首地址
MOV R7 ,#10H ;置发送字节长度
MOV R6 ,#10H ;置接收字节长度
SETB ES ;允许串行口中断
SETB EA ;CPU允许中断
MOV A ,@R0 ;取第一个数据发送
MOV SBUF ,A ;发送第一个数据
SJMP $ ;等待中断
SERVE: JNB RI ,SEND ;TI=1,为发送中断
CLR RI
MOV A ,SBUF ;读出接收缓冲区内容
MOV @R1 ,A ;读入接收缓冲区
DJNZ R6 ,L1 ;判断数据块发送完否
SJMP L2 ;数据块接收完,转L2
L1:INC R1 ;修改数据区指针
L2:RETI ;中断返回
SEND:
CLR TI ;清除发送中断标志
DJNZ R7 ,L3 ;判断数据块发送完否
SJMP L4 ;数据块接收完,转L4
L3: MOV A ,@R0 ;取数据发送
MOV SBUF ,A ;发送数据
INC R0 ;修改数据地址
L4:
RETI ;中断返回
END
迪凯特科技(北京)有限公司_
2025-01-03 广告
2025-01-03 广告
#include void InitUART(void) { TMOD = 0x20; SCON = 0x50; TH1 = 0xF4; TL1 = TH1; PCON = 0x0; EA = 1; ES = 1; TR1 = 1; } ...
点击进入详情页
本回答由迪凯特科技(北京)有限公司_提供
展开全部
#include <reg51.h>
void InitUART(void)
{
TMOD = 0x20;
SCON = 0x50;
TH1 = 0xF4;
TL1 = TH1;
PCON = 0x00;
EA = 1;
ES = 1;
TR1 = 1;
}
void SendOneByte(unsigned char c)//发送函数
{
SBUF = c;
while(!TI);
TI = 0;
}
void main(void)
{
InitUART();
}
void UARTInterrupt(void) interrupt 4 //接收中断
{
if(RI)
{
RI = 0;
//接收的程序放在这里
}
else
TI = 0;
}
void InitUART(void)
{
TMOD = 0x20;
SCON = 0x50;
TH1 = 0xF4;
TL1 = TH1;
PCON = 0x00;
EA = 1;
ES = 1;
TR1 = 1;
}
void SendOneByte(unsigned char c)//发送函数
{
SBUF = c;
while(!TI);
TI = 0;
}
void main(void)
{
InitUART();
}
void UARTInterrupt(void) interrupt 4 //接收中断
{
if(RI)
{
RI = 0;
//接收的程序放在这里
}
else
TI = 0;
}
追问
m能用汇编语言写么
追答
ORG 0000H
LJMP START
ORG 0023H
LJMP UARTInterrupt
START:
MOV SP,#60H
LCALL InitUART
LOOP:
;add your code here!
LJMP LOOP
InitUART:
MOV TMOD,#20H
MOV SCON,#50H
MOV TH1,#0F4H
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
;========================
; 接收的程序放在这里
;========================
POP ACC
RETI
SendOneByte:
CLR ES
CLR TI
MOV SBUF,A
WaitSendFinish:
JNB TI,WaitSendFinish
CLR TI
SETB ES
RET
END
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你这没有问题啊?
追问
以中断方式传送数据,编写全双工通信程序
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询