打印

求高手帮看一下这个单片机和Pc机通信的c51程序

[复制链接]
1960|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yel_bit|  楼主 | 2009-8-6 15:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 yel_bit 于 2009-8-6 15:31 编辑

用单片机和Pc机进行串口通信,下面是我的程序,要实现的功能是:Pc机给单片机发送b的时候返回 invalid,发送其他的字符时返回 十六进制的 65,76,43三个数。程序没有错误也没有警告 ,就是通信的时候第一次发b时能返回invalid,再发的时候就什么也不返回。求高手帮忙看一下,小弟提前谢过啦!

#include<reg52.h>
#include<string.h>
#define uchar unsigned char
#define uint unsigned int
#define length 10
uchar temp,flag,i;
uchar line[length]="invalid!";
uchar code serial_data[]={0x65,0x76,0x43};
void serial_send_str(uchar temp);
void serial_send_string(uchar strlen);
void main()
{
TMOD=0x20; //定时器T1工作在方式1;
TH1=0xfd;  //设置波特率为:9600;
TL1=0xfd;
TR1=1;     //开定时器T1;
SM0=0;
SM1=1;
REN=1;     //设置串口工作方式1;
EA=1;      //开总中断;
ES=1;      //开串口中断;
  while(1)
{
  
  if (flag==1&temp=='b')
  {
   flag=0 ;
   serial_send_string(length);  
  }
  if(flag==1&temp!='b')   
  {
   ES=0;
   flag=0;
   for(i=0;i<3;i++)
   {
    SBUF=serial_data;
    while(!TI);
    TI=0;
   }
   ES=1;
  }
}
}
void serial_send_str(uchar temp)  //发送字符子程序;
{
ES=0;
SBUF=temp;
while(!TI);
TI=0;
ES=1;
}
void serial_send_string(uchar strlen)
{
uchar k;
while(k<strlen)
{
  serial_send_str(line[k]);
  k++;
}
}
void serial_receive() interrupt 4  //中断接收子程序;
{
RI=0;
temp=SBUF;
flag=1;
}

相关帖子

沙发
gunaaaa| | 2009-8-6 15:47 | 只看该作者
if (flag==1&temp=='b')
if(flag==1&temp!='b')   
这两个地方有问题

使用特权

评论回复
板凳
yel_bit|  楼主 | 2009-8-6 15:57 | 只看该作者
2# gunaaaa

那该怎么改呢?谢谢!给详细的说一下吧

使用特权

评论回复
地板
auzxj| | 2009-8-6 16:12 | 只看该作者
要注意发送和接受都会进中断,你这里可能没处理好

使用特权

评论回复
5
auzxj| | 2009-8-6 16:13 | 只看该作者
2楼和你说的是运算符的优先级,你查查C语言书印象会深刻一些

使用特权

评论回复
6
一朝成名| | 2009-8-6 16:17 | 只看该作者
改为&&,是该看看书,这么写程序。。。。。。。。。

使用特权

评论回复
7
auzxj| | 2009-8-6 16:23 | 只看该作者
if (flag==1&temp=='b')  貌似和if (flag==1&&temp=='b') 效果一样

使用特权

评论回复
8
mohanwei| | 2009-8-6 16:26 | 只看该作者
不要卖弄技巧,老实加括号,括号才是最直观最真实的……

使用特权

评论回复
9
yel_bit|  楼主 | 2009-8-7 10:16 | 只看该作者
谢谢各位的建议呀,本人已经解决啦!原来是k加到length以后没有把k再置成0!

使用特权

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

本版积分规则

4

主题

5

帖子

0

粉丝