定时器方式2: 8位自动重装 波特率 9600
#include
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++);
}
}