📄 test.c
字号:
#include "stc89c51.h"
sbit CANINT = P3^2;
sbit SPI_SCK = P3^3;
sbit SPI_DO = P3^4;
sbit SPI_DI = P3^5;
sbit SPI_CE = P3^6;
sbit KEY0 = P1^0;
sbit KEY1 = P1^1;
sbit LED = P1^5;
unsigned char DataBuf[8];
unsigned char CanRxBuf[32]; //CAN接收的数据缓存FIFO
unsigned char CanRxPin,CanRxPout; //数据进和出指针
unsigned char TxFlag;
#include "MCP2515.c"
unsigned char Key0Time,Key1Time;
unsigned char Value;
//unsigned char xdata RsBuf[256];
//unsigned char ComTemp[10];
unsigned char xdata ComBuf[25][10];
unsigned char ComBufPin,ComBufPout; //串口缓冲器FIFO指针
unsigned char ComInCoun;
void SendCom(unsigned char i)
{
SBUF=i;while(!TI);TI=0;
}
///////////////////////////////////////////////////////////////////////////////
//以下为测试相关程序
//接收串口数据
//串口数据格式:
//第一个0x55 第二,三为要发送的CAN设备ID号,第四个为要发送的字节数量,最大为250Bytes
void uart(void) interrupt 4
{
if(RI)
{
RI=0;
TH0=0xa0; TF0=0;ET0=1;TR0=1; //开定时器延时1600us判断是否串口结束
ComBuf[ComBufPin][ComInCoun]=SBUF; //将接收的数据存至缓冲区
ComInCoun++;
if(ComInCoun>9)
{
ComInCoun=0;
ComBufPin++;
if(ComBufPin>24) ComBufPin=0;
ES=0;
if(ComBufPin!=ComBufPout) SBUF=0x55; //空间未满可以发送下一个字节
else SBUF=0xff; //空间已满
while(!TI);TI=0;
ES=1;
}
}
if(TI)
{
TI=0;
CanRxPout++;
if(CanRxPout>31) CanRxPout=0;
if(CanRxPout!=CanRxPin) SBUF=CanRxBuf[CanRxPout]; //查看是否还有要发的数据
else TxFlag=1; //本次完成数据发送
LED=~LED;
}
}
//数据接收结束
void timer0(void) interrupt 1
{
//unsigned char i;
ET0=0;TR0=0;
ComInCoun=0;
}
/*=============================================================================
//参 数:
//函数功能:
=============================================================================*/
void CanInt0(void) interrupt 2 //CAN中断
{
//unsigned char i;
}
void initUart(void)
{
EA=0;
TMOD|=0x20;
SCON=0x50;
TH1=0xff;
TL1=0xff;
TR1=1;
ET0=0;
TR0=0;
ET1=0;
ES=1;
}
void Key(void)
{
if(KEY0==0)
{
Key0Time++;
if(Key0Time>150)
{
}
}
else
{
if(Key0Time>5)
{
DataBuf[0]=1;
DataBuf[1]=2;
DataBuf[2]=3;
DataBuf[3]=4;
DataBuf[4]=5;
DataBuf[5]=6;
DataBuf[6]=7;
DataBuf[7]=8;
MCP2515_Send(MCP_LOAD_TX1,0x22,0,8);
}
Key0Time=0;
}
if(KEY1==0)
{
Key1Time++;
if(Key1Time>150)
{
Key1Time=0;
}
}
else
{
if(Key1Time>5)
Key1Time=0;
}
}
void delay1ms(unsigned char i)
{
unsigned char j,k;
do
{
j=36;
do
{
k=25;while(--k);
}
while(--j);
}
while(--i);
}
/*=============================================================================
//输入参数: Txbn 选择要发送的数据缓冲区,
#define MCP_LOAD_TX0 0x40
#define MCP_LOAD_TX1 0x42
#define MCP_LOAD_TX2 0x44
//输出参数: no
//外部变量: CanBuf[8] 要发送至CAN器件的数组
//函数功能: 寄存器位置1
=============================================================================*/
void Rs232Can(unsigned char Txbn)
{
unsigned char idh,idl,bytes,i,j;
unsigned char Coun=0;
idh=ComBuf[ComBufPout][0]; //取出ID D3-D10
idl=ComBuf[ComBufPout][1]&0xe0; //取出ID D0-D2
bytes=ComBuf[ComBufPout][1]&0x0f; //要发送的字节数
i=0;j=2; //将从串口收到的数据向CAN转发
do
{
CanBuf[i]=ComBuf[ComBufPout][j];
i++;j++;
}
while(i!=bytes);
MCP2515_Send(Txbn,idh,idl,bytes); //向缓冲区装载数据
if(Txbn==MCP_LOAD_TX0) MCP2515_Command(MCP_RTS_TX0); //TX0请求发送
if(Txbn==MCP_LOAD_TX1) MCP2515_Command(MCP_RTS_TX1); //TX1请求发送
ComBufPout++; //取下一个数据
if(ComBufPout>25) ComBufPout=0; //取出指针循环
}
void ledloop(void)
{
unsigned char i,j;
for(i=8;i--;)
{
LED=~LED;
for(j=10;j--;)delay1ms(200);
}
}
void main(void)
{
unsigned char time,i;
unsigned char time0;
delay1ms(200);
LED=0;
EA=0;
initUart();
MCP2515_Init();
EA=1;
CANINT=1;
//Rs323-Can相关变量初始化
ComInCoun=0;
ComBufPin=0;
ComBufPout=0;
TxFlag=1;
for(;;)
{
Key();
if(ComBufPin!=ComBufPout) //判断串口输入的指针与输出的指针是否相等
{
i=MCP2515_Status();
switch(i&0x14) //判断TXB0 TXB1是否可以发送数据
{
case 0x00: //都可以发送数据
MCP2515_ClrBit(MCP_TXB0CTRL,TXP0); //清TXB0发送优先级
Rs232Can(MCP_LOAD_TX1); //由TXB1发送数据
break;
case 0x04:
MCP2515_SetBit(MCP_TXB0CTRL,TXP0); //提高TXB0发送优先级
Rs232Can(MCP_LOAD_TX1); //由TXB1发送数据
break;
case 0x10:
MCP2515_ClrBit(MCP_TXB0CTRL,TXP0); //清TXB0发送优先级
Rs232Can(MCP_LOAD_TX0); //由TXB0发送数据
break;
case 0x14: //都在发送数据,退出
break;
}
}
if(CanRxPin!=CanRxPout)
{
if(TxFlag)
{
TxFlag=0;
SBUF=CanRxBuf[CanRxPout];
}
}
if(CANINT==0) MCP2515_Receive(MCP_RXB0DLC); //读接收的缓冲并向串口发送
time++;
if(time==0)
{
time0++;
if(time0==0) LED=~LED;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -