找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3091|回復(fù): 10
打印 上一主題 下一主題
收起左側(cè)

誰有空幫忙解釋下這個(gè)程序可否。。實(shí)在看不懂

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:125710 發(fā)表于 2016-11-1 10:23 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
sbit  Send_EN  =  P5^5;

bit  Busy;//設(shè)置單次發(fā)送完成標(biāo)志
bit  uart1_rec_ok; //命令到達(dá)標(biāo)志
bit  uart1_rec_ok1;
bit  uart1_rec_ok2;


unsigned char Rec_data[5];
unsigned char Send_data[7];
unsigned char rec_addr;  //撥碼開關(guān)
unsigned char Rec_point;//字節(jié)數(shù)
/*********************************************************************************/
void delay_ms(unsigned int time)   // //@11.0592MHz
{
unsigned char i, j;

do
   {
           _nop_();
        _nop_();
        _nop_();
        i = 11;
        j = 190;
        do
        {
                while (--j);
        } while (--i);
   }
while(time--);
}
/*********************************************************************************/
void uart1_init(void)
{
        SCON = 0x50;                  //8位數(shù)據(jù),可變波特率
        AUXR |= 0x04;              //定時(shí)器2時(shí)鐘為Fosc,即1T
        T2L = 0xE0;                     //設(shè)定定時(shí)初值
        T2H = 0xFE;                     //設(shè)定定時(shí)初值
        AUXR |= 0x01;                //串口1選擇定時(shí)器2為波特率發(fā)生器
        AUXR |= 0x10;                //啟動(dòng)定時(shí)器2
        ES = 1;
        EA = 1;
}
/*********************************************************************************/

void system_init(void)
{

XD_74hc595_init();
XD_74hc165_init();
uart1_init();
}

/*********************************************************************************/
void Uart1sendData(unsigned char send_data)//寫發(fā)送串口數(shù)據(jù)
{
  while(Busy);      //檢測(cè)是否發(fā)送
  Busy=1;          //設(shè)置單次發(fā)送標(biāo)志
  SBUF=send_data;  //把需要發(fā)送的數(shù)據(jù)給SBUF
}
/*********************************************************************************/
void  serial_send(unsigned char *send_str)//發(fā)送數(shù)據(jù)
{
unsigned char i;

Send_EN = 1;    //RS485設(shè)置為發(fā)送方向
for(i=0;i<6;i++)//發(fā)送6個(gè)字節(jié)
  {
   Uart1sendData(*send_str);
   send_str++;
  }       
Send_EN = 0;//RS485設(shè)置為接收方向
}
/*********************************************************************************/
void main(void)
{
unsigned char read_time;
// unsigned char i,j;
// unsigned char ceshi_data;

system_init();

while(1)
  {
  read_time++;
  if(read_time>=50)//延時(shí)
     {
          read_time = 0;
          XD_74hc165_Readdata();//讀取165
          rec_addr = P1&0X0F;//設(shè)置撥碼開關(guān)
         }
/*-------------------------------------------------*/   
   if(uart1_rec_ok)
     {
          uart1_rec_ok = 0;
          if(Rec_data[0]==rec_addr)
            {
                 if(Rec_data[1]==0x01)
                    {
                          XD_write_74hc595(Rec_data[2],Rec_data[3],Rec_data[4]);
                          delay_ms(120);
                          HC595_SRCLK = 0;
                          HC595_EN_A = 1 ;
                          HC595_EN_B = 1 ;
                          HC595_EN_C = 1 ;
                        }
                 if(Rec_data[1]==0x00)
                    {
                         XD_74hc165_Readdata();
                         Send_data[0]=XD_74hc165_DATA[0];
                         Send_data[1]=0x00;
                         Send_data[2]=XD_74hc165_DATA[1];
                         Send_data[3]=0x00;
                         Send_data[4]=XD_74hc165_DATA[2];
                         Send_data[5]=0x00;
                         serial_send(Send_data);
                        }
                }
         }
/*-------------------------------------------------*/           
  }

}

