#include<reg52.h>
#include<intrins.h>
sfr AUXR= 0x8e;
unsigned char TXtemp[10];
unsigned char RXtemp[10];
unsigned char readflag;
unsigned char ch_i;
bit overflag;
void delay()
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 43;
j = 6;
k = 203;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
//////////////////////////////定时器初始化/////////////////////
void timer0_init()
{
TMOD|=0X01;
TH0=(65535-2000)/256;
TL0=(65535-2000)%256;
EA=1;
ET0=1;
TR0=1;
}
///////////////////////////////串口初始化///////////////////////
void UartInit(void) //9600bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
ES=1;
}
//通过串口发送字符串
void uart_sendstring(unsigned char *str)
{
unsigned char *p;
p = str;
while(*p != '\0')
{
SBUF = *p;
while(TI == 0); //等待发送标志位置位
TI = 0;
p++;
}
}
void main()
{
P2=(P2&0X1F)|0XA0;
P0=0X00;
P2=P2&0X1F;
UartInit();
timer0_init();
while(1)
{
if(overflag)
{
overflag=0;
ch_i=0;
uart_sendstring(RXtemp);
}
}
}
void timer0() interrupt 1
{
static unsigned char num;
TH0=(65535-2000)/256;
TL0=(65535-2000)%256;
num++;
if(num==100)
{
num=0;
readflag=1;
}
}
void uart() interrupt 4
{
if(RI)
{
RI=0;
RXtemp[ch_i]=SBUF;
ch_i++;
if(RXtemp[ch_i-1]=='G')overflag=1;
}
}
这是最基本中断接受字符串写法。 根据此可延伸各种上位机指令需改参数,发送命令等操作。。。。。