小白学习汇总
单片机源程序如下:
- #include "stm32f10x.h"
- #include"crc.h"
- /*ModBus 计算CRC码的步骤为:
- (1).预置16位寄存器为FFFFH。称此寄存器为CRC寄存器;
- (2).把第一个8位数据与CRC寄存器的低位相异或,把结果放于CRC寄存器;
- (3).把寄存器的内容右移一位(朝低位),用0填补最高位,检查最低位;
- (4).如果最低位为0:重复第3步(再次移位)如果最低位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;
- (5).重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;
- (6).重复步骤2到步骤5,进行下一个8位数据的处理;
- (7).最后得到的CRC寄存器即为CRC码。(CRC码 = CRC_L +CRC_H)
- */
- /*****************crc校验**********************************************/
- //crc生成函数,并将crc存储在预先定于的数组中
- //调用方式crc16(指向数据的指针,需要校验的数据长度)
- u16 crc16(u8 *ptr,u8 len)
- {
- unsigned long wcrc=0XFFFF;//预置16位crc寄存器,初值全部为1
- int i=0,j=0;//定义计数
- for(i=0;i<len;i++)//循环计算每个数据
- {
- wcrc^=*ptr++;//将八位数据与crc寄存器亦或.指针地址增加,指向下个数据
- for(j=0;j<8;j++)//循环计算数据的
- {
- if(wcrc&0X0001)//判断右移出的是不是1,如果是1则与多项式进行异或。
- {
- wcrc=wcrc>>1^0XA001;//先将数据右移一位再与上面的多项式进行异或
- }
- else//如果不是1,则直接移出
- {
- wcrc>>=1;//直接移出
- }
- }
- }
- return wcrc<<8|wcrc>>8;//低八位在前,高八位在后
- }
复制代码- #include "sys.h"
- #include "delay.h"
- #include "usart.h"
- #include "timer.h"
- extern u8 Rcv_Busy;//用来说明串口能不能继续接收下一帧数据
- int main(void)
- {
-
- delay_init(); //延时函数初始化
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
- uart_init(115200); //串口初始化为9600
- TIM3_Int_Init(499,7199);//定时器初始化为50ms中断一次
- while(1)
- {
- if(Rcv_Busy==1)//串口忙
- ModHandle();//处理接受到的数据
- }
- }
复制代码
所有资料51hei提供下载:
modbus实验.rar
(286.49 KB, 下载次数: 297)
|