📄 1.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 MCLK_1=P3^3;
sbit SCLK_1=P3^4;
sbit SDA_1=P3^5;
sbit N485=P3^2;
// 发送一个数据
//sfr TL0 = 0x8A; //TL0
//sfr TH0 = 0x8C; //TH0
uchar bdata DATA;
sbit BIT0=DATA^0;
sbit BIT7=DATA^7;
uchar idata RX[6];
uchar idata TX[28];
uchar Rx_Num;
uchar Rx_F_Num;//数据断开次数
uint Time2Cnt1=0;
uchar Numlong;
//sfr16 TL1 = 0xca; // Timer2 reload value
//sfr16 TH1 = 0xcc; // Timer2 counter
bit OneSecondFlag;
uint HuifuFlang1;
uint HuifuFlang2;
uint Time2Cnt1;
//unsigned int CRC16 (unsigned char *nData, unsigned char wLength);
void InitialUart();
void TXD_Int(uchar *TX,uchar Send_Num);
void T0_init(void);
putbytespi_1(uchar ch)
{
uchar i;
if(!MCLK_1)return; //
// P3M0=0X00;
// P3M1=0X28;//P3.3 P3.5 强推挽输出
MCLK_1=0; //申请通讯
DATA=ch;
for(i=4;i!=0;i--)
{
while(SCLK_1); //检测从机响应
SDA_1=BIT0; //放一个bit到SDA_1
MCLK_1=1;
DATA=DATA>>1; //准备下一个bit
while(!SCLK_1); //检测从机响应
SDA_1=BIT0; //放一个bit到SDA_1
MCLK_1=0;
DATA=DATA>>1; //准备下一个bit
}
while(SCLK_1); //检测从机收完
MCLK_1=1;
while(!SCLK_1);//等待从机准备好
SDA_1=1;
// P1M0=0X00;
// P1M1=0X00;//取消P3.3 P3.5强推挽输出
}
//接收一个数据
//调用之前最好检测MCLK_1是否为0(对方是否申请数据通讯)再进入,否则里面是死等此信
uchar getbytespi_1()
{
uchar i;
while(MCLK_1);
SCLK_1=0; //接受通讯请求
for(i=4;i!=0;i--)
{
DATA=DATA>>1; //准备收下一个bit
while(!MCLK_1); //检测主机放数据
BIT7=SDA_1;//收一个bit
SCLK_1=1;
DATA=DATA>>1; //准备收下一个bit
while(MCLK_1); //检测主机放数据
BIT7=SDA_1; //收一个bit
SCLK_1=0;
}
while(!MCLK_1); //检测主机发完
SCLK_1=1;
return(DATA);
}
// 发送一个数据
void putbytespi(uchar ch)
{
uchar i;
if(!MCLK)return; //
// P1M0=0X00;
// P1M1=0X05;//P1.2 P1.0 强推挽输出
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;
// P1M0=0X00;
// P1M1=0X05;//取消P1.2 P1.0 强推挽输出
}
//接收一个数据
//调用之前最好检测MCLK是否为0(对方是否申请数据通讯)再进入,否则里面是死等此信
uchar getbytespi()
{
uchar i;
while(MCLK);
// P1M0=0X00;
// P1M1=0X02;//P1.1 强推挽输出
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;
// P1M0=0X00;
// P1M1=0X00;//取消P1.2 P1.0 强推挽输出
}
while(!MCLK); //检测主机发完
SCLK=1;
return(DATA);
}
//-------------------------------------------------------------------------------//
//初始化串口通讯程序-------------------------------------------------------------//
//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;
TX[Rx_Num] = SBUF;
Rx_Num ++;
if(TX[0] != RX[4]) Rx_Num = 0;
if(Rx_Num >Numlong)
{
Rx_Num = 0;
if(HuifuFlang1==1)
{
for (i=0;i<Numlong;i++)
{
putbytespi(TX[i]);
}
}
if(HuifuFlang2==1)
{
for (i=0;i<Numlong;i++)
{
putbytespi_1(TX[i]);
}
}
}
}
}
void T0_init(void) //定时器0初始化
{
TR0=0;
TMOD = 0X01;
// TL0 =0X00;
// TH0 =0XDC; //10MS
TL0 =0X66;
TH0 =0XFC; // 1MS
TR0=1;
ET0 = 1; //置中断优先级为高
PT0 = 1; //允许定时器中断
}
void timer0 (void) interrupt 1 using 3
{
uchar i;
TR0=0;
WDT_CONTR = 0x3E;
TL0 =0X66;
TH0 =0XFC;
if ((MCLK==0)&&(HuifuFlang2==0))
{
N485=1;
for (i=0;i<6;i++) RX[i]=getbytespi();
Numlong=RX[5];
TXD_Int(RX,Numlong);
HuifuFlang1=1;
N485=0;
}
if ((MCLK_1==0)&&(HuifuFlang1==0))
{
N485=1;
for (i=0;i<5;i++) RX[i]=getbytespi_1();
TXD_Int(RX,Numlong);
HuifuFlang2=1;
N485=0;
}
TR0=1;
}
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;
MCLK_1=1;
Rx_Num=0;
N485=0;
RX[0]=0X2A;
RX[1]=getbytespi();
RX[2]=getbytespi();
RX[3]=getbytespi();
putbytespi_1(RX[1]);
putbytespi_1(RX[2]);
putbytespi_1(RX[3]);
EA=1;
ES = 1;
while (1)
{
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -