本帖最后由 lubaodong 于 2013-5-18 22:02 编辑
//用“串口调试助手”来与单片机通信。上位机发送一个字符,单片机收到后,再发送给上位机。
//在串口中断服务程序用,使用调用子函数的方法接收字符。
//用receive_msg_1()无法接收数据,用receive_msg_2()可以接收数据。
//为什么receive_msg_1()无法接收数据,而receive_msg_2()可以,希望大家给讲解一下!
#include<reg52.h>
#define uchar unsigned char
uchar code i_get[]="i get ";
uchar code i_ready[]="i am ready!\n";
uchar cha,num,flag; //flag用于主函数中查询是否产生了串行中断,以便接收数据。
void UART_init()
{
TMOD=0x20; //确定定时器1工作方式为方式2,8位自动重装计数器
TH1=0xfd; //装初值,确定波特率
TL1=0xfd; //装初值,确定波特率
TR1=1; //定时器1运行
SM0=0; //确定串行工作方式为方式1
SM1=1;
REN=1; //允许串行接收
EA=1; //开总中断
ES=1; //开串行中断
}
void send_msg(uchar ch)
{
ES=0;
SBUF=ch;
while(!TI);
TI=0;
ES=1;
}
void response_msg(uchar ch)
{
ES=0;
flag=0;
for(num=0;num<6;num++)
{
SBUF=i_get[num];
while(!TI);
TI=0;
}
SBUF=ch;
while(!TI);
TI=0;
SBUF='\n';
while(!TI);
TI=0;
ES=1;
}
/*
void receive_msg_1(uchar ch) //此函数无法接受数据
{
RI=0;
ch=SBUF;
flag=1;
}
*/
uchar receive_msg_2() //此函数可以接受数据
{
uchar ch;
RI=0;
ch=SBUF;
flag=1;
return ch;
}
void main()
{
uchar i;
UART_init();
for(i=0;i<12;i++)
send_msg(i_ready);
while(1)
if(flag)
response_msg(cha);
}
void uart_receive() interrupt 4
{
cha=receive_msg_2(); //可以接收数据
// receive_msg_1(cha); //无法接收数据
/* //直接用代码,不调用子函数,可以接收数据。
RI=0;
cha=SBUF;
flag=1;
*/
}
|