51单⽚机串⼝通信(4个模式)基础知识,以及汇编程序(可移植)(有查询⽅式和中断⽅式)(时。。。
⼀,代码(ASM和C)
1汇编语⾔(只是发送接收模板,没有校验功能)
//*******************************************************
//题⽬:/*定义串⼝通信的4中⼯作模式包括中断*/
//语⾔:汇编语⾔(51MCU)
//功能:各种模式汇总(但接收中断没有验证位)
//参考资料:STC89C52官⽅数据⼿册
//只是各个功能得演⽰,没有校验过程,适合学习
//*******************************************************
//设置校验位
#define NONE_PARITY    0  //没有校验位
#define ODD_PARITY    1  //奇校验位
#define EVEN_PARITY    2  //偶校验位
#define MARK_PARITY    3  //校验位始终为1
#define SPACE_PARITY  4  //校验位始终为0
#define MY_PARITY      0//⾃⼰设置校验位
TXD_BUSY BIT 20H.0    //定义发送过程标志位
R_DATA  DATA 21H
R_PARITY BIT 20H.1
ORG 0000H
AJMP MAIN
ORG 0023H        //串⼝中断起始位
LJMP UART_TR
ORG 0030H
MAIN:
CLR  TXD_BUSY
CLR  EA
MOV  SP,  #3FH  //压栈保护后⾯程序
#if(MY_PARITY==NONE_PARITY)
MOV  SCON, #50H  ;8位
#elif(MY_PARITY==ODD_PARITY||MY_PARITY==EVEN_PARITY||MY_PARITY==MARK_PARITY)
MOV  SCON, #0DAH  ;9位,校验位初始化为1
#elif(MY_PARITY==SPACE_PARITY)
MOV  SCON, #0D2H  ;9位,校验位初始化为0
#endif
MOV  TMOD,#20H  //定时器1⼯作⽅式2,波特率9600;对于晶振11.0592MHz来说
MOV  TH1,#0FDH    //没有误差
MOV  TL1,TH1
SETB  EA          //开启总中断
SETB  ES          //开启串⼝中断
SETB  TR1        //启动定时器
//--------------------
MOV  DPTR, #TABLE_TR
LCALL SEND_string    ;发送字符串
AJMP $
TABLE_TR:  DB "1234567890"
UART_TR:  //中断判断发送(TI)接收(RI)
PUSH ACC
PUSH PSW
PUSH PSW
JNB  RI, CHECK_TI  //表⽰接收中断没发⽣,然后跳转检测TI
CLR  RI    //收到数据,存在SBUF
MOV  R_DATA, SBUF  //得到⼀个字节,暂存R_DATA
MOV  C, RB8      //校验位引出
MOV  R_PARITY, C
CHECK_TI:
JNB  TI, EXIT_TR
CLR  TI        //注意在TB8是在发送数据设置得与连接另个接收RB8联动验证
CLR  TXD_BUSY  //清楚标志位;
EXIT_TR:
POP  PSW
POP  ACC
RETI
SEND_ONEBYTE:
JB  TXD_BUSY, $ //利⽤中断,避免查询占⽤CUP
MOV  ACC, A    //计算校验位P(PSW.0);在数据转移是数据直接计算P
JNB  P,  EVEN_NACC  //计算得P为偶时,P为0
ODD_NACC:
#if(MY_PARITY==ODD_PARITY)
CLR  TB8  //⾃⼰设置规则
#elif(MY_PARITY==EVEN_PARITY)
SETB  TB8  //⾃⼰设置规则
#endif
AJMP PARITY_END
EVEN_NACC:
#if(MY_PARITY==ODD_PARITY)
CLR  TB8  //⾃⼰设置规则
#elif(MY_PARITY==EVEN_PARITY)
SETB  TB8  //⾃⼰设置规则
#endif
PARITY_END:    //校验位设置完成
SETB  TXD_BUSY  //表⽰在发送,等待中断清零
MOV  SBUF, A
RET
SEND_string:
CLR  A
MOVC  A, @A+DPTR
JZ    SEND_END //最后字符为0
INC  DPTR
LCALL SEND_ONEBYTE
AJMP  SEND_string
SEND_END:
RET
END
2,C语⾔(只是发送接收模板,没有校验功能)
//*******************************************************
//题⽬:/*定义串⼝通信的4中⼯作模式包括中断*/
//语⾔:C语⾔(51MCU)
/
/功能:各种模式汇总(但接收中断没有验证位)
//参考资料:STC89C52官⽅数据⼿册
//只是各个功能得演⽰,没有校验过程,适合学习
//*******************************************************
#include <REGX52.H>
#include "intrins.h"
typedef unsigned char uchar;
typedef unsigned int uint;
//设置校验位
#define NONE_PARITY    0  //没有校验位
#define ODD_PARITY    1  //奇校验位
#define EVEN_PARITY    2  //偶校验位
#define MARK_PARITY    3  //校验位始终为1
#define SPACE_PARITY  4  //校验位始终为0
#define MY_PARITY      0//⾃⼰设置校验位
uchar R_DATA;  //收到数据
bit TXD_BUSY;
bit R_PARITY;  //第九校验位
void Sendonebyte( uchar dat);
void Sendstring(char *s);
void main()
{
#if(MY_PARITY==NONE_PARITY)
SCON=0x50  ;//8位
#elif(MY_PARITY==ODD_PARITY||MY_PARITY==EVEN_PARITY||MY_PARITY==MARK_PARITY)    SCON=0xDA  ;//9位,校验位初始化为1
#elif(MY_PARITY==SPACE_PARITY)
SCON=0xD2  ;//9位,校验位初始化为0
#endif
TMOD=0x20;  //定时器1⼯作⽅式2,波特率9600;对于晶振11.0592MHz来说
TH1=0xFD;    //没有误差
TL1=TH1;
EA=1;          //开启总中断
ES=1;          //开启串⼝中断
TR1=1;        //启动定时器
//--------------------
Sendstring("123456789\n");
while(1);
}
void UART_RT() interrupt 4 using 1  //中断向量4,使⽤第⼀组寄存器
{
if(RI)
{
RI=0;
R_DATA=SBUF;
R_PARITY=RB8;//第九位
}
if(TI)
{
TI=0;
TXD_BUSY=0;
}
}
void Sendonebyte(uchar dat)
{
while(TXD_BUSY);
ACC=dat;
if(P)
{
#if(MY_PARITY==ODD_PARITY)
TB8=0;  //⾃⼰设置规则
#elif(MY_PARITY==EVEN_PARITY)
TB8=1;  //⾃⼰设置规则
#endif
}
else
{
#if(MY_PARITY==ODD_PARITY)
TB8=1;  //⾃⼰设置规则
#elif(MY_PARITY==EVEN_PARITY)
汇编语言要什么基础#elif(MY_PARITY==EVEN_PARITY)
TB8=0;  //⾃⼰设置规则
#endif
}
TXD_BUSY=1;
SBUF=ACC;
}
void Sendstring(char *s)
{
while(*s)
{
Sendonebyte(*s++);
}
}
3 查询校验法
4查询-中断法
⼆串⼝通信(下)
1 串⾏⼝⼯作模式0:同步移位寄存器
在模式0状态,串⾏通信⼯作在同步移位寄存器模式,当当单⽚机⼯作在6T模式时,其波特率固定为S
YSclk/6。当单⽚机⼯作在12T时,其波特率固定为SYSclk/12。串⾏⼝数据由RxD(RxD/P3.0)端输⼊,同步移位脉冲(SHIFTCLOCK)由TxD(TxD/P3.1)输出,发送、接收的是8位数据,低位在先。
模式0的发送过程:当主机执⾏将数据写⼊发送缓冲器SBUF指令时启动发送,串⾏⼝即将8位数据以SYSclk/12或SYSclk/6的波特率从RxD管脚输出(从低位到⾼位),发送完中断标志TI置"1”,TxD管脚输出同步移位脉冲(SHIFTCLOCK)。当写信号有效后,相隔⼀个时钟,发送控制端SEND有效(⾼电平),允许RxD发送数据,同允许TxD输出同步移位脉冲。⼀帧(8位)数据发送完毕时,各控制端均恢复原状态,只有TI保持⾼电平,呈中断申请状态。在再次发送数据前,必须⽤软件将TI清0。
模式0接收过程:模式0接收时,复位接收中断请求标志RI,即RI=0,置位允许接收控制位REN=1时启动串⾏模式0接收过程。启动接收过程后,RxD为串⾏输⼊端,TxD为同步脉冲输出端。串⾏接收的波特率为SYSclk/12或SYSclk/6。其时序图如图8-1中“接收”所⽰。当接收完成⼀帧数据(8位)后,控制信号复位,中断标志RI被置"1",呈中断申请状态。当再次接收时,必须通过软件将RI 清0
⼯作于模式0时,必须清0多机通信控制位SM2,使不影响TB8位和RB8位。由于波特率固定为SYSclk/12或SYSclk/6,⽆需定时器提供,直接由单⽚机的时钟作为同步移位脉冲。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。