|
本帖最后由 Aguilera 于 2019-3-10 12:36 编辑
能够在一个标准的MSC51单片机上,编制出来了能够实现通讯的UART通讯程序时,问题并没有结束。您还需要进一步了解的知识还包括下面几个方面:
1,非标准的MSC51单片机
市面上有大量的“51兼容单片机”,但是,通常这些单片机的兼容性仅仅表现在机器指令系统兼容、最基础的一些特殊寄存器兼容,对于UART来说,未必兼容。
使用这一类单片机时,您需要注意的是下面几点:
A,UART工作模式。有可能会牵扯到1到3个不同的寄存器,这些寄存器必须要仔细的检查,设置成您 所需要的通讯编码模式。
B,UART时钟发生器。有可能并不使用MSC51所使用的时钟发生方法,您需要仔细的阅读单片机规格 书,确定如何设置UART的时钟发生器。
C,IO端口性质。当您设置使能UART时,相应的IO端口并不一定能够符合您所想的IO性质,需要额外 的对该单片机相应IO端口设置合适的输入、输出性质。
2,32位单片机
32位单片机在使用UART时,会有更多的可选编程项,并且通常会有配套的IO库来帮助编程者实现功能。仔细的阅读IO库的使用方法,并且选择您所需要的合适的波特率、通讯位数等设置项,然后使用相应的库函数来设置您所需要的通讯设置。
3,软件串口
有些低成本单片机,不带有硬件UART,或者有些单片机因为复用IO,不得不放弃使用硬件UART时,就需要使用软件模拟的UART了。使用软件模拟UART功能时,通常会使用一个延时软件来模拟波特率发生器的功能(有时也可以使用时钟中断来操作),那么最重要的事情是检查波特率是否合适,通常需要配合示波器观察通讯波形,确定延时是否准确,保证波特率符合要求。
下面是一个软件UART的例子。该例子使用10位通讯字,P0.0作为TX管脚使用。
#include “reg51.h”
#include
sbit UARTO = P0^0;
void UART_Delay( void )
{
unsigned char DelayNum;
// 该数据决定延时长短,需要在软件实际运转时,调整该数据
DelayNum = 50;
while( DelayNum -- ){};
// 后面的几个 NOP,对延时进行微调
_nop_( );
_nop_( );
_nop_( );
}
// 这个发送程序以通讯字10位为例
void UART_Send( unsigned char TChar
{
unsigned char UartCnt;
unsigned char SendData;
bit EAState;
EAState = EA;
SendData = TChar;
EA = 0;
UARTO = 0;
UART_Delay( );
// 后面的几个 NOP,对延时进行微调。
// 以保证起始位和后面的数据位在时间上一致
_nop_( );
_nop_( );
for( UartCnt = 0; UartCnt < 8; UartCnt ++ )
{
If( SendData & 0x01 )
UARTO = 1;
else
UARTO = 0;
UART_Delay( );
SendData >>= 1;
}
UARTO = 1;
UART_Delay( );
UART_Delay( );
EA = EAState;
}
|
|