51单片机的串行口按工作方式1进行串行数据通信,假定波特率为2400b/s编写程序

如题所述

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
温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-11-24
#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;
}追问

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

本回答被提问者采纳
第2个回答  2011-11-16
你这没有问题啊?追问

以中断方式传送数据,编写全双工通信程序

...波特率为2400b\/S串行口工作方式 问题: 初始化串行口
unsigned char UART_RX; \/\/定义串口接收数据变量 unsigned char RX_flag;\/\/定义穿行接收标记 函数名:UART串口初始化函数 调 用:UART_init();参 数:无 返回值:无 结 果:启动UART串口接收中断,允许串口接收,启动T\/C1产生波特率(占用)备 注:振荡晶体为6MHz,PC串口端设置 [ 2400,8...

...MHZ,要求设置串行通信的波特率为2400b\/s,请编写程序段?
\/\/EA=1;}

AT89S51单片机时钟振荡频率为11.0592MHz,选用定时器T1工作模式2作为波 ...
void UartInit(void) \/\/2400bps@11.0592MHz { PCON &= 0x7F; \/\/波特率不倍速 SCON = 0x50; \/\/8位数据,可变波特率 TMOD &= 0x0F; \/\/清除定时器1模式位 TMOD |= 0x20; \/\/设定定时器1为8位自动重装方式 TL1 = 0xF4; \/\/设定定时初值 TH1 = 0xF4; \/\/设定定时器重装值 ET1 = 0...

波特率的计算
波特率与比特率的关系也可换算成:比特率=波特率*单个调制状态对应的二进制位数。例如假设数据传送速率为120符号\/秒(symbol\/s)(也就是波特率为120Baud),又假设每一个符号为8位(bit)即八相调制(单个调制状态对应3个二进制位),则其传送的比特率为(120symbol\/s) * (3bit\/symbol)=360bps。

求份微机原理与接口技术的试题(含答案)
B.程序控制方式 C.DMA方式 D.以上三种都是 6.设串行异步通信的数据格式是:1位停止位,7位数据位,1位校验位,1位起始位,若传输率为2400位\/秒,则每秒传输的最大字符个数为( ) A.10个 B.110个 C.120个 D.240个 7.CPU与I\/O设备间传送的信号有( ) A.控制信息 B.状态信息 C.数据...

我想用一个单片机去控制另外一个单片机,如何连接以及相应的数据...
SCON的确定:串口工作在方式1,允许接收。 所以: SCON=01010000b=0x50。主机采集数据,并发送给从机的参考程序如下(这里没有考虑通信协议):include<reg51.h> define uchar unsigned char define uint unsigned int uchar Temperature;void InitSystem(void);void CollectData(void);void Delay(voi...

如何为串口通讯增加新的波特率
第二种方式固定以9600,N,1 的串口格式进入AT。 二、指令说明 1、 AT 测试指令 例: 发给模块指令“AT”,模块返回“OK”。 2、 AT+Bxxxx 更改串口波特率指令。可设置波特率为1200bps、2400bps、4800bps、9600bps、19200bps 、38400bps 、57600bps 和115200bps。出厂默认为9600bps。 ...

汇编语言
28.试用查询方式编写一数据块发送程序,数据块首址为内部RAM的30H单元,其长度为20个字节,设串行口工作于方式1,传送的波特率为9600 bps(主频为6MHz),不进行奇偶检验处理。29.试用查询方式编写一程序:从串行口接收10H个字符,放入以2000H为首址的外部RAM区,串行口工作于方式1,波特率2400 bps(不采用子程序调用方式...

51单片机按键控制数码管?
PCON = 0x80; \/\/ 数据位8、停止位1。效验位无 (11.0592M)TH1 = 0xF4; \/\/TH1: reload value for 2400@11.0592MHz TR1 = 1; \/\/启动定时器1 ES = 1; \/\/允许串口中断位 EA = 1; \/\/允许总中断位 c=0;s=1;k=0;P1 =~table[k];while(1){ if(k0==0 && y0...

怎样将51单片机实验板的按键信号传给PC啊。比如按一个键,51给PC发送...
SCON = 0x50; \/\/REN=1允许串行接受状态,串口工作模式1 TMOD|= 0x20; \/\/定时器工作方式2 PCON|= 0x80;TH1 = 0xF3;\/\/ \/\/baud*2 \/* 波特率4800、数据位8、停止位1。效验位无 (12M)TL1 = 0xF3;TR1 = 1;ES = 1; \/\/开串口中断 EA = 1; \/\/ 开总中断 }...

相似回答