今天编写了一个简单的单片机串口通信的程序,用串口调试助手调试程序,一直得不到所要的结果。以为是程序出了问题,但是多次检查程序,实在是找不出问题所在,纠结了半天,最后才知道是串口调试助手的COM端口用错了。用串口调试助手,我没有查看是哪个端口,直接看哪个端口能够打开,就用哪个端口,结果COM3端口可以打开,因此一直用的是COM3端口。但我改为COM4端口时,程序运行很正常。由此看来,以后调试程序时,要多分析原因,而不能仅仅纠结于程序,还要看看硬件等其它可能出错的地方,才能快速找到原因的所在。
再次附上自己的小程序:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar i,m,j;
uint temp0,temp1,speed,getchar,jd;
sbit p20=P2^0;
/**************************************
函数名称:uart_init
功能: uart初始化函数
参数:无
返回值:无
**************************************/
void uart_init()
{
TMOD=0x20; //定时器1,工作方式2
TH1=0xfd; //波特率9600 11.0592MHZ
TL1=0xfd;
TR1=1; //开定时器
REN=1; //允许串行接收
SM0=0; //工作方式1
SM1=1;
EA=1; //开总中断
ES=1; //开串行中断
}
void delay0(uint x)
{
for(i=3;i>0;i--)
for(j=x;j>0;j--);
}
//用软件查询方式
void getspeed()
{
while(!RI) //等待接收数据完毕
;
RI=0;
}
//脉冲产生函数
void jiaodu(uint b)
{
jd=b;
for(m=30;m>0;m--)
{
p20=1;
delay0(jd);
p20=0;
delay0(600-jd);
}
}
//主函数
void main()
{
uart_init();
while(1)
{
getspeed();
temp0=SBUF;
if(temp0==0xF6)
{
for(i=0;i<4;i++)
{
getspeed();
temp1=SBUF;
if(i==3)
{
speed=temp1;
if (speed<0x10&&speed>=0) {getchar=5;P0=0x00;}
else if(speed<0x15&&speed>=0x10) {getchar=10;P0=0x01;}
else if(speed<0x20&&speed>=0x15) {getchar=15;P0=0x02;}
else if(speed<0x25&&speed>=0x20) {getchar=20;P0=0x03;}
else if(speed<0x30&&speed>=0x25) {getchar=25;P0=0x04;}
else if(speed<0x36&&speed>=0x30) {getchar=30;P0=0x05;}
else if(speed<0x42&&speed>=0x36) {getchar=35;P0=0x06;}
else if(speed>=0x42) {getchar=40;P0=0x07;}
}
switch(getchar)
{
case 5:
jiaodu(5);
break;
case 10:
jiaodu(10);
break;
case 15:
jiaodu(15);
break;
case 20:
jiaodu(20);
break;
case 25:
jiaodu(25);
break;
case 30:
jiaodu(30);
break;
case 35:
jiaodu(35);
break;
case 40:
jiaodu(40);
break;
default :
break;
}
}
}
}
}