STC15系列单片机RS-485通讯例程(带CRC校验)

2020-08-08来源: 51hei关键字:STC15系列  单片机  RS-485通讯  CRC校验

单片机源程序如下:

#include



sbit bitCtrl_485Eable = P1^3;//

sbit bitCtrl_485_2Eable = P7^3;//


xdata unsigned char mod_comd[9]={0x01,0x04,0x75,0x31,0x02,0x00,0x00,0x08,0x09};

unsigned char freq = 0;



/****************************************************************************************/

// unsigned char MyDeviceAddr _at_ 0x06000;

// unsigned char PODeviceAddr _at_ 0x05999;

unsigned char MyDeviceAddr;

unsigned char PODeviceAddr;



/*********************************

串口1变量定义

**********************************/

bit busy1 = 0;

xdata unsigned char u8Uart1TxBuffer[USART1_TX_BUFFER_SIZE];

xdata unsigned char u8Uart1RxBuffer[USART1_RX_BUFFER_SIZE];

unsigned char  u8Rx1Head = 0;

unsigned char  u8Rx1Tail = 0;

unsigned char  u8Tx1Head = 0;

unsigned char  u8Tx1Tail = 0;


unsigned char  mdbs1_stat = 0;

unsigned char  mdbs1_len = 0;

unsigned char  mdbs1_cnt = 0;

unsigned char  mdbs1_maxlen = 0;

xdata unsigned char mdbs1_Rxbuf[16];

xdata unsigned char mdbs1_Txbuf[16];

unsigned char  mdbs1_pos = 0;

unsigned char  mdbs1_timerflag = 0;

unsigned char  mdbs1_overtime = 0;

unsigned char  mdbs1_data_len = 0;

/****************************************************************************************/


/****************************************************************************************/

   


/*********************************

串口2变量定义

**********************************/


bit busy2 = 0;

xdata unsigned char u8Uart2TxBuffer[USART2_TX_BUFFER_SIZE];

xdata unsigned char u8Uart2RxBuffer[USART2_RX_BUFFER_SIZE];

unsigned char  u8Rx2Head = 0;

unsigned char  u8Rx2Tail = 0;

unsigned char  u8Tx2Head = 0;

unsigned char  u8Tx2Tail = 0;



unsigned char  mdbs2_stat = 0;

unsigned char  mdbs2_len = 0;

unsigned char  mdbs2_cnt = 0;

unsigned char  mdbs2_maxlen = 0;

xdata unsigned char mdbs2_Rxbuf[16];

xdata unsigned char mdbs2_Txbuf[16];

unsigned char  mdbs2_pos = 0;

unsigned char  mdbs2_timerflag = 0;

unsigned char  mdbs2_overtime = 0;

unsigned char  mdbs2_data_len = 0;

/****************************************************************************************/



/*定时器0初始化,采用16位自动重装技术模式*/


void Timer0Init(void)                                //10毫秒@11.0592MHz                          //16位重装计数器

{

        AUXR &= 0x7F;                                        //定时器时钟12T模式

        TMOD &= 0xF0;                                        //设置定时器模式

                                

        TL0 = -(FOSC/12/100);                        //设置定时初值

        TH0 = -(FOSC/12/100) >> 8;                //设置定时初值

//        RL_TH0



        TF0 = 0;                                                //清除TF0标志

        TR0 = 1;                                                //定时器0开始计时

        Timer0_InterruptFirst();

        ET0 = 1;                                                //enable timer0 interrupt

}

/***定时器0中断服务函数**/

void tm0_isr() interrupt 1  using 1

{


                                                               

    TF0 = 0;                                            //清除TF0标志

        TL0 = -(FOSC/12/100);                    //设置定时初值

        TH0 = -(FOSC/12/100) >> 8;                //设置定时初值

   

         ++freq;  

        


}


/************************************************************************/

  //8位数据   波特率可变    无奇偶检验位    1位起始位  1位停止位

  //使用定时器1作为波特率发生器

   void Uart1Init(void)                                        //9600bps@11.0592MHz

{

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

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

        AUXR &= 0xBF;                                        //定时器1时钟为Fosc/12,即12T  传统51速度

        AUXR &= 0xFE;                                        //串口1选择定时器1为波特率发生器

//        AUXR |=0X01;                                          //串口1选择定时器2为波特率发生器


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

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


//        TMOD &= 0xF0;                                        //清除定时器2模式位

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


        TL1 = -(FOSC/12/32/BAUD);                //设定定时初值

        TH1 = -(FOSC/12/32/BAUD);                //设定定时器重装值

/*****


定时器2工作方式为固定16位自动重装载   装在值需重新计算

*/

//        T2L = -(FOSC/12/32/BAUD);                //设定定时初值

//        T2H = -(FOSC/12/32/BAUD);                //设定定时器重装值



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

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

//        S1_USE_P36P37();                        //定义串口1管脚

        UART1_InterruptFirst();                  //中断优先级设定

        ES = 1;                                 //????????



   bitCtrl_485Eable=0;

}

/******************        *****************************************************/

/*************串口2初始化************/

/************************************************************************/


//#define                S3_Int_en()                        IE2   |=  8

void Uart2Init(void)                                //10毫秒@11.0592MHz

{

/*        

        T2MOD = 0;                                                //初始化模式寄存器

T2CON = 0; //初始化控制寄存器

[1] [2] [3] [4] [5] [6] [7] [8] [9]
关键字:STC15系列  单片机  RS-485通讯  CRC校验 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic505653.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:基于SC95F8616的中文菜单MP3点歌器 (3)
下一篇:51单片机串口收发字符串源程序

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STC15系列单片机ADC函数库的20200208优化版
参考:STC官网函数库优点:初始化P1任何端口后,main函数只需要循环调用ADC_Convert()函数即可循环完成所有配置的ADC端口模拟量采集。ADC转换结果放置在Dpj_ZongCunChu[]数组中,用于其他功能取用。目的:免费共享,互相提升。先在ADC.c文件中写入以下内容:#define _ADC_C_                //预定义名称用于ADC.h中#include        "all.h"         
发表于 2020-02-11
STC15系列电压测试+LCD12864显示
最近使用15做电压测试,顺便使用下12864显示,程序如下:    #include <STC15F2K60S2.H>    #include <intrins.h>    #include <stdio.h>        #define uchar unsigned char    #define uint  unsigned int    #define ulint unsigned long int 
发表于 2020-01-29
stc15系列STC内部EEPROM的读写
STC单片机利用IAP技术实现了EEPROM功能,相比外置存储芯片而言,在操作上比较方便。 涉及STC单片机EEPROM操作的特殊功能寄存器有6个,地址分别是E2H、E3H、E4H、E5H、E6H和E7H。在STC单片机使用手册中,作者分别将它们定义为:一、IAP_DATA  (E2H)二、IAP_ADDRH  (E3H)三、IAP_ADDRL  (E4H)四、IAP_CMD  (E5H)五、IAP_TRIG  (E6H)六、IAP_CONTR  (E7H)本人认为,手册中给每个地址单元定义的英文
发表于 2020-01-18
STC15系列单片机-环境监控设备
 * 完成时间:2015.4.5 17:00 * 作者:宁静致远 */ #include <stc15f2k60s2.h>#include <stdio.h>#include "stdint.h"#include "DS1302.h"#include "DS18B20.h"#include "UART.h"#include "digitalTube.h"#include "timer.h"//#include "main.h" 
发表于 2019-05-09
STC15系列单片机 超声波测距实验
的实际距离。 */ #include <stc15f2k60s2.h>#include <intrins.h>#include "stdint.h"#include "timer.h"#include "digitalTube.h" #define somenop(); {      _nop_();_nop_();_nop_();_nop_();_nop_();     _nop_();_nop_();_nop_();_nop_();_nop_(); } sbit
发表于 2019-05-09
AT90S8515单片机SPI驱动74LS595源程序
AT90S8515使用SPI驱动74LS595。我这里使用了SS口线PB.4,作为74LS595的锁存信号,关键是把PB.4设置为输出。74LS595驱动发光管显示加1计数,我用SPI最高速度,所以显示16位计数高八位,低八位太快,看不清楚。单片机源程序如下://ICC-AVR application builder : 2020/3/30 22:23:31// Target : 8515// Crystal: 8.0000Mhz#include <io8515v.h>#include <macros.h>#define SS_ON PORTB |= BIT(4);     
发表于 2020-09-16
AT90S8515<font color='red'>单片机</font>SPI驱动74LS595源程序
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved