📄 3.c
字号:
#include "STC12C5410AD.H"
#define uint unsigned int
#define uchar unsigned char
sbit MCLK=P1^2;
sbit SCLK=P1^1;
sbit SDA=P1^0;
sbit N485=P3^2;
uchar bdata DATA;
sbit BIT0=DATA^0;
sbit BIT7=DATA^7;
uchar idata RX[10],TX[28];
uchar Rx_Num;
uchar Rs485_Flag;
uchar Numlong;
//unsigned int CRC16 (unsigned char *nData, unsigned char wLength);
void InitialUart();
void TXD_Int(uchar *TX,uchar Send_Num);
void T0_init(void);
// 发送一个数据
void putbytespi(uchar ch)
{
uchar i;
if(!MCLK)return; //
MCLK=0; //申请通讯
DATA=ch;
for(i=4;i!=0;i--)
{
while(SCLK); //检测从机响应
SDA=BIT0; //放一个bit到SDA
MCLK=1;
DATA=DATA>>1; //准备下一个bit
while(!SCLK); //检测从机响应
SDA=BIT0; //放一个bit到SDA
MCLK=0;
DATA=DATA>>1; //准备下一个bit
}
while(SCLK); //检测从机收完
MCLK=1;
while(!SCLK);//等待从机准备好
SDA=1;
}
//接收一个数据
//调用之前最好检测MCLK是否为0(对方是否申请数据通讯)再进入,否则里面是死等此信
uchar getbytespi()
{
uchar i;
while(MCLK);
SCLK=0; //接受通讯请求
for(i=4;i!=0;i--)
{
DATA=DATA>>1; //准备收下一个bit
while(!MCLK); //检测主机放数据
BIT7=SDA;//收一个bit
SCLK=1;
DATA=DATA>>1; //准备收下一个bit
while(MCLK); //检测主机放数据
BIT7=SDA; //收一个bit
SCLK=0;
}
while(!MCLK); //检测主机发完
SCLK=1;
return(DATA);
}
void main(void)
{
unsigned int ShowNum;
for(ShowNum = 0; ShowNum < 0xffff; ShowNum ++);
WDT_CONTR &=~0x20;
WDT_CONTR = 0x3E; //看门狗定时2.2755*2S
T0_init();
InitialUart();
// MCLK=1;
EA=1;
ES = 1;
N485=0;
Rx_Num=0;
RX[5]=getbytespi();
RX[6]=getbytespi();
RX[7]=getbytespi();
while (1)
{
}
}
//-------------------------------------------------------------------------------//
//初始化串口通讯程序-------------------------------------------------------------//
//Baud---------------------------------------------------------------------------//
//0xFF 28800---------------------------------------------------------------------//
//0xFE 14400---------------------------------------------------------------------//
//0xFD 9600----------------------------------------------------------------------//
//0xFA 4800----------------------------------------------------------------------//
//0xF4 2400----------------------------------------------------------------------//
//0xE8 1200----------------------------------------------------------------------//
//-------------------------------------------------------------------------------//
void InitialUart()
{
SCON = 0x50;
TMOD |= 0x20;
TH1 = 0xFa;
TL1 = 0xFa;
TR1 = 1;
ES = 1;
}
//-----------------------------------------------------------------------------
//串口发送一个字节
//功能:发送一个字节数据
//入口参数:发送数据
//出口参数:无
//-----------------------------------------------------------------------------
void Send_Data(uchar Serial_data)
{
TI = 0;
SBUF = Serial_data;
while(!TI);
TI = 0;
}
//-----------------------------------------------------------------------------
//发送一帧数据函数
//原型:void TXD_Int(uchar *TX);
//功能:发送一帧数据
//入口参数:发送数据帧地址指针,Send_Num:发送数据的个数
//出口参数:无
//-----------------------------------------------------------------------------
void TXD_Int(uchar *TX,uchar Send_Num)
{
uchar i;
for(i = 0; i < Send_Num; i ++) Send_Data(*(TX+i));
RI = 0;
}
//-----------------------------------------------------------------------------
//UART0_interrupt
//-----------------------------------------------------------------------------
void UART0_ISR (void) interrupt 4
{ uchar i;
if(RI == 1)
{
RI = 0;
RX[Rx_Num] = SBUF;
Rx_Num ++;
if(RX[0] != 0x2A) Rx_Num = 0;
if(Rx_Num >= 5)
{
Rx_Num = 0;
if((RX[0]==0X2A)&&(RX[1]==RX[5])&&(RX[2]==RX[6])&&(RX[3]==RX[7]))
{
switch(RX[4])
{
case 0x30:
Numlong=24;
RX[5] = Numlong;
N485=1;
for (i=0;i<6;i++) putbytespi(RX[i]);
break;
case 0x31:
Numlong=23;
RX[5] = Numlong;
N485=1;
for (i=0;i<6;i++) putbytespi(RX[i]);
break;
case 0x32:
Numlong=28;
RX[5] = Numlong;
N485=1;
for (i=0;i<6;i++) putbytespi(RX[i]);
break;
case 0x33:
Numlong=12;
RX[5] = Numlong;
N485=1;
for (i=0;i<6;i++) putbytespi(RX[i]);
break;
case 0x34:
Numlong=8;
RX[5] = Numlong;
N485=1;
for (i=0;i<6;i++) putbytespi(RX[i]);
break;
case 0x35:
Numlong=20;
RX[5] = Numlong;
for (i=0;i<6;i++) putbytespi(RX[i]);
N485=1;
break;
case 0x36:
Numlong=4;
RX[5] = Numlong;
N485=1;
for (i=0;i<6;i++) putbytespi(RX[i]);
break;
case 0x37:
Numlong=24;
RX[5] = Numlong;
N485=1;
for (i=0;i<6;i++) putbytespi(RX[i]);
break;
default:
break;
}
}
}
}
}
void T0_init(void) //定时器初始化
{
TR0=0;
TMOD = 0X01;
TL0 =0X66;
TH0 =0XFC;
TR0=1;
ET0 = 1; //置中断优先级为高
PT0 = 1; //允许定时器中断
}
void timer0 (void) interrupt 1 using 3
{
//uchar SPI_GetByte[12];
uchar i;
TR0=0;
WDT_CONTR = 0x3E;
TL0 =0X66;
TH0 =0XFC;
if (MCLK==0)
{
N485=1;
for (i=0;i<Numlong;i++) TX[i]=getbytespi();
TXD_Int(TX,Numlong);
N485=0;
}
TR0=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -