STC12C5202AD 51单片机串口通信配置模板

定时器方式2:  8位自动重装   波特率 9600

#include<reg52.h>      
 
void delayms(int x)  
{  
    int i, j;  
    for(i = x; i; --i)  
    for(j= 110; j; --j);  
    return ;  
} 
 
void initSCI(void)    
{    
	SM0 = 0;      /*Step 1 :  确定串口通信方式*/      
    SM1 = 1; 
          
    TMOD = 0x20;  /*step 2: 根据串口通信方式 确定是否设置波特率*/       
    TH1  = 0xfd;      
    TL1  = 0xfd;      
          
    TR1  = 1;     /*step 3 :启动*/      
    REN  = 1;      
    
	EA = 1;       /*step 4: 是否启用中断函数*/      
    ES = 1;     
}    
    
void putChar (unsigned char chr)//发送一个字符    
{    
    SBUF = chr;                                                      
}    
    
void putStr(unsigned char str[], unsigned char n)    
{    
    while( n-- )    
    {    
        SBUF = str[n];    
		delayms(1); 
    }    
}    
      
int main()      
{      
    initSCI();     
          
    while(1)    
    {    
		putChar('A');
        //operation;      
    }        
    return 0;       
}      
      
void ser() interrupt 4      
{      
    if( RI )      
    {      
        RI = 0;      
        /*Operation SBUF*/      
    }      
    if( TI )      
    {      
        TI = 0;       
    }      
    return ;      
} 


Clue 1:发送函数中加延时  否则乱码

Clue 2:ISP软件烧写时 Step4选择外部晶体振荡器  否则乱码

(注意串口中断和发送函数  TI清零重复了 导致无法连续发送)

#include "reg51.h"
#include "intrins.h"

void SendData(unsigned char dat);
void SendString(char *s);

void delay(unsigned char n)
{
	unsigned char i, j;
	for(i = n; i; --i)
	for(j = 110; j; --j);
}

void main()
{
	SCON = 0x50;
	TMOD = 0x20;
	TH1 = TL1 = 0xfd;
	TR1 = 1;
	ES  = 1;
	EA  = 1;
	
	SendString("STC12C5201AD\r\nUart Test!\r\n");
	while(1);
}

void Uart_Isr() interrupt 4 using 1
{
	if( RI )
	{
		RI = 0;
	}
	if(TI)
	{
		TI = 0;
	}
}

void SendData(unsigned char dat)
{
	SBUF = dat;
	while(!TI);
	delay(5);
	TI = 0;
	delay(5);
}

void SendString(char *s)
{
	while(*s)
	{
		SendData(*s++);
	}
}


你可能感兴趣的:(STC12C5202AD 51单片机串口通信配置模板)