一道51单片机的C语言程序,关于串口通讯的,很简单......

好吧,从头到尾麻烦都详细讲一下吧。。。。
就像//这样的注释。。。。。。。。。。。。。。。。。。

利用上位机串口调试助手发送一个字符,单片机收到字符后返回给上位机“I receive, thanks ”。串口的波特率设为9600bps。

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char flag,a,i;
uchar code table1[]=" , thanks ";
uchar code table[]="I receive";

void init()
{
} //设置工作方式,这个懂。

void main()
{
init();
while(1)
{
if(flag==1)
{
ES=0;
for(i=0;i<18;i++)
{
SBUF=table[i];
while(!TI);
TI=0;
}
SBUF=a;
while(!TI);
TI=0;
ES=1;
flag=0;
}
}
}
void serial() interrupt 4
{
RI=0;
a=SBUF;
flag=1;
}

好吧,从头到尾麻烦都详细讲一下吧。。。。
就像//这样的注释。。。。。。。。。。。。。。。。。。
uchar code table1[]=" , thanks ";
uchar code table[]="I receive";
这两句话打错了,应该是
uchar code table[]="I receive, thanks ";

大一学的C语言,大三都忘差不多了...
再加上单片机,更不懂了...
麻烦高手来点详细的解释吧。。。

#include<reg52.h> //增强型52寄存器的定义
#define uchar unsigned char //用uchar代替unsigned char
#define uint unsigned int //用uint代替unsigned int
unsigned char flag,a,i; //定义变量flag,a,i
uchar code table[]="I receive,thanks"; //定义一个字符串数组

void init()
{
} //设置工作方式,这个懂。

void main()
{
init(); //系统初始化,你懂的
while(1) //主循环部分,一直运行
{
if(flag==1) //等待flag标志位置位,当接收到数据的时候在串口接收中断中置位
{
ES=0; //禁止串口中断,但是注意发送中断标志位的置位仍然正常
for(i=0;i<18;i++) //for循环为了一个个把之前定义的字符串
{
SBUF=table[i]; //向串口收发缓冲器中写入回应的内容“I receive,thanks”
while(!TI); //等待发送完成,发送中断标志被置一,否则while循环一直进行
TI=0; //清除发送中断标志位
}
SBUF=a; //继续通过串口向串口收发缓冲器发送a,回显收到的数据
while(!TI); //等待发送完成
TI=0; //清除发送中断标志位
ES=1; //重新使能串口中断
flag=0; //清除flag,为了等待下一次接收
}
}
}
void serial() interrupt 4 //串口中断服务程序,优先级为4
{
RI=0; //当接收完成之后RI被置一,发生串口中断,清标志位
a=SBUF; //读取收到的字符,并赋给变量a
flag=1; //置接收完成标志flag为一,便于主程序中发送响应
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-12-20
托你的福,我也学到了这点,谢谢!
第2个回答  推荐于2017-09-24
#include<reg52.h> //头文件,c语言一样
#define uchar unsigned char //定义unsigned char为uchar
#define uint unsigned int
unsigned char flag,a,i; //定义unsigned char变量,其实这里用uchar也行
uchar code table[]="I receive, thanks "; //定义一个数组,存放到rom中,因为有code

void init()
{
} //设置工作方式,这个懂。

void main()
{
init(); //调用初始化函数
while(1) //while(1)循环,就是一直在这里面循环,一直接收
{
if(flag==1) //等待标志位也就是要等待接收中断执行之后,标志位置1,就是执行接收中断后,flag为1
{
ES=0; //关掉中断
for(i=0;i<18;i++) //for循环,依次取出数据发送(你写错了,是8)
{
SBUF=table[i]; //将你取出的一个uchar型数据送给SBUF
while(!TI); //等待发送完成,当发送完成后TI为1
TI=0; //发送中断清零,智能软件清零如果不清0会一直中断,出错的会
}
SBUF=a; //然后再发个a
while(!TI); //同上
TI=0;
ES=1; //置位中断标志位
flag=0; //清除标志位
}
}
}
void serial() interrupt 4 //中断,注意是interrupt 4
{
RI=0; //当发生中断清楚接收中断标志RI,也就是置0,它只能软件清零,一定要注意,只要你发送或者接收到后,RI和TI都会置位,必须软件清0
a=SBUF; //从SBUF中取出数据
flag=1; //标志位置1
}
呵呵,好了,慢慢来吧,单片机还是挺重要的~~~
记得给分啊~~~
(*^__^*) 嘻嘻……本回答被提问者采纳
相似回答