C51 中断接收 查询发送
#include <REGX51.H>
volatile unsigned char rx_data;
volatile bit rx_flag = 0;
void dalay_1ms(unsigned short n)
{
unsigned short i,j;
for(i=0; i<n; i++)
{
for(j=60000; j>0; j--);
}
}
void send_char(unsigned char ch)
{
SBUF = ch;
while(!TI);
TI = 0;
}
void send_string(unsigned char *str, unsigned char len)
{
unsigned char i;
for(i=0; i<len; i++)
{
send_char(*(str+i));
}
}
//----------------------------------------------
void main (void)
{
// volatile unsigned char i,tmp;
unsigned char *str = "Serial test";
TMOD = 0x20; //T1方式2
TH1 = 0xFD; //Baud:9600bps@11.0592MHz
TL1 = 0xFD;
TR1 = 1; //启动定时器1
SCON = 0x50; //串口方式1, 8-n-1, 允许接收
REN = 1; //使能串口接收
EA = 1; //打开总中断
ES = 1; //打开串口中断开关
send_string((unsigned char *)str, 11);
while(1)
{
dalay_1ms(1);
if(rx_flag)
{
ES = 0; //必须得先关串口中断,否则PC收不到数据
SBUF = rx_data;
while(RI == 0);
ES = 1; //再开串口中断
RI = 0;
}
}
}
//----------------------------------------------
void serial(void) interrupt 4
{
rx_data = SBUF;
P1 = rx_data;
rx_flag = 1;
RI = 0;
}
//----------------------------------------------