打印

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

[复制链接]
1709|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
billcba|  楼主 | 2009-4-26 20:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我刚学单片机,在单片机开发板上做试验。我现在遇到一个很头痛的问题,想了几天也解决不了。我的设计要求是这样的: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; 
}



相关帖子

沙发
dxpol432| | 2009-4-26 21:16 | 只看该作者

:

屏蔽部分过程,可证明USART 通信正常
不是MCU 不显示,是你没有让 MCU 显示

使用特权

评论回复
板凳
因特网用户| | 2009-4-26 21:25 | 只看该作者

懒得看

“当我把主程序中的LCD显示的程序屏蔽掉,不要LCD显示了,只是简单的发送和接收时,一切都正常了”

LCD显示的时候屏蔽了串口中断?
中断要一直开着,接受到数据就放到消息队列里面,显示的时候读出来

使用特权

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

不好意思,能说得清楚点吗?

“不是MCU 不显示,是你没有让 MCU 显示”
二楼的大侠,不好意思,能说详细点吗?我还是不太明白你的意思。        if
(sd==1) 
{wclcd(0x84); 
wdlcd(tp); 
sentback(tp);}  因为我这句已经有在主程序里了,我觉得应该是已经有让MCU控制lcd显示了。

使用特权

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

本版积分规则

2

主题

4

帖子

0

粉丝