注册登录

串口总结系列之七:单片机串口编程进阶

        当您能够在一个标准的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 <intrins.h>

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;

}


串口总结系列之八:电脑串口应用初阶

 串口总结系列之六:单片机串口编程实战

 串口总结系列之五:单片机串口编程入门

串口总结系列之四_单片机的UART编程基础

串口总结系列之三_串口通讯协议

串口总结系列之二_单片机串口

串口总结系列之一:电脑串口

0条回复

作者
用户头像
文章 0关注 0粉丝 0
发私信
相关文章
联系客服