標(biāo)題: 51單片機(jī)測風(fēng)速代碼 485型風(fēng)速傳感器 [打印本頁]

作者: 搖籃    時(shí)間: 2018-11-23 10:49
標(biāo)題: 51單片機(jī)測風(fēng)速代碼 485型風(fēng)速傳感器
本代碼自己編寫,51單片機(jī)測風(fēng)速,LCD1602顯示,需風(fēng)速傳感器

單片機(jī)源程序如下:
  1. #include "reg52.h"
  2. #include "LCD.H"   

  3. typedef  unsigned char u8;
  4. typedef  unsigned int u16;
  5. bit flagFrame = 0;
  6. bit flagTxd = 0;
  7. u8 cntRxd = 0;
  8. u8 cntTxd;
  9. u8 pdata bufRxd[7];
  10. u8 *ptrTxd;
  11. u8 crch,crcl;
  12. u8 datas[10];
  13. unsigned char pdata buf[40];

  14. void delayms(u8 ms)   //延時(shí)ms
  15. {      
  16.          u8 i;
  17.          while(ms--)
  18.          {
  19.           for(i = 0; i < 120; i++);
  20.          }
  21. }

  22. unsigned char GetCRC16(unsigned char *ptr,  unsigned char len)
  23. {      
  24.         unsigned int index;   
  25.         unsigned char crch = 0xFF;  //高 CRC 字節(jié)     
  26.         unsigned char crcl = 0xFF;  //低 CRC 字節(jié)   
  27.         unsigned char code TabH[] ={                                                                  //CRC 高位字節(jié)值表
  28.         0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,         
  29.             0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,         
  30.             0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,         
  31.             0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,         
  32.             0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,           
  33.                 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,         
  34.                 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,         
  35.                 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,         
  36.                 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,           
  37.                 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,           
  38.         0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,         
  39.             0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,         
  40.             0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,         
  41.             0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,         
  42.             0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,           
  43.                 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,           
  44.                 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,           
  45.                 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,           
  46.                 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,           
  47.                 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,           
  48.                 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,           
  49.                 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,           
  50.                 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,  
  51.                 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,         
  52.                 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,         
  53.             0x80, 0x41, 0x00, 0xC1, 0x81, 0x40      
  54.                 } ;                  
  55.                  unsigned char code TabL[] = {                                                                  //CRC 低位字節(jié)值表
  56.                  0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,           
  57.                  0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,           
  58.                  0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,           
  59.                  0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,           
  60.                  0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,           
  61.                  0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,           
  62.                  0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,           
  63.                  0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,           
  64.                  0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,           
  65.                  0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,           
  66.                  0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,           
  67.                  0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,           
  68.                  0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,         
  69.                  0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,           
  70.                  0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,           
  71.                  0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,           
  72.                  0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,           
  73.                  0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,           
  74.                  0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,           
  75.                  0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,           
  76.                  0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,           
  77.                  0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,           
  78.                  0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,           
  79.                  0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,           
  80.                  0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,           
  81.                  0x43, 0x83, 0x41, 0x81, 0x80, 0x40      
  82.                  } ;   
  83.                   while (len--)                                               //計(jì)算指定長度的 CRC   
  84.                    {         
  85.                      index = crch ^ *ptr++;         
  86.                      crch = crcl ^ TabH[index];         
  87.                      crcl = TabL[index];     
  88.                    }         
  89.      return((crch<<8)|crcl);   
  90. }

  91. void UsartInit()
  92. {
  93.         SCON=0X50;                        //設(shè)置為工作方式1
  94.         TMOD=0X20;                        //設(shè)置計(jì)數(shù)器工作方式2                                                                                                                                                                                                                          
  95.         PCON=0X80;                        //波特率加倍
  96.         TH1=0XF3;                                //計(jì)數(shù)器初始值設(shè)置,注意波特率是4800的
  97.         TL1=0XF3;
  98.         ES=1;                                                //打開接收中斷
  99.         EA=1;                                                //打開總中斷
  100.         TR1=1;                                        //打開計(jì)數(shù)器
  101. }

  102. void Timer0Init()
  103. {
  104.         TMOD|=0X01;//選擇為定時(shí)器0模式,工作方式1,僅用TR0打開啟動(dòng)。

  105.         TH0=0XFC;        //給定時(shí)器賦初值,定時(shí)1ms
  106.         TL0=0X18;       
  107.         ET0=1;//打開定時(shí)器0中斷允許
  108.         EA=1;//打開總中斷
  109.         TR0=1;//打開定時(shí)器       
  110. }


  111. void UartRxMonitor(unsigned char ms)
  112. {
  113.    static unsigned char cntbkp = 0;
  114.    static unsigned char idletmr = 0;

  115.    if(cntRxd>0)
  116.    {
  117.             if(cntbkp != cntRxd)
  118.          {
  119.                   cntbkp = cntRxd ;
  120.                 idletmr = 0;
  121.          }
  122.           else
  123.           {
  124.              if(idletmr<30)
  125.                  {
  126.                   idletmr += ms;
  127.                    if(idletmr>=30)
  128.                    {
  129.                       flagFrame=1;
  130.                    }
  131.                  }
  132.           }
  133.    }
  134.   else
  135.   {
  136.      cntbkp=0;
  137.   }
  138. }

  139. unsigned char UartRead(unsigned char *buf,unsigned char len)
  140. {
  141.    unsigned char i;

  142.    if(len>cntRxd)
  143.    {
  144.              len = cntRxd;
  145.    }
  146.    for(i=0;i<len;i++)
  147.    {
  148.      *buf++=bufRxd[i];
  149.    }
  150.    cntRxd=0;

  151.    return len;
  152. }

  153. void datapros()
  154. {
  155.    int c;
  156.    c=buf[3]*256+buf[4];
  157.    datas[0]=c/1000;
  158.    datas[1]=c%1000/100;
  159.    datas[2]=c%1000%100/10;
  160.    datas[3]=c%1000%100%10;
  161. }

  162. void UartDriver()
  163. {
  164.   unsigned char len;
  165.   u16 crc;
  166.   if(flagFrame)
  167.   {
  168.     flagFrame = 0;
  169.         len = UartRead(buf,sizeof(buf));
  170.     if(buf[0]!=0x04)
  171.         {
  172.          return;
  173.         }
  174.         crc=GetCRC16(buf,len-2);
  175.         crch = crc>>8;
  176.         crcl = crc&0xFF;
  177.         if((buf[len-2]=crch)&&(buf[len-1]=crcl))
  178.           {
  179.       return;
  180.         }
  181.         else
  182.         {
  183.         datapros();
  184.         }
  185.   }                                                  
  186. }

  187. void LcdDisplay()
  188. {
  189.   LcdWriteCom(0x80);
  190.   LcdWriteData('0'+datas[0]);

  191.   LcdWriteCom(0x81);
  192.   LcdWriteData('0'+datas[1]);

  193.   LcdWriteCom(0x82);
  194.   LcdWriteData('0'+datas[2]);

  195.   LcdWriteCom(0x83);
  196.   LcdWriteData('.');

  197.   LcdWriteCom(0x84);
  198.   LcdWriteData('0'+datas[3]);

  199.   LcdWriteCom(0x85);
  200.   LcdWriteData('M');

  201.    LcdWriteCom(0x86);
  202.   LcdWriteData('/');

  203.    LcdWriteCom(0x87);
  204.   LcdWriteData('S');
  205. }

  206. void main()
  207. {
  208.     u8 i;
  209.     u8 Order[8]={0x04,0x03,0x00,0x16,0x00,0x01,0x65,0x9B};
  210.         UsartInit();
  211.         Timer0Init();
  212.     LcdInit();
  213.   while(1)
  214.   {
  215.    delayms(1000);
  216.    for(i=0;i<8;i++)
  217.    {
  218.           SBUF=Order[i];
  219.           while(!TI);
  220.         TI=0;
  221.    }
  222.     delayms(1000);
  223.         UartDriver();
  224.         LcdDisplay();
  225.    }               
  226. }

  227. void Usart() interrupt 4
  228. {
  229.    if(RI)
  230.    {
  231.             RI=0;
  232.          if(cntRxd<sizeof(bufRxd))
  233.          {
  234.            bufRxd[cntRxd++]=SBUF;
  235.          }
  236.    }
  237. }

  238. void Timer0() interrupt 1
  239. {
  240.     TH0=0XFC;        //給定時(shí)器賦初值,定時(shí)30ms
  241.         TL0=0X18;
  242.         UartRxMonitor(1);  //
  243. }
復(fù)制代碼

所有資料51hei提供下載:
485型風(fēng)速傳感器.zip (53.09 KB, 下載次數(shù): 152)



作者: admin    時(shí)間: 2018-11-23 14:42
補(bǔ)全原理圖或者詳細(xì)說明一下電路連接即可獲得100+黑幣
作者: djj6216    時(shí)間: 2019-8-6 08:50
這個(gè)引腳定義了么
作者: 山外青衫    時(shí)間: 2020-3-8 13:00
很好,有沒有原理圖?
作者: 明日香    時(shí)間: 2020-8-11 09:41
大佬,求個(gè)原理圖,非常感謝




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1