/************************宏定义*******************************************/
#define MAIN_Fosc 11059200L //System frequency
#define Baudrate1 9600 //define the baudrate, 如果使用BRT做波特率发生器,则波特率跟串口2一样
#define Baudrate2 19200 //define the baudrate2,
#define BUF_LENTH 128
#define valnum 25
/*******************************************************************/
#include <STC12C5A60S2.H>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/************************变量声明*******************************************/
sbit buzz=P2^7;
unsigned char comm_len=0;
unsigned char endflag = 0;
unsigned char RX2_Rcv_Flag=0;
unsigned char uart2_wr; //写指针
unsigned char uart2_rd; //读指针
unsigned char xdata RX2_Buffer[BUF_LENTH]={0};
bit B_TI2;
unsigned char uart1_wr; //写指针
unsigned char uart1_rd; //读指针
unsigned char xdata RX1_Buffer[BUF_LENTH]={0};
unsigned char xdata RX11_Buffer[valnum]={0};
bit B_TI;
char *p0="t";
char *p1=".txt=";
char lcd_cmd[30]={0};
char *p2=".bco=";
float xdata Curval[valnum]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
unsigned char xdata stopflag[valnum]={0};//延时计数器,对应每一路,通过count计数
unsigned char xdata timeflag[valnum]={0};
unsigned char buff[8]={0x01,0x03,0x01,0x30,0x00,0x0F,0x00,0x00};
//unsigned char buff1[8]={0x01,0x03,0x01,0x30,0x00,0x0F,0x00,0x00};//保存MODBUS发送数据帧
unsigned char buff1[8]={0x02,0x03,0x01,0x30,0x00,0x09,0x00,0x00};
unsigned int i=0;
unsigned char rcv1_okflag;//判断MH912应答
unsigned char rcv2_okflag;//判断MH912应答
char disflag=0;
unsigned char hour,minute,second;
unsigned char count;
/*******************************************************************/
#define T1_TimerReload (256 - MAIN_Fosc / 192 / Baudrate1) //Calculate the timer1 reload value at 12T mode
#define BRT_Reload (256 - MAIN_Fosc / 12 / 16 / Baudrate2) //Calculate BRT reload value
#define TimeOut1 (28800 / (unsigned long)Baudrate1 + 2)
#define TimeOut2 (28800 / (unsigned long)Baudrate2 + 2)
#define TI2 (S2CON & 0x02) != 0
#define RI2 (S2CON & 0x01) != 0
#define CLR_TI2() S2CON &= ~0x02
#define CLR_RI2() S2CON &= ~0x01
/**********************函数声明*********************************************/
void lcd_display(int tnum,float dat);
unsigned int crc16_table(unsigned char *ptr, unsigned char len);
/**********************延时函数*********************************************/
void delayms(int count)
{ int i,j;
for(i=0;i<count;i++)
for(j=0;j<1000;j++);
}
/*******************字符发送函数************************************************/
void UART2_TxByte(unsigned char dat)
{
B_TI2 = 0;
S2BUF = dat;
while(!B_TI2);
B_TI2 = 0;
}
void UART1_TxByte(unsigned char dat)
{
B_TI = 0;
SBUF = dat;
while(!B_TI);
B_TI = 0;
}
void UART_Send_END(void)
{
UART2_TxByte(0xFF);
UART2_TxByte(0xFF);
UART2_TxByte(0xFF);
}
void UART1_Send_END(void)
{
UART1_TxByte(0xFF);
UART1_TxByte(0xFF);
UART1_TxByte(0xFF);
}
void UART_Send_start(void)
{
delayms(10);
UART_Send_END();
delayms(10);
}
void PrintString1(unsigned char *puts) //发送一串字符串
{
for (; *puts != 0; puts++) UART1_TxByte(*puts); //遇到停止符0结束
}
void PrintString2(unsigned char *puts) //发送一串字符串
{
for (; *puts != 0; puts++) UART2_TxByte(*puts); //遇到停止符0结束
}
/*******************************************************************/
/******************串1初始化****************************/
void uart1_init(void)
{
PCON |= 0x80; //UART0 Double Rate Enable
SCON = 0x50; //UART0 set as 10bit , UART0 RX enable
TMOD &= ~(1<<6); //Timer1 Set as Timer, 12T//定时器模式控制
TMOD = (TMOD & ~0x30) | 0x20; //Timer1 set as 8 bits auto relaod
TH1 = T1_TimerReload; //Load the timer
TR1 = 1;//定时器允许位
ES = 1;
EA = 1;
}
/******************串2初始化****************************/
void uart2_init(void)
{
AUXR |= (1 << 3); //串口2波特率加倍
S2CON = (S2CON & 0x3f) | (1<<6); //串口2模式1,8位UART,(2^S2SMOD / 32) * BRT溢出率01111111 01000000
S2CON |= 1 << 4; //允许串2接收
AUXR |= 1 << 4; //baudrate use BRT
BRT = BRT_Reload;
IE2 |= 1; //允许串口2中断
}
/******************定时器初始化****************************/
void Time0_init()
{
TMOD|=0x01;
TH0=(65536-46083)/256;
TL0=(65536-46083)%256;
EA=1;
ET0=1;
TR0=1;
}
/************断路指示**********************/
void disconnet_displa(int stopnum,long int dat)
{
sprintf(lcd_cmd,"%s%d%s%ld",p0,stopnum,p2,dat);
PrintString2(lcd_cmd);
UART_Send_END();
}
void reconnet_displa(int oknum,long int dat)
{
sprintf(lcd_cmd,"%s%d%s%ld",p0,oknum,p2,dat);
PrintString2(lcd_cmd);
UART_Send_END();
}
/************断路判断**********************/
void Compare()
{
/**********************************/
int i;
for(i=0;i<24;i++)
{
if(stopflag[i]<21)
{
if(Curval[i]==0)
{
if(timeflag[i]!=count)
{
timeflag[i]=count;
stopflag[i]+=1;
}
}
else
{
stopflag[i]=0;
}
}
else if(Curval[i]!=0)
{
stopflag[i]=0;
reconnet_displa(i,65535);
}
else
{
disconnet_displa(i,63488);
}
}
}
/****************************信息接收************************
void message()
{
char a=1;
unsigned int Rcrc=0;//保存接收数据生成CRC校验码
unsigned char RcrcHi=0,RcrcLo=0;;
while(a)
{
for(i=0;i<8;i++)
{
UART1_TxByte(buff[i]);
}
uart1_wr=0;
delayms(50);//延时让MH912有足够时间做出应答
if(rcv1_okflag==1) //接受54位数据
{
rcv1_okflag=0;
Rcrc=crc16_table(RX1_Buffer,33); // 应答信息CRC值计算,信息中的校验位不参与计算
RcrcHi=Rcrc%256;
RcrcLo=Rcrc/256;
UART1_TxByte(0x22);
for(i=0;i<35;i++)
{
UART1_TxByte(RX1_Buffer[i]);
}
UART1_TxByte(0x33);
if( (RcrcLo==RX1_Buffer[33])&&(RcrcHi==RX1_Buffer[34]) )
{
a=0;
}
else
{
a=1;
}
}
}
}*/
/****************************信息接收************************/
void message()
{
char a=1,b=1;
unsigned int Rcrc=0;//保存接收数据生成CRC校验码
unsigned char RcrcHi=0,RcrcLo=0;;
while(a)
{
for(i=0;i<8;i++)
{
UART1_TxByte(buff[i]);
}
uart1_wr=0;
delayms(50);//延时让MH912有足够时间做出应答
if(rcv1_okflag==1) //接受54位数据
{
Rcrc=crc16_table(RX1_Buffer,33); // 应答信息CRC值计算,信息中的校验位不参与计算
RcrcHi=Rcrc%256;
RcrcLo=Rcrc/256;
for(i=0;i<35;i++)
{
UART1_TxByte(RX1_Buffer[i]);
}
if( (RcrcLo==RX1_Buffer[33])&&(RcrcHi==RX1_Buffer[34]) )
{
a=0;
}
else
{
a=1;
}
}
}
delayms(10);
while(b)
{
for(i=0;i<8;i++)
{
UART1_TxByte(buff1[i]);
}
uart1_wr=0;
delayms(50);//延时让MH912有足够时间做出应答
if(rcv2_okflag==1) //接受54位数据
{
rcv1_okflag=0;
rcv2_okflag=0;
Rcrc=crc16_table(RX11_Buffer,21); // 应答信息CRC值计算,信息中的校验位不参与计算
RcrcHi=Rcrc%256;
RcrcLo=Rcrc/256;
UART1_TxByte(0x88);
for(i=0;i<23;i++)
{
UART1_TxByte(RX11_Buffer[i]);
}
UART1_TxByte(0x99);
if( (RcrcLo==RX11_Buffer[21])&&(RcrcHi==RX11_Buffer[22]) )
{
b=0;
}
else
{
b=1;
}
}
}
for(i=33;i<52;i++)
{
RX1_Buffer[i]=RX11_Buffer[i-30];
}
}
/************主函数**********************/
void main()
{
int j=0,i=0;
unsigned int Tcrc=0;//保存需要发送CRC校验码
unsigned int UART_data;
unsigned char temp;
uart2_init();
uart1_init();
Time
helloc毛线
- 粉丝: 4
- 资源: 6
最新资源
- 基于J2EE+SqlServer的B2C电子商务系统开发(论文+源码+开题报告+任务书+答辩PPT+外文文献)
- 基于JAVA的RSA文件加密软件的设计与实现毕业设计(源代码+论文)
- RS译码算法原理.docx
- 基于JSP+SqlServer 实现的的毕业设计选题系统毕业设计(源代码+论文)
- 【Unity对话系统插件】Dialogue System for Unity 复杂对话系统、任务系统和角色交互
- 1553B总线使用BU-65170, BU-61580芯片设计实现+相关文档及文章
- c语言文件读写操作代码-12-在控制台打印出著名的杨辉三角.rar
- c语言文件读写操作代码-11-实现投票统计功能.rar
- c语言文件读写操作代码-10-交换数组中最大数和最小数的位置.rar
- SQLSERVER体系结构荐PDF
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