📄 receive.c
字号:
#include<stdio.h>
#include<io2313v.h>
#pragma interrupt_handler time1_ovf:6
#pragma interrupt_handler time0_ovf:7
#pragma interrupt_handler uart_rx:8
#define TXD_BIT 0X01
#define TXD_0() (PORTB=PINB&~TXD_BIT)
#define TXD_1() (PORTB=PINB|TXD_BIT)
#define RXD_BIT 0X02
#define RXD_FLAG PINB&RXD_BIT
char T_FLAG=0,R_FLAG=0,SEND_FLAG=0,RECV_FLAG=0,CycleMode=0,B_FLAG=0,A_FLAG;
char send[10],sendcount,s_scu[3];
char recv[10],recvcount;
char recvdata[10],rxcount=0,ASC_REG[13];
char temp0,mask,i,SendLen;
unsigned int tt;
char uart_rxs[9],uart_rx_reg,uart_rx_flag,uart_rx_number,uart_xor;
char shear_flag=0,ovr_flag;
unsigned int shr_number,shr_number_n,time_flag=0;
char shr_number_h,shr_number_hh,shp_h,shr_number_l,shr_number_ll,shp_l,direct;
void delay(unsigned int dt)
{
for(tt=0;tt<dt;tt++);
}
void output(char txd_data)
{
char i;
T_FLAG=1;
for(i=0;i<8;i++)
{
mask=1<<i;
if(txd_data& mask)
{
send[i]=1;
}
else
{
send[i]=0;
}
}
send[8]=1;
send[9]=1;
TCNT0=0xd4;
TXD_0();
TCCR0=0x02;
sendcount=0;
}
void SendData()
{ char i;
//UCR=0x0;
for(i=0;i<SendLen;i++)
{
while (T_FLAG);
delay(3000);
output( ASC_REG[i]);
}
delay(5000);
TXD_1();
//UCR=0x90;
}
char ASCHi(char ASCData)
{
temp0=ASCData/16;
if (temp0>9)
{
return temp0+87;
}
else
{
return temp0+0x30;
}
}
char ASCLo(char ASCData)
{
temp0=ASCData%16;
if (temp0>9)
{
return temp0+87;
}
else
{
return temp0+0x30;
}
}
/*void SCU_CONTROL(char p1,char p2) //向控制器发送的复位信号子函数
{
ASC_REG[1]=p1;
ASC_REG[3]=0x30;
ASC_REG[4]=0x30;
ASC_REG[5]=p2;
ASC_REG[6]=0x0d;
SendLen=7;
SendData();
}*/
/*void SCU_VERSION() //向控制器发送版本号
{
ASC_REG[1]=0x32;
ASC_REG[3]=0x33;
ASC_REG[4]=0x30;
ASC_REG[5]=0x34;
ASC_REG[6]=0x30;
ASC_REG[7]=0x30;
ASC_REG[8]=0x30;
ASC_REG[9]=0x31;
ASC_REG[10]=0x30;
ASC_REG[11]=0x36;
ASC_REG[12]=0x0d;
SendLen=13;
SendData();
} */
void shear_number(char dh,char dl)
{
unsigned int sh_data;
sh_data=dh*256+dl;
if(sh_data>50000)
{
sh_data=65535-sh_data;
if(sh_data==0)
{
shr_number=15;
}
else
{
sh_data=(sh_data-1);
sh_data=sh_data/208;
if (sh_data<14)
{
shr_number=14-sh_data;
}
else
{
shr_number=1;
}
}
}
else
{ if(sh_data==0)
{
shr_number=15;
}
else
{
sh_data=(sh_data-1);
sh_data=sh_data/208;
shr_number=15+sh_data;
}
}
shr_number_hh=shr_number/256;
shr_number_ll=shr_number%256;
if( ovr_flag==0)
{if(shear_flag==1)
{ if(A_FLAG<1)
{
shr_number_h=shr_number_hh;
shr_number_l=shr_number_ll;
shr_number_n=shr_number;
A_FLAG=2;
}
else
{ if((shr_number<shr_number_n+3)&&(shr_number>shr_number_n-3))
{shr_number_h=shr_number_hh;
shr_number_l=shr_number_ll;
shr_number_n=shr_number;
}
else
{
if(shr_number_ll==15)
{ shr_number_h=0;
shr_number_l=15;
shr_number_n=shr_number;
}
else
{shr_number_h=shr_number_h;
shr_number_l=shr_number_l;
}
}
}
}
}
else
{ A_FLAG=0;}
}
void SCU_DATA() //向控制器发送采煤机的位置信号
{
char tempreg;
UCR=0x0;
TIMSK=TIMSK&~0x80;
shear_number(s_scu[0],s_scu[1]);
direct=s_scu[2];
//if (direct>2)
//{direct=0;}
if (shear_flag==0)
{ shp_h=0xff;
shp_l=0xff;
//A_FLAG=0;
}
else
{shp_h=shr_number_h;
shp_l=shr_number_l;
}
tempreg=0x02^0x42^0x03;
tempreg^=shp_h^shp_l^direct;
ASC_REG[1]=0x42;
ASC_REG[3]=0x33;
ASC_REG[4]=ASCHi(shp_h);
ASC_REG[5]=ASCLo(shp_h);
ASC_REG[6]=ASCHi(shp_l);
ASC_REG[7]=ASCLo(shp_l);
ASC_REG[8]=ASCHi(direct);
ASC_REG[9]=ASCLo(direct);
ASC_REG[10]=ASCHi(tempreg);
ASC_REG[11]=ASCLo(tempreg);
ASC_REG[12]=0x0d;
SendLen=13;
SendData();
UCR=0x90;
TIMSK=TIMSK|0x80;
shear_flag=0;
}
void main()
{
char j;
DDRB=0xfd;
PORTB=0xff;
//delay(65535);
SREG=0x80;
TIMSK=0x82;
MCUCR=0X02;
UBRR=0xbf; /*装入波特率1200*/
UCR=0x90; /*开发送使能*/
uart_rx_flag=0;
TCNT1H=0xb9; /*计数器预定比例值*/
TCNT1L=0xb0;
TCCR1A=0x00; /*计数器1控制寄存器*/
TCCR1B=0x05;
ASC_REG[0]=0x02;
ASC_REG[2]=0x30;
// SCU_CONTROL(0x30,0x32);
while(1)
{
if (SEND_FLAG==1)
{ SCU_DATA();
if (RECV_FLAG)
{ //for(j=0;j<3;j++)
//{s_scu[j]=uart_rxs[j];}
//delay(5);
//SCU_DATA();
RECV_FLAG=0;
}
SEND_FLAG=0;
rxcount=0;
}
else
{
if (R_FLAG == 0)
{
temp0=RXD_FLAG;
if (temp0 == 0x0)
{
TCNT0=0xb8;
TCCR0=0x02;
R_FLAG=1;
recvcount=0;
UCR=0x0;
}
}
}
}
}
void time0_ovf()
{
if(R_FLAG==1) //接收来自控制器的命令
{
recv[recvcount]=RXD_FLAG;
if (recvcount<9)
{
recvcount+=1;
TCNT0=0xd6;
}
else
{
recvcount=0;
temp0=0;
for(i=0;i<8;i++)
{
mask=1<<i;
if(recv[i])
{
temp0=temp0|mask;
}
}
recvdata[rxcount]=temp0;
if (rxcount<6)
{
rxcount+=1;
}
else
{
rxcount=0;
RECV_FLAG=1;
TCNT1H=0xe0; /*计数器预定比例值*/
TCNT1L=0x00;
}
R_FLAG=0;
UCR=0x90;
TCCR0=0;
}
}
else //向控制器以9600波特率发送数据
{
if (send[sendcount]==0)
{
TXD_0();
}
else
{
TXD_1();
}
if (sendcount<9)
{
sendcount+=1;
TCNT0=0xd8;
}
else
{
TCCR0=0;
T_FLAG=0;
}
}
}
void time1_ovf(void) //定时发送,接收
{ char j;
SEND_FLAG=1;
for(j=0;j<3;j++)
{s_scu[j]=uart_rxs[j];}
time_flag++;
if(time_flag==20)
{ time_flag=0;
ovr_flag=1;
}
}
void uart_rx(void) //uart中断,接收来自采煤机的数据
{
uart_rx_reg=UDR;
switch (uart_rx_flag)
{
case 0:
{
if (uart_rx_reg==0xff)
{
uart_rx_flag=1;
}
break;
}
case 1:
{
if (uart_rx_reg==0)
{
uart_rx_flag=2;
uart_rx_number=0;
}
else
{
uart_rx_flag=0;
}
break;
}
case 2:
{
uart_rxs[uart_rx_number]=uart_rx_reg;
if (uart_rx_number<5)
{
uart_rx_number+=1;
}
else
{
uart_rx_number=0;
uart_rx_flag=0;
if((uart_rxs[3]==0x55)&(uart_rxs[4]==0xaa))
{uart_xor=0xff^0x00^uart_rxs[0]^uart_rxs[1]^uart_rxs[2]^uart_rxs[3]^uart_rxs[4];
if(uart_rxs[5]==uart_xor)
{shear_flag=1;
ovr_flag=0;
}
}
}
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -