单片机串口通信

    今天编写了一个简单的单片机串口通信的程序,用串口调试助手调试程序,一直得不到所要的结果。以为是程序出了问题,但是多次检查程序,实在是找不出问题所在,纠结了半天,最后才知道是串口调试助手的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;

}

}

}

}

 

 

}

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值