3390|8

77

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

c51接收部分一接收像死机了一样! [复制链接]

c51接收部分一接收像死机了一样!我在串口助手中发送的数据为:02000102
节点号为2,
一发送本来显示的界面为:
1.输入开始
2.节点设置
请选择:
可是一发送,在第0行0列显示请选择*
按键也没有反应,像列了一样?郁闷死了?
#include
#include
#include
//51 Receive Protocol: |节点号|长度|数据
#define uchar unsigned char
#define uint unsigned int
#define keyborad P0
#define MAXLEN 6      //最大位数
#define MAXLEN_STATION 3   //最大的节点长度
#define True 1
#define False 0
#define READY 0x66            //握手信号
#define BUSY 0x15            //忙信号
//#define ERROR 0xf0
//#define SUCCESS 0xff
#define BUFFER_LEN 10       //缓冲区长度

//0x41=A,0x46=F
uchar digits[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45};
uint StationID;  //地址号
uchar StationH,StationL; //高8位,低8位
//uchar addrH,addrL;
uchar station[MAXLEN_STATION];
uchar WorkNo[MAXLEN]={10,10,10,10,10,10};
uchar Qty[MAXLEN]={10,10,10,10,10,10};
uchar inputbuf[MAXLEN]={10,10,10,10,10,10};
uchar sendbuffer[BUFFER_LEN];   //发送缓存
uchar ReceiveBuf[BUFFER_LEN]={10,10,10,10,10,10};  //接收缓存
uchar len;                   //个数
uchar ipoint; //输入指针
uchar tmp;
uchar Status_Key=0;  //上次按键
uchar groupmenu;  //菜单组别
bit Write_Success;
bit IsWorkNo;
bit IsQty;
sbit LED=P2^5;
sbit wela=P2^7;
sbit dula=P2^6;


uchar key_press();
uchar key_scan();
void init_serial();  //串口初始化
void delaymain(uint ms);
uchar CheckNodeLen(uchar *s);
uchar CheckWorkNoLen(uchar *s);
void clrinputbuf(void);
void displaymenu(uchar level);
//void senddata(uchar *buffer,uchar length);//发送数据
void IntToArray(uint num,uchar *array);
uint ArrayToInt(uchar array[]);
uchar nodeid[3];

