3185|6

68

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

51单片机与上位机的串口通讯问题!!! 急急急 [复制链接]

应该没什么问题的啊,就是不通讯 ! 程序如下:
#include                          
#include                
#define uchar unsigned char       
#define        uint unsigned int
uchar idata InBuffer[11];
uchar idata revbuffer[5];
sbit ctrl01=P2^0;
sbit ctrl02=P2^1;
sbit ctrl03=P2^2;
sbit ctrl04=P2^3;
sbit ctrl05=P2^4;
sbit ctrl06=P2^5;
void sendanswer(uchar datalen);      
void init_io();
uchar readaddr();
void main()
{
        PCON=0x00;               
        EA=1;
        ES=1;
        TI=0;
        RI=0;
        REN=1;
        IP=0x10;
        SCON=0x50;       
          TCON=0x00;       
          TMOD=0x21;       
        TL1=0xfd;
        TH1=0xfd;
        while(1);   
}

uchar readaddr()
{uchar myaddr,i;
P0=P0|0xf0;     
i=P0;
i=~i;
myaddr=i+0xA0;
return myaddr;
}
void uart_com()interrupt 4 using 1   
{  uchar temp;
    uchar checkchar;
    uchar CharN;  
    bit cmdend = 0;
    uchar MeterN;
    RI=0;
    if(SBUF!=0x01)
    {return;}
    RI=0;
    if (SBUF == 0xFF)     
   {
      MeterN=0xff;
   }
    else if ((SBUF>=0xa0) && (SBUF<=0xb0))                
   {
      MeterN=SBUF-0xa0;
   }
   else
   {
      return;
   }
   InBuffer[0]=0x01;  
   InBuffer[1]=SBUF;
   RI=0;
   cmdend = 0;
   CharN = 2;
    while(cmdend == 0)
   {
      if(RI==1)
      {          RI = 0;
         InBuffer[CharN] = SBUF;
         cmdend = 0;
         CharN++;
      }
          if( CharN>=10        ) {break;}
   }
      do
      {
      CharN=CharN-1;
      }
      while(InBuffer[CharN]!=0x17)
     if(CharN<3){return;}
     /* checkchar = 0;
   for(temp=0;temp<=(CharN-2);temp++)
   {
      checkchar=checkchar+InBuffer[temp];
   }
  if (checkchar!=InBuffer[CharN-1])
   {
      return;
   }    */
    sendanswer(2);
    if(InBuffer[3]==0x30)        {ctrl01=0;}                              
    if(InBuffer[4]==0x30)        {ctrl02=0;}
    if(InBuffer[5]==0x30)        {ctrl03=0;}
    if(InBuffer[6]==0x30)        {ctrl04=0;}
    if(InBuffer[7]==0x30)        {ctrl05=0;}
    if(InBuffer[8]==0x30)        {ctrl06=0;}
     
}
void sendanswer(uchar datalen)
{ uchar check_char,i ;
   uint k=0;
   revbuffer[0]=0x01;
     revbuffer[1]=readaddr();
    revbuffer[2]=0x06;
     check_char=revbuffer[0]+revbuffer[1]+revbuffer[2];
     revbuffer[datalen+1]=check_char;
     revbuffer[datalen+2]=0x17;
         if((TI==1)&& k<=(datalen+2) )
      {          TI = 0;
             ACC=revbuffer[k];
         SBUF=ACC;
       k++;
     
          }
  for(i=0;i<=datalen+2;i++)
     {
      revbuffer=0x00;
     }
}  
通讯规约:主机:0x01 + 控制板通讯地址 + 0x10 (命令)
+ 遥控信号1 (CTRL01)状态 0x30(低电平)/0x31(高电平)
+ 遥控信号2 (CTRL02)状态 0x30(低电平)/0x31(高电平)
+ 遥控信号3 (CTRL03)状态 0x30(低电平)/0x31(高电平)
+ 遥控信号4 (CTRL04)状态 0x30(低电平)/0x31(高电平)
+ 遥控信号5 (CTRL05)状态 0x30(低电平)/0x31(高电平)
+ 遥控信号6 (CTRL06)状态 0x30(低电平)/0x31(高电平)
+ 校验位 + 结束(0x17)
   从机:0x01 + 控制板通讯地址 + 06H / 15H(06H表示接受正常,15H表示接受异常,)
+校验位+结束(0x17)
  (0xFF为广播地址,从机无回答)




   
  
   


   

   






最新回复

众位楼主,如果想要用单片机实现真彩液晶显示的话,可以跟我索取资料的。dwin99@live.cn   详情 回复 发表于 2009-8-29 20:26
点赞 关注

回复
举报

65

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
好有难度,哎
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
问题倒是很简单。不过无注释的代码看起来太痛苦。pass
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

4
 
从硬件方面找找问题
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

5
 
不通信是什么意思?串口不能发出东西?
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

6
 
能不能代码加点注释。现在应该没人看懂你的代码吧?就算能,也没时间去看你代码什么意思。
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

7
 
众位楼主,如果想要用单片机实现真彩液晶显示的话,可以跟我索取资料的。dwin99@live.cn
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表