打印

单片机串口通信问题,急!!菜鸟新手,请教大侠!

[复制链接]
1691|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
billcba|  楼主 | 2009-4-26 20:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我刚学单片机,在单片机开发板上做试验。我现在遇到一个很头痛的问题,想了几天也解决不了。我的设计要求是这样的:pc给单片机发送一个或者多个字符,然后单片机控制显示在LCD1602上,然后再把字符发回给PC机。现在的问题是;1,我做出来的结果是,我发送的字符给单片机,单片机不知道是不是根本没有收到还是怎么的,我的LCD上根本没有显示我发的字符,PC机也没有回收到。2,当我把主程序中的LCD显示的程序屏蔽掉,不要LCD显示了,只是简单的发送和接收时,一切都正常了。(当我把程序设计功能改为:PC给单片机发字符,单片机控制LCD在第一行显示所发字符,然后回发给PC,如果PC没有字符发给单片机时,LCD就在LCD第二行显示“I LOVE YOU”。而这时候上面一直显示的是在第二行显示i love you,因为我设计程序中,判断单片机它收到的是不是阿拉伯数字和英文字母的字符,不是则在第二行显示i love you,是则在第一行显示相应的字符。这到底怎么回事??为什么不显示我发送的字符,而一直只显示这些?)我知道应该是我对串行通信的原理和其他的什么关键的东西还没有了解到,希望这里的大侠能够帮忙指点,非常感谢各位————
一个渴望搞好单片机的学生。

:#include <REGX51.h> 
sbit rs=P3^0; 
sbit rw=P3^1; 
sbit en=P3^2; 
sfr db=0x80; 
unsigned char tmp,tp; 
unsigned char code str[]={"i lvoe you"}; 
int sd; 
void initcom() 

TMOD = 0x20; //定时器工作方式2,初值自动装入 
PCON = 0x00; //波特率不增倍 
SCON = 0x50; //串行工作方式设定 
TH1 = 0xa0; //定时器初值高位 
TL1 = 0xa0; //定时器初值低位 
ES=1; 
TR1 = 1; //启动定时器 
EA=1; 

/*函数功能:延时程序*/ 
void delay() 

int k; 
for(k=0;k<600;k++); 

unsigned char busy() //判断lcd忙不忙 

rs=0; 
rw=1;en=1; 
if(db&0x80) 
return 1;else 
return 0;} 

void wclcd(unsigned char t)//写命令到LCD 
{ en=0; 
rs=0; 
rw=0; 
P0=t; 
en=1; 

en=0;while(busy()) busy();delay();} 

void wdlcd(unsigned char i)//写数据到LCD 

en=0;P0=i; 
rs=1; 
rw=0; 
en=1; 

en=0; 
while(busy()) busy();} 
void initlcd()//lcd初始化 
{wclcd(0x01); 
wclcd(0x38); 
wclcd(0x0c); 
wclcd(0x06); 
wclcd(0x84);} 
void sentback(unsigned char a)//回发给PC 
{SBUF=a; 
while(TI==0); 
TI=0; 


void main()//主函数 
{ int j=0; 
initlcd(); 
initcom(); 
while(1) 

if(sd==1) 
{wclcd(0x84); 
wdlcd(tp); 
sentback(tp);} 
else 
{wclcd(0xc4); 
for(j=0;j<10;j++) 
wdlcd(str[j]); 
}}} 

void serial() interrupt 4 

EA=0; 
if(RI==1) 
{tmp=SBUF; 
RI=0; 
if(tmp>=48&&tmp<=57)//开始判断是不是阿拉伯数字或者英文字母的字符,是则标志位为1,不是为0; 
{sd=1;tp=tmp;} 
else if((tmp>=65)&&(tmp<=90)) 
{sd=1;tp=tmp;} 
else if((tmp>=97)&&(tmp<=122)) 
{sd=1;tp=tmp;} 
else sd=0;} 
else 
{TI=0;} 
EA=1; 
}
我的程序在下面:大侠可能不用看也知道我的问题了,

相关帖子

沙发
dragon_hn| | 2009-4-26 21:01 | 只看该作者

先关掉那些有可能导致死循环的语句

先关掉那些有可能导致死循环的语句,例如
while(busy()) busy();

在没有仿真器的情况下,怀疑哪部分程序有问题就关闭,一次关闭一小部分程序,一直到最后找到出问题的程序所在。

另外写单片机程序要避免写类似
while(busy()) busy();
可能造成假死机的语句,上述语句可以改为:
for(int i=0;i<200;i++)
{
    if(!busy())
        break;
}

使用特权

评论回复
板凳
billcba|  楼主 | 2009-4-26 21:58 | 只看该作者

谢谢大侠!

二楼的大侠,非常感谢你的建议。不过我按照你的建议改过以后,还是达不到目标。
  我现在想是不是因为单片机已经处于接收信息的状态,当我们就算不给它发信息,只要RI=0, SBUF也一直接收0x00,而且速度很快,这样我给它发数据时,存入SBUF的数据还没有被我读取或者处理完,就被后面自动接收的无用的0X00冲刷掉了?? 如果是,请问大家,我该怎么解决这个问题。谢谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

4

帖子

0

粉丝