?? 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 + -