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小时内删除。
发表评论