×
单片机 > 单片机程序设计 > 详情

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

发布时间:2024-05-19 发布时间:
|

单片机源程序如下:

#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校验

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会