单片机串口接收程序

来源:百度知道 编辑:UC知道 时间:2024/06/06 03:41:54
串口发送可以正常显示,可是不懂串口接收怎么弄,一定要用串口中断吗,怎么调都不出来,下面这个程序有错吗,请大家指教
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
bit read_flag;
uchar c;
void init()
{
TMOD=0x20; //定时器1,模式2,8位重装
SCON=0x50; //串口工作方式1,允许接收
PCON=0x80; //令SMOD=1,倍频
TH1=0xF4;
TL1=0xF4; //波特率=4800
EA=1;
ES=1;
ET1=0;
TR1=1;
RI=1;
}
com_interrupt(void)interrupt 4 using 3
{
while(1)
{
uchar a;
if(RI)
{
RI=0;
c=SBUF;
while(RI==0);
for(a=0;a<20000;a++);
}
}
}
void main()
{
init();
}
刚按1楼的改了下,好象也没有用,能写个短点的可以成功调试的例子给我看下吗?
回答2楼,我的晶振是11.0592MHZ的,应该没有问题的

1:首先将接收到的数据放在数组中,下标是已接收字节计数器原值加1,注意计数器是从0开始的计数的。
2:判断接收字节计数器是否大于2,若大于2,则判断计数器长度减2是否等于下标为2的数组中的数据;若不大于2,则退出中断服务程序继续接收数据。若计数器长度减2等于下标为2的数组中的数据,则说明一帧数据接收完毕,将接收完毕待处理标志置位,否则退出中断服务程序继续接收数据。
3:主程序时刻监测接收完毕待处理标志,一旦标志被置位,立即对数据进行处理,然后将计数器清零、标志清除、数组清空。

我来改改。
要求在P1应外接8个LED,显示接收数据
//--------------------程序如下
void init()
{
TMOD=0x20; //定时器1,模式2,8位重装
SCON=0x50; //串口工作方式1,允许接收
PCON=0x80; //令SMOD=1,倍频
TH1=0xF4;
TL1=0xF4; //波特率=4800
TR1 = 1;

RI = 0; /* =0可以不写 */
EA = 1;
ES = 1;

/* ET1=0; 不用T1中断 */
}

com_interrupt(void)interrupt 4 using 3
{
if(RI)
{
RI = 0;
c = SBUF; /*读出接收数据*/
P1 = c; /*显示,P1应外接8个LED*/
}
}

void main()
{
init();

while(1); /*主函数里加一个死循环*/

}

单片机串口接收可以采用中断或者查询两种方法来实现。
1、中断方式:
#include<reg51.h>
unsigned char x;<