/*********************************************************************************/
void Uart1_int()   interrupt 4
{
unsigned char uart1_rec_data;
  if(RI)
   {
    RI=0;     //發(fā)生串口中斷
    uart1_rec_data = SBUF; //把收到的數(shù)據(jù)給uart1_rec_data


        if(uart1_rec_ok2)      //檢測(cè)幀頭
          {          
           Rec_data[Rec_point] = SBUF; //保存接收字節(jié),并遞增計(jì)數(shù)器
           Rec_point++;                //繼續(xù)接收字節(jié)
           if(Rec_point>=5)            //空閑時(shí)間超過4個(gè)字節(jié)傳輸時(shí)間即認(rèn)為一幀命令接收完畢
             {
                  Rec_point = 0;             //字節(jié)清0
                  uart1_rec_ok2 = 0;
                  uart1_rec_ok = 1;         //命令到達(dá)標(biāo)志
                 }          
          }
        else
          {
           if(uart1_rec_ok1)
             {
                  if(uart1_rec_data==0x55)
                    {
                         uart1_rec_ok1 = 0;
                         uart1_rec_ok2 = 1;
                         Rec_point = 0;
                        }
                  else
                    {
                         uart1_rec_ok1 = 0;
                         Rec_point = 0;
                    }
                 }
           else
            {
                 if(uart1_rec_data==0xaa)
                  {
                   uart1_rec_ok1 = 1;
                  }
                }
          }        
   }
if(TI)   //字節(jié)發(fā)送完畢
   {
           TI=0;  //手動(dòng)清零發(fā)送中斷標(biāo)志位
        Busy=0;//設(shè)置單次發(fā)送完成標(biāo)志
   }
}




以上中文字都是自己加進(jìn)去的不知道是否正確 接收格式AA 55  01 00 XX  XX XX         AA 55代表頭幀 01代表地址  00代表數(shù)據(jù)類型  XX XX XX任意值
0x00表示讀LED的狀態(tài),0x01表示打開繼電器
后面三個(gè)字節(jié)可為任意值,單片機(jī)收到該條命令后,會(huì)返回3個(gè)字節(jié),這3個(gè)字節(jié)共有24個(gè)進(jìn)制位,分別代表24個(gè)LED的狀態(tài),LED點(diǎn)亮相應(yīng)的位為0,否則為1。

我現(xiàn)在不明白的地方有幾個(gè)希望指點(diǎn)指點(diǎn)
bit  uart1_rec_ok1;
bit  uart1_rec_ok2;
分別定義的什么標(biāo)識(shí)符 如uart1_rec_ok1=0代表什么  =1代表什么


if(Rec_data[1]==0x00)
                    {
                         XD_74hc165_Readdata();
                         Send_data[0]=XD_74hc165_DATA[0];
                         Send_data[1]=0x00;
                         Send_data[2]=XD_74hc165_DATA[1];
                         Send_data[3]=0x00;
                         Send_data[4]=XD_74hc165_DATA[2];
                         Send_data[5]=0x00;
                         serial_send(Send_data);
                        }

返回的是3個(gè)字節(jié),這3個(gè)字節(jié)共有24個(gè)進(jìn)制位 加0X00是什么意思。
就以上問題特求大神指點(diǎn)




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:125710 發(fā)表于 2016-11-1 10:32 | 只看該作者
if(uart1_rec_ok1)
             {
                  if(uart1_rec_data==0x55)
                    {
                         uart1_rec_ok1 = 0;
                         uart1_rec_ok2 = 1;
                         Rec_point = 0;
                        }
                  else
                    {
                         uart1_rec_ok1 = 0;
                         Rec_point = 0;
                    }
                 }
           else
            {
                 if(uart1_rec_data==0xaa)
                  {
                   uart1_rec_ok1 = 1;
                  }
                }
          }         

格式明明是AA 55 為什么要先檢測(cè)55而不是AA
回復(fù)

