cc2530和STC12C5A60S2的串口通信
大神们,交流一下cc2530和STC12C5A60S2的串口通信,包括它们的接线和程序实现。{:smile:}1.硬件连接
CC2530串口(UART0) STC12串口(UART1)
Rx/P0.2------------------------------ TxD/P3.1
Tx/P0.3------------------------------RxD/P3.0
GND ------------------------------GND(共地)
+5V ------------------------------ +5V(共5V电源)
RCD TXD最好串个300~510欧姆电阻。 STC12C5A60S2的串口通信程序,在此记录
/************* ±¾³ÌÐò¹¦ÄÜ˵Ã÷ **************
²âÊÔ·½·¨£º
¸ù¾ÝÄúµÄÖ÷ʱÖӺͲ¨ÌØÂÊÐÞ¸ÄÏÂÃæµÄÏà¹Ø¶¨Ò壬±àÒëºóÏÂÔØµ½MCU¡£
ͨ¹ý´®¿ÚÖúÊÖÏòMCU·¢ËÍÊý¾Ý£¬MCUÊÕµ½ºóÔÑù·µ»Ø¡£
*/
#include <reg51.h>
sfr AUXR = 0x8E;
#define BUF_LENTH 128 //¶¨Òå´®¿Ú½ÓÊÕ»º³å³¤¶È
unsigned char RX0_Cnt;
unsigned char RX0_TimerOut;
unsigned char xdata RX0_Buffer;
bit B_TI;
void uart0_init(void);
/*************** Óû§¶¨Òå²ÎÊý *****************************/
#define MAIN_Fosc 11059200L //define main clock
#define Baudrate0 9600 //define the baudrate,
//12T mode: 600~115200 for 22.1184MHZ, 300~57600 for 11.0592MHZ
//1Tmode: 7200~1382400 for 22.1184MHZ, 3600~691200 for 11.0592MHZ
/**********************************************************/
/****************** ±àÒëÆ÷×Ô¶¯Éú³É£¬Óû§ÇëÎðÐÞ¸Ä ************************************/
#define T1_TimerReload (256 - MAIN_Fosc / 192 / Baudrate0) //Calculate the timer1 reload value at 12T mode
//#define T1_TimerReload (256 - MAIN_Fosc / 16 / Baudrate0) //Calculate the timer1 reload value ar 1T mode
#define TimeOut (28800 / (unsigned long)Baudrate0 + 2)
/**********************************************************/
void main(void)
{
unsigned char i;
unsigned intj;
uart0_init();
while(1)
{
for(j=0; j<1500; j++) ; //14T per loop, delay 1ms
if(RX0_TimerOut != 0)
{
if(--RX0_TimerOut == 0)
{
if(RX0_Cnt != 0)
{
for(i=0; i<RX0_Cnt; i++)
{
B_TI = 0;
SBUF = RX0_Buffer;
while(!B_TI) ;
B_TI = 0;
}
}
RX0_Cnt = 0;
}
}
}
}
void uart0_init(void)
{
PCON |= 0x80; //UART0 Double Rate Enable
SCON = 0x50; //UART0 set as 10bit , UART0 RX enable
TMOD &= ~(1<<6); //Timer1 Set as Timer, 12T
TMOD = (TMOD & ~0x30) | 0x20; //Timer1 set as 8 bits auto relaod
// AUXR |=(1<<6); //Timer1 set as 1T mode
TH1 = T1_TimerReload; //Load the timer
TR1= 1;
ES= 1;
EA = 1;
}
/**********************************************/
void UART0_RCV (void) interrupt 4
{
if(RI)
{
RI = 0;
if(RX0_Cnt >= BUF_LENTH) RX0_Cnt = 0;
RX0_Buffer = SBUF;
RX0_TimerOut = TimeOut; //5ms time out for >= 4800
}
if(TI)
{
TI = 0;
B_TI = 1;
}
}
页:
[1]