//把整数转换为单个数字并存于数组
void IntToArray(uint num,uchar *array)
{
// uchar tmp;
  uchar A;//商数
  uchar B;//余数
  A=num;
  tmp=num;
  while(A>0)
  {
    A=tmp / 10;
    B=tmp % 10;
    *array=B;
        array++;
        tmp=A;

  }
}
//把数组中的数转为数字
uint ArrayToInt(uchar array[])
{ uchar i;
  uint id;
  id=0;
  for(i=0;i     id=id*10+array;
  return id;

}


void senddata()
{ uchar i;
  i=0;
  tmp=BUSY;
  while(tmp!=READY)
  {
          SBUF=READY;   //发送握手信号
          while(TI==0);
          TI=0;
          RI=0;
          while(RI==0); //等待接收完成应答
          tmp=SBUF;
          RI=0;
  }

  for(i=0;i   {
     SBUF=station;
     while (TI==0);
     TI=0;
  }
  for(i=0;i   {  
    SBUF=WorkNo;
    while(TI==0);
        TI=0;
  }
  for(i=0;i   {
    if ( Qty!=10 )
    {   
          SBUF=Qty;
          while(TI==0);
          TI=0;
        }
  }

}

void init_serial()
{
// SCON: |SM0|SM1|SM2|REN|TB8|RB8|TI|RI
    SCON=0x50;//串口工作方式2
    ES=1;//开串口中断
//PCON:  |SMOD|  |   |   |   |   |  |
    PCON=0x00;//波特率  9600
//TMOD:TMOD: |GATE|C/T|M1|M0|GATE|C|M1|M0
    TMOD=0x20;//定时器T1工作方式2
    TH1=0xfd;//初值
    //TL1=0xfd;
//控制寄存器TCON: |TF1|TR1|TF0|TR0
    TR1=1;//开定时器
    EA=0;  //关总中断

}
void displaymenu(uchar level)
{

if (level==0)
{
  lcm_clr();
  LCD_set_xy(1,1);
  lcm_w_word("1.输入开始");
  LCD_set_xy(2,1);
  lcm_w_word("2.节点设置");
  LCD_set_xy(3,1);
  lcm_w_word("请选择:");
  groupmenu=0;
}
if (level==11)
{
  lcm_clr();
  LCD_set_xy(1,0);
  lcm_w_word("A-工单号 B-PCS");
  groupmenu=11;
}
if (level==21)
{
  lcm_clr();
  LCD_set_xy(1,0);
  lcm_w_word("旧节点号:");
  groupmenu=21;
}

}

void clrinputbuf(void)
{
  uchar i;
  for (i=0;i   {inputbuf=10;}
  ipoint=0;
}


void delaymain(uint ms)
{
        uint i,j;
        for (j=0;j                 for (i=0;i<120;i++);
}

void ClrWorkNo()
{
uchar i;
for(i=0;i<6;i++)
{ WorkNo=10;}
}
void clrQty()
{
uchar i;
for(i=0;i<6;i++)
{ Qty=10;}
}
//检查数据是否有效
uchar CheckQtyLen(uchar array[])
{
  uchar len,i;
  len=0;
  i=0;
  for(i=0;i   {
    if (array!=10) { len++;break;}
  }
  if ( len>0 ) return True;
  else return False;
}

//检查工单号长度是否为6位
uchar CheckWorkNoLen(uchar array[])
{
uchar len, i;
i=0;
len=0;
for(i=0;i<6;i++)
{ if (array==10)
   { break; }
   len=len+1;
}
//write_data(digits[len]);
if (len==6) return True;
else return False;
}
//检查节点长度是否为3位
uchar CheckNodeLen(uchar *s)
{
uchar i;
i=0;
while(*s != 10)
{
  s++;
  i++;
}
//write_data(i+0x30);
if (i<3 || i>3 ) return False;
else return True;

}


//判断是否有键按下
uchar key_press()
{
    uchar key;
        keyborad=0xf0;  
        key=keyborad;
        key=key&0xf0;
        if(key==0xf0)
          {
             return 0;
          }
        else
     {
         return 1;   //有键被按下

           }

}


//键盘扫描 板载低四位行扫,高四位列扫
uchar key_scan()
{
    uchar key;
        if(key_press())    //是否有键按下
           {
             //P3=0xfe;
                 //key=P3;
         keyborad=0xfe;
         key=keyborad;
                 switch (key)
                 {
                                                case 0xee:return 1;
                                                case 0xde:return 2;
                                                case 0xbe:return 3;
                                                case 0x7e:return 10;
                 }

          
         keyborad=0xfd;
                 key=keyborad;
                 switch (key)
                 {
                                                case 0xed:return 4;
                                                case 0xdd:return 5;  
                                                case 0xbd:return 6;
                                                case 0x7d:return 11;
                 }

          
         keyborad=0xfb;
                 key=keyborad;
                 switch (key)
                 {
                                                case 0xeb:return 7;
                                                case 0xdb:return 8;
                                                case 0xbb:return 9;
                                                case 0x7b:return 12;  //C
                 }

          
         keyborad=0xf7;
                 key=keyborad;
                 switch (key)
                 {
                                                case 0xe7:return 15; //*
                                                case 0xd7:return 0;  //0
                                                case 0xb7:return 14; //# --E
                                                case 0x77:return 13; //D
                 }

          

       }  //if end

}

/*
//接收中断
void UART_Routine(void) interrupt 4
{

  addrL=SBUF;

  receive(ReceiveBuf);
}
*/


最新回复

wwp
发送也可以是查询啊。   详情 回复 发表于 2010-6-4 12:00
点赞 关注

回复
举报

82

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
帖子过长下面的是:
void main()
{

  uchar i,key;
   
  LED=0;
  wela=0;
  dula=0;

  init_serial(); //初始化串口
  IsWorkNo=0;
  IsQty=0;
  lcm_init();
  LCD_set_xy(1,1);
  lcm_w_word("1.输入开始");
  LCD_set_xy(2,1);
  lcm_w_word("2.节点设置");
  LCD_set_xy(3,1);
  lcm_w_word("请选择:");
  ipoint=0;
  groupmenu=0;
//  station_len=MAXLEN_STATION;
  for(i=0;i   {  station=byte_read(DEBUG_Data_Memory_Begin_Sector_addr+i); }
  StationID=ArrayToInt(station);
  StationH=StationID >> 8;
  StationL=StationID & 0x00ff;
// IntToArray(StationID,nodeid);
  LCD_set_xy(4,0);
//  if (StationH==0x00) write_data(0x41);
//  if (StationL==0x7b) write_data(0x42);
//  write_data(digits[StationH]);
//  write_data(digits[StationL]);
  while(1)
  {

    if (RI==1)  //查询是否有数据接收完成
    {
          if (StationL^SBUF == 0x00 )  //接收地址号的低8位
          { RI=0;
           // write_data(0x33);
            while(RI==0);
        if (StationH^SBUF == 0x00)  //接收地址号的高8位
                {// write_data(0x43);
                  RI=0;
                  while(RI==0);
                  len=SBUF;
                  RI=0;
                  for(i=0;i                   {
                    while(RI==0);
                    ReceiveBuf=SBUF;
                        RI=0;
                  }
                }
                RI=0;
      }
         
      for(i=0;i        write_data(digits[ReceiveBuf]);   //显示接到的数据
          RI=0;
    }  //if

    if (ReceiveBuf[0]==2) write_data(0x44);
    if( key_press() )
    {
        key=key_scan();
                delaymain(50);
                while(key_press());//松手
      
        if (key==14)  //#为返回键 返回上一层
        { groupmenu=0;
                   displaymenu(groupmenu);
                  IsWorkNo=0;
                  IsQty=0;
          key=30;
          ipoint=0;
          for(i=0;i              inputbuf=10;

        }
        //14-# 10-A,11-B
        if ( groupmenu==11 && IsWorkNo==0 && IsQty==0  && key!=14 && key!=10 && key!=11) continue;
        if ( key==1 && groupmenu==0)
        {
          groupmenu=11;
                  displaymenu(groupmenu);
          key=30;
        }
        if ( key==2 && groupmenu==0 )
        {
          groupmenu=21;
                  displaymenu(groupmenu);
          for(i=0;i           {write_data(digits[station]);}
          LCD_set_xy(2,0);
          key=30;
        }  
                if (key==10) //A--工单号
                {
          if (groupmenu != 11 ) continue;  //不是数据输入界面
                  lcm_delline(2);
                  lcm_delline(4);
                  clrinputbuf();
                  LCD_set_xy(4,0);
                  lcm_w_word("输入工单号");                 
                  LCD_set_xy(2,0);
                  IsWorkNo=1;
          IsQty=0;
                }
                if (key==11)  //B--数量
                {
                  if (groupmenu != 11 ) continue;   //不是数据输入界面
                  lcm_delline(2);
                  lcm_delline(4);
                  clrinputbuf();
                  LCD_set_xy(4,0);
                  lcm_w_word("输入PCS");
                  LCD_set_xy(2,0);
                  IsQty=1;
          IsWorkNo=0;
                }
        if (key==12)  //删除键C
        {
          lcm_delline(2);  
          inputbuf[--ipoint]=10;
          LCD_set_xy(2,0);
          for(i=0;i           {
             if (inputbuf<10)   
             {  write_data(digits[inputbuf]); }
          }
        }
   
        if ( key==13 )   //确定键D
        {
           if (groupmenu==21) //输入的是节点号
           {  
                      if ( CheckNodeLen(inputbuf) )  //检查节点位数
              {
                                  for(i=0;i                       { station=inputbuf;}
                   Write_Success=True;
                       sector_erase(DEBUG_Data_Memory_Begin_Sector_addr);
                       for(i=0;i                        {                             
                         if ( byte_program(DEBUG_Data_Memory_Begin_Sector_addr+i,station) == False ) { Write_Success=False;}
                       }
                                   if (Write_Success==True)
                                   {
                                     LCD_set_xy(4,0);lcm_w_word("设置成功请重启!");
                                         while(1);
                                   }
                                   else {LCD_set_xy(4,0);lcm_w_word("节点设置失败!");}

                          }
           }
           if ( groupmenu==11 )
           {
                     if ( IsWorkNo   )
                         {
                           for(i=0;i                             WorkNo=inputbuf;
               if ( CheckWorkNoLen(WorkNo) ==False )
                           { continue;}

                         }
                         if ( IsQty )
                         {
                           for(i=0;i                            { if ( inputbuf!=10 )
                             { Qty=inputbuf;}
               }
                         }
                       
        //    for(i=0;i                 //        { if (IsWorkNo)
        //      write_data(digits[WorkNo]);
        //      if (IsQty)
        //      { if ( Qty!= 10 )  write_data(digits[Qty]); }
           //        }
           
            clrinputbuf();lcm_delline(2);

              }

        }
        if ( key == 15 ) //* --发送
        {
               
                 clrinputbuf();
             ///*
                 //for(i=0;i<6;i++)
                 //{if (IsQty)
         //     { if ( Qty!= 10 )  write_data(digits[Qty]); }
         // }
         //*/
          if ( CheckQtyLen(Qty) && CheckWorkNoLen(WorkNo) )
                  {
                     //hold_hand();
                    senddata();
            LCD_set_xy(4,0);
                        lcm_w_word("发送成功!");
                       
              }//if(TI==0) send();else receive()
          clrQty();
                  ClrWorkNo();
                 
        }//发送结束
                //当在录入时按下D确定键
        if ( Status_Key>=13 && groupmenu==11 && (key!=10 || key!=11)) continue;
        if ( key>=0 && key <= 9 && groupmenu>0 && ipoint                 {
          write_data(digits[key]);
          inputbuf[ipoint++]=key;  //先引用再加1
                }
    }//按键结束
    if (key>=10 && key<=15)
          Status_Key=key;  //保存这次的按键

  } //while(1)结束

}

 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
//当在录入时按下D确定键
  if ( Status_Key>=13 && groupmenu==11 && (key!=10 || key!=11)) continue;

这个红色的语句,判断的结果永远是true?
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

4
 
不会的,这个只是当在输入工单号是时按了d健就不能按数字了,没问题的现在是把发部分去掉,就可以接收了,把接收不部分去掉,发送也ok'俩个并存就用问题了
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

5
 
有收有发的情况,可以先用查询来实现。
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

6
 
接收我就是用查寻的发法啊,在main中的啊,看到了吗?
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

7
 
upupupupupupupupupupupupupupupupupup
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

8
 
顶个upup
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 5 楼 computerzzz 的回复:
接收我就是用查寻的发法啊,在main中的啊,看到了吗?

发送也可以是查询啊。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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