全新论坛MCU智学网上线,欢迎访问新论坛!稀缺资源、技术干货、参考设计、原厂资料尽在MCU智学网
更新自动建库工具PCB Footprint Expert 2023.13 Pro / Library Expert 破解版

串口通信485及CRC16校验,采用查表,不需要多项式,无校验位

[复制链接]
3035 0

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
  1. //--------------------------------------------------------
  2. // 串口通信485及CRC16校验,采用查表,不需要多项式,无校验位
  3. //--------------------------------------------------------
  4. main()
  5. {
  6. IO_Init();
  7. init_serialcomm();
  8. Timer_Init();
  9. while(1)
  10. {
  11. if(senddataflag == 1)
  12. {
  13.     senddataflag = 0;
  14.     readport();
  15. }
  16. if(rece_end)
  17.       {
  18.         getdata();
  19.     clr_rec_buf();
  20.       }
  21. }
  22. }

  23. void IO_Init(void)      
  24. {
  25. // IO Port Setup
  26. P0 = 0x00;
  27. P1 = 0x0F;
  28. P2 = 0x0F;

  29. sbit MCU485 = P2^0;

  30. //CHPENR = 0x87;
  31. //CHPENR = 0x59;
  32. //CHPCON = 0x10; //enable AUXRAM
  33. //CHPENR = 0x00;
  34. //P4CONB = 0x00;   //P4 port as general I/O port for

  35. Winboard MCU
  36. //P4CONA = 0x00;
  37. }

  38. void init_serialcomm(void)
  39. {
  40. SCON   = 0x50;         //SCON: serail mode 3, 11-bit UART,

  41. nable ucvr
  42. PCON   = 0x00;         //SMOD=0;
  43. TH1    = 0xFA;         //Baud:9600   fosc=22.1184MHz
  44. TL1    = 0xFA;
  45. //IE     = 0x90;      
  46. ES = 1;    //Enable Serial Interrupt
  47.          TR1    = 1;            //timer 1 run
  48. }

  49. void Timer_Init(void)
  50. {
  51.        /* Timer Interrupt Define */
  52.        //TMOD = 0x01;       /* Timer 0 mode 1 - 16bit Timer */
  53.        TMOD   = 0x21;        //TMOD: timer 1, mode 2, 8-bit reload,

  54. Timer 0 mode 1 - 16bit Timer
  55.        TR0 = 1;        /* Timer 0 Run */
  56.    
  57.        /* About 25ms when 24MHz Clock */
  58.        TH0 = 0x3C;        /* About 25ms   when 24MHz Clock*/
  59.        TL0 = 0xAF;
  60.    
  61.        //ET1 = 1;        /* Timer 1 Interrupt Enable */
  62.        ET0 = 1;          /* Timer 0 Interrupt Enable */
  63.        //EX0 = 0;        /* External 0 Interrupt Disable */
  64.        //EX1 = 1;        /* External 1 Interrupt Enable */
  65.        //IT0 = 0;
  66.        //IT1 = 1;        /* External 1 Interrupt Set Negative Edge

  67. Triger */
  68.        PT0 = LOW;        //优先级设置
  69.        //PX0 = HIGH;
  70. }

  71. void T0_int() interrupt 1
  72. {    //定时器0中断  
  73. EA = LOW;
  74.    
  75. TH0 = 0x3C;     // About 25ms   when 24MHz Clock//
  76. TL0 = 0xAF;

  77. SendTime++;    //as interupt fpag
  78. if(SendTime>200)
  79. {   // 5S interupt
  80.    senddataflag = 1;
  81.    SendTime=0;
  82. }
  83. EA = HIGH;
  84. }

  85. void send_char_com(unsigned char ch)  
  86. {   
  87.          ES = 0;
  88. MCU485 = 1;
  89. SBUF=ch;
  90. while(TI==0);
  91. TI=0;
  92.          WAIT();
  93.          ES = 1;
  94. }

  95. void serial() interrupt 4 using 3
  96. {
  97. if(RI)
  98. {
  99.    RI = 0;
  100.    tem=SBUF;
  101.    rece_buf[rece_count++]=tem;
  102.    if(rece_count>=9)
  103.      {
  104.      rece_end=1;
  105.        }  
  106. }
  107. }

  108. void readport()   //发送数据
  109. {  
  110.    int l;
  111.    unsigned char ppp[6] = {0x01,0x03,0x00,0x00,0x00,0x02};   //
  112.    unsigned int CRCCheckSend;
  113.   
  114.      CRCCheckSend = CRC16(ppp,6);
  115. for(l=0;l<6;l++)
  116.     {
  117.    send_char_com(ppp[l]);
  118.    _nop_();
  119.          }
  120. send_char_com(CRCCheckSend >>8);_nop_();
  121. send_char_com(CRCCheckSend &0x00FF);_nop_();

  122. _nop_();
  123. _nop_();
  124. MCU485 = 0;
  125. }

  126. void getdata()
  127. {
  128.    int s;
  129.    unsigned char tempbuf[7];
  130.    unsigned int CRCCheckRece;
  131.   
  132.    for(s=0;s<7;s++)
  133.    {
  134.     tempbuf[s] = rece_buf[s];
  135.    }
  136.   
  137.    CRCCheckRece = CRC16(tempbuf,7);

  138.      if(CRCCheckRece == (rece_buf[7] << 8 | rece_buf[8]))
  139.      displaydata();   // to process the recieved data
  140.      else
  141.      return;
  142. }

  143. void clr_rec_buf(void)
  144. {   
  145.    rece_end = 0;
  146.    rece_count=0;
  147. }

  148. unsigned short CRC16(unsigned char *puchMsg, unsigned short

  149. usDataLen)
  150. {
  151.    unsigned char uchCRCHi = 0xFF ; /* 高CRC字节初始化 */
  152.    unsigned char uchCRCLo = 0xFF ; /* 低CRC 字节初始化*/
  153.    unsigned char uIndex ; /* CRC循环中的索引 */

  154. while (usDataLen--) /* 传输消息缓冲区 */  
  155. {  
  156.    uIndex = uchCRCHi ^ *puchMsg++ ; /* 计算CRC */
  157.    uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;
  158.    uchCRCLo = auchCRCLo[uIndex] ;  
  159. }
  160. return (uchCRCHi << 8 | uchCRCLo) ;  
  161. }


  162. /* CRC高位字节值表 */
  163. static code unsigned char auchCRCHi[] = {
  164. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
  165. 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,  
  166. 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,  
  167. 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
  168. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
  169. 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,  
  170. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
  171. 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,  
  172. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
  173. 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,  
  174. 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
  175. 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
  176. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,  
  177. 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,  
  178. 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
  179. 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
  180. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
  181. 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,  
  182. 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
  183. 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
  184. 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
  185. 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,  
  186. 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
  187. 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
  188. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
  189. 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 } ;

  190. /* CRC低位字节值表*/
  191. static code unsigned char auchCRCLo[] = {  
  192. 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,
  193. 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
  194. 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
  195. 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,  
  196. 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,  
  197. 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
  198. 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,
  199. 0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
  200. 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,  
  201. 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
  202. 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,
  203. 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
  204. 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,  
  205. 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
  206. 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
  207. 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
  208. 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,  
  209. 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
  210. 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,
  211. 0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
  212. 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,  
  213. 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
  214. 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,
  215. 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
  216. 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,  
  217. 0x43, 0x83, 0x41, 0x81, 0x80, 0x40 } ;  
复制代码

举报

回复
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

打开支付宝扫一扫,最高立得1212元红包
搜索

图文热点

更多

社区学堂

更多

客服中心

QQ:187196467 服务时间:周一至周日 8:30-20:30

关注我们

关于我们
关于我们
友情链接
联系我们
帮助中心
网友中心
购买须知
支付方式
服务支持
资源下载
售后服务
定制流程
关注我们
官方微博
官方空间
官方微信
快速回复 返回顶部 返回列表