多版本STC单片机的CRC串口校验程序

发布者:西周以前的最新更新时间:2020-08-28 来源: 51hei关键字:STC单片机  CRC  串口校验 手机看文章 扫描二维码
随时随地手机看文章

单片机源程序如下:

#include

#include


typedef unsigned char uchar8;

typedef unsigned short uint16;

typedef unsigned long uint32;


bit Bee_flag = 0;


bit Rx_start_flag;

bit Rx_stop_flag;

bit crc_flag = 0;

uchar8 Rx_BUF[20];

uchar8 Rx_count;


uint32 crcData;

uint32 crcData_temp;

uchar8 Rx_data_buf[20];

uchar8 Tx_data_buf[20];

uchar8 Tx_crc_data_buf[20];



/******CRC 高位字节值表******/

uchar8 code auchCRCHi[256] =

{

        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,

        0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

        0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,

        0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,

        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,

        0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,

        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,

        0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,

        0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,

        0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,

        0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,

        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,

        0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,

        0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,

        0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,

        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,

        0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

        0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,

        0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

        0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,

        0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,

        0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,

        0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,

        0x80, 0x41, 0x00, 0xC1, 0x81, 0x40

};

/******CRC低位字节值表******/

uchar8 code auchCRCLo[256] =

{

        0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,

        0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,

        0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,

        0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,

        0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,

        0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,

        0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,

        0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,

        0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,

        0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,

        0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,

        0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,

        0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,

        0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,

        0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,

        0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,

        0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,

        0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,

        0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,

        0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,

        0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,

        0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,

        0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,

        0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,

        0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,

        0x43, 0x83, 0x41, 0x81, 0x80, 0x40

};


void Uart1_Init( )

{       

        PCON &= 0x7F;                //波特率不倍速

        SCON = 0x50;                //8位数据,可变波特率

        TMOD &= 0x0F;                //清除定时器1模式位

        TMOD |= 0x20;                //设定定时器1为8位自动重装方式

        TL1 = 0xFD;                //设定定时初值

        TH1 = 0xFD;                //设定定时器重装值

        ET1 = 0;                //禁止定时器1中断

        TR1 = 1;                //启动定时器1

       

    ES=1;

    EX0=1;                //开外部中断0

        IT0=1;                //负跳变触发               

    EA=1;

}


unsigned int crc16(unsigned  char  *puchMsg, unsigned int usDataLen)//CRC计算函数(查表法)

{

        unsigned char uchCRCHi = 0xFF; //高CRC字节初始化

        unsigned char uchCRCLo = 0xFF; //低CRC 字节初始化

        long uIndex; //CRC循环中的索引

        while (usDataLen--)

        {

                uIndex = uchCRCHi ^ *puchMsg ++; //计算CRC

                uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex];

                uchCRCLo = auchCRCLo[uIndex];

        }

        return (uchCRCHi << 8 | uchCRCLo);

}


/************************主函数************************/

void main(void)