使用道具 舉報(bào)

板凳
ID:138155 發(fā)表于 2016-11-1 13:51 | 只看該作者

回帖獎(jiǎng)勵(lì) +10

AA應(yīng)該是校驗(yàn)數(shù) 如果是正確的就過 不正確就不過
回復(fù)

使用道具 舉報(bào)

地板
ID:145514 發(fā)表于 2016-11-1 14:20 | 只看該作者
校驗(yàn)字為 0xaa55...校驗(yàn)的實(shí)質(zhì)是把這個(gè)字運(yùn)算器 XRL運(yùn)算,所以,先AA還是先55其實(shí)要看CPU是大端的還是小端的,如果是大端和小端的區(qū)別在于 一個(gè)兩個(gè)字節(jié)的字傳送時(shí)候是先高字節(jié)還是低字節(jié):
小端的是低字節(jié)在前高字節(jié)在后,同樣 字的傳送也是這個(gè)道理,
你這個(gè)CPU如果是大端的,而且那么傳送一個(gè)字(2個(gè)字節(jié)),就會(huì)是先傳 高字節(jié) 0xaa,再傳0x55,也就是先aa 再55
否則,小端的CPU是先 55 再aa
回復(fù)

使用道具 舉報(bào)

5#
ID:111634 發(fā)表于 2016-11-1 18:16 | 只看該作者
看不懂,就去找看得懂的程序,對(duì)照著看。
回復(fù)

使用道具 舉報(bào)

6#
ID:111634 發(fā)表于 2016-11-1 18:16 | 只看該作者
老是找看不懂的程序,自找麻煩。
回復(fù)

使用道具 舉報(bào)

7#
ID:111634 發(fā)表于 2016-11-1 18:19 | 只看該作者
你看不懂,別人即使看懂,也許化很多時(shí)間去揣摩。不要再找這些無厘頭的程序讓所謂“大神”診斷!
回復(fù)

使用道具 舉報(bào)

8#
ID:61840 發(fā)表于 2016-11-2 22:36 | 只看該作者
if(Rec_data[1]==0x00)
                    {
                         XD_74hc165_Readdata();
                         Send_data[0]=XD_74hc165_DATA[0];
                         Send_data[1]=0x00;
                         Send_data[2]=XD_74hc165_DATA[1];
                         Send_data[3]=0x00;
                         Send_data[4]=XD_74hc165_DATA[2];
                         Send_data[5]=0x00;
                         serial_send(Send_data);
                        }

多發(fā)一個(gè)0X00是為了消除前面數(shù)據(jù)對(duì)串并轉(zhuǎn)換過程中移位留存影響。

回復(fù)

使用道具 舉報(bào)

9#
ID:125710 發(fā)表于 2016-11-2 22:52 | 只看該作者
mercizy999 發(fā)表于 2016-11-1 14:20
校驗(yàn)字為 0xaa55...校驗(yàn)的實(shí)質(zhì)是把這個(gè)字運(yùn)算器 XRL運(yùn)算,所以,先AA還是先55其實(shí)要看CPU是大端的還是小端 ...

什么是大端CPU和小端CPU
回復(fù)

使用道具 舉報(bào)

10#
ID:145840 發(fā)表于 2016-11-2 23:10 | 只看該作者
看不懂,寫點(diǎn)注解呀
回復(fù)

使用道具 舉報(bào)

11#
ID:89217 發(fā)表于 2016-11-10 09:59 | 只看該作者
void Uart1sendData(unsigned char send_data)//寫發(fā)送串口數(shù)據(jù)
{
   while(Busy);      //檢測(cè)是否發(fā)送
  Busy=1;          //設(shè)置單次發(fā)送標(biāo)志
  SBUF=send_data;  //把需要發(fā)送的數(shù)據(jù)給SBUF
}總覺得這個(gè)有點(diǎn)問題,一開始是0 怎么檢測(cè)的過?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表