久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3089|回復: 10
打印 上一主題 下一主題
收起左側

誰有空幫忙解釋下這個程序可否。。實在看不懂

[復制鏈接]
跳轉到指定樓層
樓主
ID:125710 發表于 2016-11-1 10:23 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
sbit  Send_EN  =  P5^5;

bit  Busy;//設置單次發送完成標志
bit  uart1_rec_ok; //命令到達標志
bit  uart1_rec_ok1;
bit  uart1_rec_ok2;


unsigned char Rec_data[5];
unsigned char Send_data[7];
unsigned char rec_addr;  //撥碼開關
unsigned char Rec_point;//字節數
/*********************************************************************************/
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位數據,可變波特率
        AUXR |= 0x04;              //定時器2時鐘為Fosc,即1T
        T2L = 0xE0;                     //設定定時初值
        T2H = 0xFE;                     //設定定時初值
        AUXR |= 0x01;                //串口1選擇定時器2為波特率發生器
        AUXR |= 0x10;                //啟動定時器2
        ES = 1;
        EA = 1;
}
/*********************************************************************************/

void system_init(void)
{

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

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

Send_EN = 1;    //RS485設置為發送方向
for(i=0;i<6;i++)//發送6個字節
  {
   Uart1sendData(*send_str);
   send_str++;
  }       
Send_EN = 0;//RS485設置為接收方向
}
/*********************************************************************************/
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)//延時
     {
          read_time = 0;
          XD_74hc165_Readdata();//讀取165
          rec_addr = P1&0X0F;//設置撥碼開關
         }
/*-------------------------------------------------*/   
   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;     //發生串口中斷
    uart1_rec_data = SBUF; //把收到的數據給uart1_rec_data


        if(uart1_rec_ok2)      //檢測幀頭
          {          
           Rec_data[Rec_point] = SBUF; //保存接收字節,并遞增計數器
           Rec_point++;                //繼續接收字節
           if(Rec_point>=5)            //空閑時間超過4個字節傳輸時間即認為一幀命令接收完畢
             {
                  Rec_point = 0;             //字節清0
                  uart1_rec_ok2 = 0;
                  uart1_rec_ok = 1;         //命令到達標志
                 }          
          }
        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)   //字節發送完畢
   {
           TI=0;  //手動清零發送中斷標志位
        Busy=0;//設置單次發送完成標志
   }
}




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

我現在不明白的地方有幾個希望指點指點
bit  uart1_rec_ok1;
bit  uart1_rec_ok2;
分別定義的什么標識符 如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個字節,這3個字節共有24個進制位 加0X00是什么意思。
就以上問題特求大神指點




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

使用道具 舉報

沙發
ID:125710 發表于 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 為什么要先檢測55而不是AA
回復

使用道具 舉報

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

回帖獎勵 +10

AA應該是校驗數 如果是正確的就過 不正確就不過
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

8#
ID:61840 發表于 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);
                        }

多發一個0X00是為了消除前面數據對串并轉換過程中移位留存影響。

回復

使用道具 舉報

9#
ID:125710 發表于 2016-11-2 22:52 | 只看該作者
mercizy999 發表于 2016-11-1 14:20
校驗字為 0xaa55...校驗的實質是把這個字運算器 XRL運算,所以,先AA還是先55其實要看CPU是大端的還是小端 ...

什么是大端CPU和小端CPU
回復

使用道具 舉報

10#
ID:145840 發表于 2016-11-2 23:10 | 只看該作者
看不懂,寫點注解呀
回復

使用道具 舉報

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99视频免费在线观看 | 亚洲国产精品一区二区三区 | 在线观看国产视频 | 久久亚洲国产 | 亚洲一区二区免费 | 国产999精品久久久久久绿帽 | 一区在线播放 | 黄色网址免费在线观看 | 国产亚洲精品久久久久久牛牛 | 国产精品一区一区三区 | 91精品国产91久久久久游泳池 | 玖玖综合网 | 综合久久综合久久 | 欧美成年人视频在线观看 | 久久成人精品视频 | 日韩在线不卡视频 | 黄频免费 | 嫩草视频在线看 | 一区二区国产精品 | 国产日韩一区二区三区 | 久久精品国产v日韩v亚洲 | 亚洲免费观看视频网站 | 日韩一区二区三区视频 | 午夜免费网 | 久久国产精品91 | 精产国产伦理一二三区 | 99成人免费视频 | 天天夜夜操 | www.一级片 | 99精品热视频 | 中文精品视频 | 亚洲精品99| www.午夜| 免费在线观看一区二区三区 | 日韩久久中文字幕 | 亚洲一区二区免费看 | 国产亚洲欧美日韩精品一区二区三区 | 精品欧美一区二区在线观看视频 | 久久亚洲精品国产精品紫薇 | 成人亚洲精品久久久久软件 | 97国产在线视频 |