首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

一个UART通信程序,看不太懂,求指教解决思路

2013-01-25 
一个UART通信程序,看不太懂,求指教#include reg51.h//define baudrate const//BAUD 256 - SYSclk/3/BA

一个UART通信程序,看不太懂,求指教
#include "reg51.h"

//define baudrate const

//BAUD = 256 - SYSclk/3/BAUDRATE/M (1T:M=1; 12T:M=12)//这里的的计算公式是怎么来的

//NOTE: (SYSclk/3/BAUDRATE) must be greater than 98, (RECOMMEND GREATER THAN 11 0)

//#define BAUD 0xF400 // 1200bps @ 11 .0592MHz

//#define BAUD 0xFA00 // 2400bps @ 11 .0592MHz

//#define BAUD 0xFD00 // 4800bps @ 11 .0592MHz

//#define BAUD 0xFE80 // 9600bps @ 11 .0592MHz

//#define BAUD 0xFF40 //19200bps @ 11 .0592MHz

//#define BAUD 0xFFA0 //38400bps @ 11 .0592MHz

//#define BAUD 0xEC00 // 1200bps @ 18.432MHz

//#define BAUD 0xF600 // 2400bps @ 18.432MHz

//#define BAUD 0xFB00 // 4800bps @ 18.432MHz

//#define BAUD 0xFD80 // 9600bps @ 18.432MHz

//#define BAUD 0xFEC0 //19200bps @ 18.432MHz

#define BAUD 0xFF55 //38400bps @ 18.432MHz

//#define BAUD 0xE800 // 1200bps @ 22.11 84MHz

//#define BAUD 0xF400 // 2400bps @ 22.11 84MHz

//#define BAUD 0xFA00 // 4800bps @ 22.11 84MHz

//#define BAUD 0xFD00 // 9600bps @ 22.11 84MHz

//#define BAUD 0xFE80 //19200bps @ 22.11 84MHz

//#define BAUD 0xFF40 //38400bps @ 22.11 84MHz

//#define BAUD 0xFF80 //57600bps @ 22.11 84MHz




sfr AUXR = 0x8E;

sbit RXB = P3^0; //define UART TX/RX port

sbit TXB = P3^1;

typedef bit BOOL;

typedef unsigned char BYTE;

typedef unsigned int WORD;

BYTE TBUF,RBUF;

BYTE TDAT,RDAT;

BYTE TCNT,RCNT;//baudrate counters

BYTE TBIT,RBIT;

BOOL TING,RING;//is recive/transmit or not

BOOL TEND,REND;//mark the transmit or recive when they are complete 

void UART_INIT();

BYTE t, r;

BYTE buf[16];

void main()

{

TMOD = 0x00; //timer0 in 16-bit auto reload mode

AUXR = 0x80; //timer0 working at 1T mode

TL0 = BAUD;

TH0 = BAUD>>8; //initial timer0 and set reload value

TR0 = 1; //tiemr0 start running

ET0 = 1; //enable timer0 interrupt

PT0 = 1; //improve timer0 interrupt priority

EA = 1; //open global interrupt switch

UART_INIT();

while (1)

{ //user's function

if (REND)

{

REND = 0;

buf[r++ & 0x0f] = RBUF;

}

if (TEND)

{

if (t != r)

{

TEND = 0;

TBUF = buf[t++ & 0x0f];



TING = 1;

}

}

}

}

 

//Timer interrupt routine for UART

void tm0() interrupt 1 using 1//中断程序的思想是什么,设计思路

{

if (RING)

{

if (--RCNT == 0)

{

RCNT = 3; //reset send baudrate counter

if (--RBIT == 0)

{

RBUF = RDAT; //save the data to RBUF

RING = 0; //stop receive

REND = 1; //set receive completed flag

}

else

{

RDAT >>= 1;

if (RXB) RDAT |= 0x80; //shift RX data to RX buffer

}

}

}

else if (!RXB)

{

RING = 1; //set start receive flag

RCNT = 4; //initial receive baudrate counter

RBIT = 9; //initial receive bit number (8 data bits + 1 stop bit)

}

if (--TCNT == 0)
{

TCNT = 3; //reset send baudrate counter

if (TING) //judge whether sending

{

if (TBIT == 0)

{

TXB = 0; //send start bit

TDAT = TBUF; //load data from TBUF to TDAT

TBIT = 9; //initial send bit number (8 data bits + 1 stop bit)

}

else

{

TDAT >>= 1; //shift data to CY

if (--TBIT == 0)

{

TXB = 1;

TING = 0; //stop send

TEND = 1; //set send completed flag

}

else

{

TXB = CY; //write CY to TX port

}

}

}

}

}

 

//initial UART module variable

void UART_INIT()

{

        TING = 0;

        RING = 0;

        TEND = 1;

        REND = 0;

        TCNT = 0;

        RCNT = 0;

}

在线求指教啊,说的明白了有更多的分相送,本人菜鸟,刚学习单片机一周多,尽量说通俗易懂点的,用的单片机stc-15f104e
[解决办法]
以前有用过51的UART通信,但是现在没用51了,这个不是很难,如果你想学话,就建议你看一本书《51单片机从零开始》,是清华出版的,讲的很详细。
[解决办法]
这程序还有注释的,不是太难,前面一段都是宏定义,后面的一些,像这样的TMOD,这应该是单片机的串口相关寄存器,通过写这些寄存器就确定了串口工作方式。另外这段代码不完整吧?程序里面是用中断方式 在进行数据接收和发送,但却只有主程序,没有中断处理。其它的就是C语言的基础了
[解决办法]
看不懂就多看几遍
[解决办法]
注释挺多的,基本都讲明白了。


看不懂可能是因为对51不熟悉

热点排行