标题: 51单片机测风速代码 485型风速传感器 [打印本页]

作者: 摇篮    时间: 2018-11-23 10:49
标题: 51单片机测风速代码 485型风速传感器
本代码自己编写,51单片机测风速,LCD1602显示,需风速传感器

单片机源程序如下:
  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)   //延时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 字节     
  26.         unsigned char crcl = 0xFF;  //低 CRC 字节   
  27.         unsigned char code TabH[] ={                                                                  //CRC 高位字节值表
  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 低位字节值表
  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--)                                               //计算指定长度的 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;                        //设置为工作方式1
  94.         TMOD=0X20;                        //设置计数器工作方式2                                                                                                                                                                                                                          
  95.         PCON=0X80;                        //波特率加倍
  96.         TH1=0XF3;                                //计数器初始值设置,注意波特率是4800的
  97.         TL1=0XF3;
  98.         ES=1;                                                //打开接收中断
  99.         EA=1;                                                //打开总中断
  100.         TR1=1;                                        //打开计数器
  101. }

  102. void Timer0Init()
  103. {
  104.         TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。

  105.         TH0=0XFC;        //给定时器赋初值,定时1ms
  106.         TL0=0X18;       
  107.         ET0=1;//打开定时器0中断允许
  108.         EA=1;//打开总中断
  109.         TR0=1;//打开定时器       
  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;        //给定时器赋初值,定时30ms
  241.         TL0=0X18;
  242.         UartRxMonitor(1);  //
  243. }
复制代码

所有资料51hei提供下载:
485型风速传感器.zip (53.09 KB, 下载次数: 152)



作者: admin    时间: 2018-11-23 14:42
补全原理图或者详细说明一下电路连接即可获得100+黑币
作者: djj6216    时间: 2019-8-6 08:50
这个引脚定义了么
作者: 山外青衫    时间: 2020-3-8 13:00
很好,有没有原理图?
作者: 明日香    时间: 2020-8-11 09:41
大佬,求个原理图,非常感谢




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1