📄 can
字号:
if(p15==0)
{
biaoshi=1;
jia1--;
if(jia1<0)
jia1=4;
CAN_TXD();
while(!p15);
}
}
if(p11==0)
{
Delay(500);
if(p11==0)
{
biaoshi=2;
CAN_TXD();
LCD_Clear();
LCD_Write_Chinese(0,0,0);//温
LCD_Write_Chinese(2,0,1);//度
LCD_Write_Chinese(6,0,2);//湿
LCD_Write_Chinese(8,0,3);//度
LCD_Write_Chinese(4,0,12);//和
LCD_Write_Chinese(0,2,9); //已
LCD_Write_Chinese(2,2,10);//发
LCD_Write_Chinese(4,2,11);//送
Delay(40000);
LCD_Clear();
while(!p11);
}
}
if(p12==0)
{
Delay(500);
if(p12==0)
{
CAN_yuan( ) ;
while(!p12);
}
CAN_RXD();
}
if(p14==0)
{
Delay(500);
if(p14==0)
{
biaoshi=1;
jia1++;
if(jia1>4)
jia1=0;
CAN_TXD();
while(!p14);
}
}
}
///////////////////////////////////////////////////主函数////////////////////////////////////
void main()
{
fg=0;
fd=0;
sg=0;
sd=0;
shi1=0;
shi2=0;
count=0;
RST=0;
Delay(100);
Delay(100);
Delay(100);
Delay(100);
Delay(100);
RST=1;
LCD_init();
LCD_Clear();
SJA_RST = 0; //复位引脚
Delay(100);
SJA_RST = 1;//CAN总线复位管脚
Delay(100);
Delay(100);
Delay(100);
SJA_CS = 0;//CAN总线片选有效
Delay(100);
SJA_CS = 1;//CAN总线片选无效,保证数据线上的变化不会影响SJA1000
//CPU初始化
CAN_init(); //SJA1000初始化,对 SJA1000寄存器的读写是采用外部寄存器寻址方式,所以不需要程序单独控制片选有效无效
_nop_();
_nop_();
Delay(200);
TMOD=0x01;
EA=1;
ET0=1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
while(1) ////////////死循环////////////
{
LCD_Write_Chinese(0,0,0);
LCD_Write_Chinese(2,0,1);
LCD_Write_Charater(4,0,10);
LCD_Write_Chinese(0,2,2);
LCD_Write_Chinese(2,2,3);
LCD_Write_Charater(4,2,10);
LCD_Write_Charater(0,4,11);
LCD_Write_Charater(1,4,10);
LCD_Write_Charater(4,4,10);
RH();
for(u=0;u<256;u++)
{
if(u=U8RH_data_H)
{
d=u/100;
e=u/10;
f=u%10;
}
LCD_Write_Charater(6,2,d);
LCD_Write_Charater(7,2,e);
LCD_Write_Charater(8,2,f);
break;
}
for(j=0;j<256;j++)
{
if(j=U8T_data_H)
{
a=j/100;
b=j/10;
c=j%10;
}
LCD_Write_Charater(6,0,a);
LCD_Write_Charater(7,0,b);
LCD_Write_Charater(8,0,c);
break;
}
anjian();
CAN_RXD();
if(count>=20)
{
count=0;
fd++;
if(fd>=10)
{
fd=0;
fg++;
if(fg>=6)
{
fg=0;
sd++;
if(sd>=10)
{
sd=0;
sg++;
if(sg>=6)
{
sg=0;
shi1++;
if(shi1>=10)
{
shi1=0;
shi2++;
if((shi2=2)&&(shi1=4))
{
shi1=0;
shi2=0;
}
}
}
}
}
}
LCD_Write_Charater(2,4,shi1);
LCD_Write_Charater(3,4,shi2);
LCD_Write_Charater(5,4,sg);
LCD_Write_Charater(6,4,sd);
LCD_Write_Charater(7,4,10);
LCD_Write_Charater(8,4,fg);
LCD_Write_Charater(9,4,fd);
}
anjian();
CAN_RXD();
}
}
void zhongduan()interrupt 1
{
count++;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}
void CAN_init( void )
{
uchar ACRR[4];
uchar AMRR[4];
ACRR[0] = 0x11;
ACRR[1] = 0x22;
ACRR[2] = 0x33;
ACRR[3] = 0x44;//接收代码寄存器,节点1
AMRR[0] = 0xff;
AMRR[1] = 0xff;
AMRR[2] = 0xff;
AMRR[3] = 0xff;//接收屏蔽寄存器。 只接收主机发送的信息
// .0=1---reset MODRe,进入复位模式,以便设置相应的寄存器
//防止未进入复位模式,重复写入;
MODR = 0x09;
CDR = 0x88;//时钟分频; CDR.3=1--时钟关闭, CDR.7=0---basic CAN, CDR.7=1---Peli CAN
BTR0 = 0x03;
BTR1 = 0x1c;//16M晶振,波特率125Kbps
IER = 0xff;// .0=1--接收中断使能; .1=0--关闭发送中断使能
OCR = 0xaa;// 配置输出控制寄存器
CMR = 0x04;//命令寄存器;释放接收缓冲器
ACR = ACRR[0];
ACR1 = ACRR[1];
ACR2 = ACRR[2];
ACR3 = ACRR[3];//初始化标示码
AMR = AMRR[0];
AMR1 = AMRR[1];
AMR2 = AMRR[2];
AMR3 = AMRR[3];//初始化掩码
MODR = 0x08;
}
void CAN_TXD( void )
{
uchar data qushu;
uchar data TX_buffer[ N_can ] ;
TX_buffer[0] = 0x88;//TX.7=1扩展帧;TX.6=0数据帧; .3=1数据长度
TX_buffer[1] = 0x00;//本节点地址
TX_buffer[2] = 0x01;//
TX_buffer[3] = 0x02;//
TX_buffer[4] = 0x03;
TX_buffer[5] = d;//发送湿度过去
TX_buffer[6] = e;
TX_buffer[7] = f;
TX_buffer[8] =a ;// 发送温度过去
TX_buffer[9] =b;
TX_buffer[10] = c;
TX_buffer[11] = jia1;
TX_buffer[12] =biaoshi;
do{
qushu=SR;
Delay(100);
Delay(100);
}while(qushu&0x20);
do{
qushu=SR;
Delay(100);
}while(qushu&0x10);
TBSR = TX_buffer[0];
TBSR1 = TX_buffer[1];
TBSR2 = TX_buffer[2];
TBSR3 = TX_buffer[3];
TBSR4 = TX_buffer[4];
TBSR5 = TX_buffer[5];// 发送湿度过去
TBSR6 = TX_buffer[6];//
TBSR7 = TX_buffer[7];
TBSR8 = TX_buffer[8];// 发送温度过去
TBSR9 = TX_buffer[9];
TBSR10 = TX_buffer[10];
TBSR11 = TX_buffer[11];//jia1
TBSR12 = TX_buffer[12];//发送标识符过去
CMR = 0x01;//把数据发送过去
Delay(100);
Delay(100);
}
void CAN_yuan( void )
{
uchar data qushu;
uchar data TX_buffer[ N_can ] ;
TX_buffer[0] = 0xc8;//TX.7=1扩展帧;TX.6=0数据帧; .3=1数据长度
TX_buffer[1] = 0x00;//本节点地址
TX_buffer[2] = 0x01;//
TX_buffer[3] = 0x02;//
TX_buffer[4] = 0x03;
do{
qushu=SR;
Delay(100);
Delay(100);
}while(qushu&0x20);
do{
qushu=SR;
Delay(100);
}while(qushu&0x10);
TBSR = TX_buffer[0];
TBSR1 = TX_buffer[1];
TBSR2 = TX_buffer[2];
TBSR3 = TX_buffer[3];
TBSR4 = TX_buffer[4];
CMR = 0x01;//把数据发送过去
Delay(100);
Delay(100);
}
void CAN_RXD( void )
{//接收数据函数,在中断服务程序中调用
uchar data Judge;
Delay(100);
Delay(100);
Judge=SR;
if(!(Judge&0x20))
{
if(!(Judge&0x10))
{
if(Judge&0x01)
{
RX_buffer[0] = RBSR;
RX_buffer[1] = RBSR1;
RX_buffer[2] = RBSR2;
RX_buffer[3] = RBSR3;
RX_buffer[4] = RBSR4;
RX_buffer[5] = RBSR5;
RX_buffer[6] = RBSR6;
RX_buffer[7] = RBSR7;
RX_buffer[8] = RBSR8;
RX_buffer[9] = RBSR9;
RX_buffer[10] = RBSR10;
RX_buffer[11] = RBSR11;
RX_buffer[12] = RBSR12;
CMR=0x04; //释放接收缓冲器
Judge = ALC;//释放仲裁随时捕捉寄存器
Judge = ECC;//释放错误代码捕捉寄存器
if(RX_buffer[0]==0xc8)
{ CAN_TXD();
}
else {
LCD_Clear();
LCD_Write_Chinese(0,0,4);
LCD_Write_Chinese(2,0,5);
LCD_Write_Chinese(4,0,6);
LCD_Write_Chinese(6,0,7);
LCD_Write_Chinese(8,0,8);
LCD_Write_Charater(4,2,RX_buffer[5]);
Delay(40000);
LCD_Clear();
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -