📄 can6.h
字号:
/*本程序实现湿度值的检测,IIC总线显示以及CAN总线通讯*/
#include <reg51.h>
#include <absacc.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define CAN_add 0x06 /*本节点CAN的地址*/
extern delay(uint x);
uchar can_send_array[10]; /*CAN发送暂存*/
uchar can_receive_array[10]; /*CAN接收暂存*/
uchar ot_counter; /*CAN发送时间记数*/
bit trflag; /*发送成功标志*/
bit otflag;
bit erflag;
bit canflag; /*CAN接收信息标志*/
sbit CANRST=P1^2; /*CAN软件复位*/
/*********************************************************
************************子函数定义************************/
void dma_trans(void); /*CAN发送一帧子程序*/
void can_init(void); /*CAN初始化子程序*/
void can_int(void); /*CAN中断子程序*/
/*CAN寄存器定义*/
#define CON_REG XBYTE[0x00] /* 82C200 CONTROL REG */
#define COM_REG XBYTE[0x01] /* 82C200 COMMAND REG */
#define STA_REG XBYTE[0x02] /* 82C200 STATUS REG */
#define INT_REG XBYTE[0x03] /* 82C200 INTERRUPT REG */
#define ACC_C_REG XBYTE[0x04] /* 82C200 ACCEPTANCE CODE REG */
#define ACC_M_REG XBYTE[0x05] /* 82C200 ACCEPTANCE MARK REG */
#define TIM0_REG XBYTE[0x06] /* 82C200 BUS TIMING 0 REG */
#define TIM1_REG XBYTE[0x07] /* 82C200 BUS TIMING 1 REG */
#define OUT_C_REG XBYTE[0x08] /* 82C200 OUTPUT CONTROL REG */
#define TRAN_REG0 XBYTE[0x0A] /* 82C200 TRANSMIT BUFFER REG */
#define TRAN_REG1 XBYTE[0x0B]
#define TRAN_REG2 XBYTE[0x0C]
#define TRAN_REG3 XBYTE[0x0D]
#define TRAN_REG4 XBYTE[0x0E]
#define TRAN_REG5 XBYTE[0x0F]
#define TRAN_REG6 XBYTE[0x10]
#define TRAN_REG7 XBYTE[0x11]
#define TRAN_REG8 XBYTE[0x12]
#define TRAN_REG9 XBYTE[0x13]
#define RECV_REG0 XBYTE[0x14] /* 82C200 RECEIVE BUFFER REG */
#define RECV_REG1 XBYTE[0x15]
#define RECV_REG2 XBYTE[0x16]
#define RECV_REG3 XBYTE[0x17]
#define RECV_REG4 XBYTE[0x18]
#define RECV_REG5 XBYTE[0x19]
#define RECV_REG6 XBYTE[0x1A]
#define RECV_REG7 XBYTE[0x1B]
#define RECV_REG8 XBYTE[0x1C]
#define RECV_REG9 XBYTE[0x1D]
//can中断子程序//
void can_int() interrupt 0 using 1 /*CAN中断服务程序*/
{
uchar interpt,i;
uchar xdata *pt;
EX0=0;
pt=&RECV_REG0;
interpt=INT_REG;
if(interpt&0x04)
{
erflag=1; /*置出错标志*/
}
else
{
if(interpt&0x02) /*发送中断*/
{
trflag=1; /*置成功发送标志*/
_nop_();
}
else if(interpt&0x01) /*接收中断*/
{
for(i=0;i<10;i++)
{
can_receive_array[i]=*(pt+i);
}
_nop_();
COM_REG=0x0c; /*CAN释放接收缓存*/
canflag=1;
}
}
EX0=1;
}
void timer1(void) interrupt 3 using 3 /*T/C1中断服务子程序*/
{
TH1=0x3c;
TL1=0xb0;
ot_counter++;
if(ot_counter>=10)
{
ot_counter=0;
otflag=1;
}
}
//can发送子程序//
void dma_trans() /*CAN发送子程序*/
{
uchar xdata *p;
uchar i;
can_send_array[0]=CAN_add;
can_send_array[1]=8;
p=&TRAN_REG0;
if((STA_REG&0x0c)==0x0c) /*如果上次发送已完成,而且发送缓存为空,则允许发送;否则复位CAN */
{
for(i=0;i<10;i++)
{
*p=can_send_array[i];
p=p+1;
}
_nop_();
_nop_();
COM_REG=0x01; /*启动发送命令*/
TH1=0x3c;
TL1=0xb0;
TR1=1; /*启动定时器1(50ms),监视CAN发送是否超时*/
while(trflag==0&&erflag==0&&otflag==0);
TR1=0; /*关闭定时器0*/
if(trflag==1)
{
trflag=0; /*发送成功*/
}
else if(erflag==1) /*发送出错,置该教室状态为“0”,并复位CAN*/
{
CANRST=0; /*P12用于复位CAN*/
_nop_();
_nop_();
_nop_();
_nop_();
CANRST=1;
can_init();
}
else if(otflag==1) /*发送超时,复位CAN */
{ otflag=0;
CANRST=0;
_nop_();
_nop_();
_nop_();
_nop_();
CANRST=1;
can_init();
}
}
else
{ CANRST=0;
_nop_();
_nop_();
_nop_();
_nop_();
CANRST=1;
can_init();
}
}
//can初始化//
void can_init(void) /*CAN初始化子程序*/
{
uchar i;
for(i=0;i<5;i++)
{ _nop_(); }
CON_REG=0x01; /*进入复位状态*/
ACC_C_REG=CAN_add; /*接受码为本采集器地址*/
ACC_M_REG=0x00; /*接收屏蔽寄存器=00,表示全相关*/
TIM0_REG=0x07;
TIM1_REG=0xff; /*数据的发送速率为40K*/
OUT_C_REG=0xaa; /*输出控制寄存器*/
delay(500);
CON_REG=0xfe; /*控制寄存器,复位时返回正常运行状态*/
/*can_receive_array[0]=CAN_add;
can_receive_array[1]=0x01;*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -