我刚学单片机,在单片机开发板上做试验。我现在遇到一个很头痛的问题,想了几天也解决不了。我的设计要求是这样的: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; }
|