{

        uchar8 i, sdb_counter;


        Uart1_Init( );

        Tx_data_buf[6] = 0x00;

        P12 = 1;

        P16 = 0;

       

        while(1)

        {               

                if(Rx_stop_flag)

                {

                        if(Rx_BUF[0] == 0xfe)//判断第二个包头0xfe

                        {                               

                                crc_flag = 1;

                                for(i = 0; i < 5; i ++)//丢掉包头包尾,只保存数据和CRC校验和

                                {

                                        Rx_data_buf[i] = Rx_BUF[i + 1];

                                }

                        }

                        Rx_stop_flag = 0;

                }

               

                if(Rx_data_buf[2] == 0x07 && crc_flag == 1)//查询计数

                {

                        crcData = crc16(Rx_data_buf, 3);       

                        crcData_temp = Rx_data_buf[3];

                        crcData_temp = crcData_temp << 8;

                        crcData_temp = crcData_temp + Rx_data_buf[4];

                        if(crcData == crcData_temp)//验证CRC检验值

                        {

                                Tx_data_buf[0] = 0xef;

                                Tx_data_buf[1] = 0xfe;

                                Tx_data_buf[2] = 0x06;

[1] [2]
关键字:STC单片机  CRC  串口校验 引用地址:多版本STC单片机的CRC串口校验程序

上一篇:lcd1602万年历(时钟)+温度 带闹钟
下一篇:单片机写数据到LCD12864点阵型液晶显示器内部ST7920芯片

推荐阅读最新更新时间:2024-11-05 07:23

CC1101/CC1100、stc单片机模拟2262-2272解码
这几天研究了市场上常见的无线遥控开关,它们的无线部分大都是用2262-2272编码实现,在网上找了些2262-2272软解码的资料,发现少的可怜,即使有实用性也不高,于是乎就有了这篇博客。 22262频率计算公式为F=32000/Ros(KΩ)KHz,其中Ros为震荡电阻,发送一位占用32个时钟周期,其中起始位占用128时钟周期。2262编码格式如下图: ‘F’只有地址为才有,数据位只有‘0’‘1’。 cc1101与stc单片机连接如下: SI-P1.5; SO-P1.6; CLK-P1.7; CS-P3.4; GDO0-P4.2(CCP0); GDO2-P4.3(CCP1); cc1101配置如
[单片机]
CC1101/CC1100、<font color='red'>stc单片机</font>模拟2262-2272解码
STC单片机程序下载问题汇总
失败现象: Chinese:正在尝试与 MCU/单片机 握手连接 ... 打开串口失败! Chinese: 串口已被其它程序打开或该串口不存在。 解决方法: 1,检查USB下载模块的连接是否正常,模块上的绿色和红色LED灯都亮起表示连接正常。绿色LED灯不亮表示USB驱动程序出现问题,可以拔下USB模块重插一次。红色LED灯不亮表示模块没有供电,或是USB模块后面的电源输出端(3.3V、+5V、GND)有短路。 2,在控制面板---》系统---》硬件管理器中找到 端口 ---》CP2101串口,了解括号里的 COM号。如果括号里显示COM4,那在STC-ISP软件里也要选择COM4才行。 STC-ISP软件: 3,有时由于STC-
[单片机]
如何为STM32编程节省代码空间?在IAR中配置CRC参数有窍门
前言 STM32全系列产品都具有CRC外设,对CRC的计算提供硬件支持,为应用程序节省了代码空间。CRC校验值可以用于数据传输中的数据正确性的验证,也可用于数据存储时的完整性检查。在IEC60335中,也接受通过CRC校验对FLASH的完整性进行检查。在对FLASH完整性检查的应用中,需要事先计算出整个FLASH的CRC校验值(不包括最后保存CRC值的字节),放在FLASH的末尾。在程序启动或者运行的过程中重新用同样的方法计算整个FLASH的CRC校验值,然后与保存在FLASH末尾的CRC值进行比较。 EWARM从v5.5版本之后开始支持STM32芯片的CRC计算。前面所说的计算整个FLASH的CRC校验值并保存在FLASH末
[单片机]
如何为STM32编程节省代码空间?在IAR中配置<font color='red'>CRC</font>参数有窍门
基于STC单片机与GPRS的图文LED屏
1 序言 GPRS(General Packet Radio Service,通用分组无线业务)的出现充分利用了现有的GSM网络,不仅适用于间断的、突发性的或频繁的、少量的数据传输,也适用于偶尔的大数据量传输。它使移动通信与数据网络合二为一,它利用“分组交换”(Packet Switch)的概念所发展出的一套无线传输方式,可高效地利用现有的无线电频谱,为用户提供最快达到ll5kb/s数据传输率的服务。鉴于当前网络的发展,短消息的迅速普及,使得用手机控制LED显示广告、新闻等公众信息成为了可能。用SMS控制车载小屏显示的技术非常多,但能显示小图片的却寥寥无几,本文针对这种情况设计了一种可显示汉字和一些简单图片的车载
[单片机]
基于<font color='red'>STC单片机</font>与GPRS的图文LED屏
STC单片机下载不成功的原因分析
刚刚接触单片机,选用了号称目前下载最方便的国产stc单片机,这种单片机是用串口下载的,比起at的要那10根线的isp接头确实方便了不少,于是我就蠢蠢欲动准备自己动手丰衣足食,试着做点硬件的时候,总觉得串口下载是个难关。写好的程序能不能顺利的下进出,心里总有些没把握。最近有涉及到这方面的一点东东,随意总结一下以便给51hei的朋友分析和日后之用。 程序下不进去的原因有几点: 1 RS232的问题,这里包括几点 ,可能是芯片的损坏,无法正常工作,可能是电路连接不对,导致烧写电压不足。查看烧写电压的大小,要不低于正负8V,其次是查看芯片的IN和OUt,要与串口头相对应。一般人是不会犯着错误的,我除外,因为我不一般嘛,哈哈 。 2 复位
[单片机]
STC单片机实现水滴效果程序
ORG 000H ;起始地址 START: ;开始标号 MOV R0,#8 ;设置右移次数 MOV A,#0FEH;向A寄存器输入初始值 D2: MOV P1,A ;输出至P1口 CALL DL; 调入延时程序 RL A; 将A中数据向右移一位 DJNZ R0,D2;检测是否右移八次了 JMP START;否则跳到开始 DL: ;延时程序 MOV R3,#20
[单片机]
STC单片机内部EEPROM程序
#include reg51.h #include intrins.h #define uchar unsigned char #define uint unsigned int sfr ISP_DATA = 0x00E2; //EEPORM数据寄存器 sfr ISP_ADDRH = 0x00E3; //地址寄存器高八位 sfr ISP_ADDRL = 0x00E4; // 地址寄存器低八位 sfr ISP_CMD = 0x00E5; //EEPORM命令寄存器 sfr ISP_TRIG = 0x00E6; //EEPROM(ISP/IAP) 命令触发寄存器 sfr ISP_CONTR = 0x00E7; //
[单片机]
STC单片机程序下载失败总结
STC为宏晶公司推出的国产51单片机,其优点在于价格低廉,功能强大,使用方便,尤其是其串口ISP下载程序的方式方便了大量用户,免去了购买昂贵的编程器,非常适合单片机入门学习使用。 但是初学者常会遇到程序无法下载的情况,很多人甚至因此放弃了学习,实在可惜,在此给大家总结了常见的出错原因、判断方法和解决方法。 STC单片机下载程序需要的硬件主要分三部分: 单片机最小系统、下载电路、计算机端。 下载失败一般就从这三个方面来解决问题。 如果你有或者能向别人借到一套可以正常下载程序的电脑、单片机下载线、开发板,通过控制变量的方法,很快就能找到问题出在哪个环节。 1、你可以将自己的开发板连接在能正常下载的电脑上进行下载,如果可
[单片机]
<font color='red'>STC单片机</font>程序下载失败总结
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved