📄 test.c
字号:
#include <stdio.h>
#include <../philips/reg51f.h>
#include " sja1000.h "
#define HIGH 1
#define LOW 0
unsigned char Count = 0;
unsigned char Count1= 0; //慢闪
unsigned char FramID[4] ; //帧头
unsigned char TXDData[8]; //发送的数据
unsigned char RXDData[8] ; //接收的数据
unsigned char a[18]={0x55,0xaa,0x00,0x12,0x08,0x08,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0xff,0x00};
long int aa,bb;
long int chk;
sbit mute=P2^5; //消音
sbit bell=P1^1; //外接电铃
sbit ha=P2^6; //蜂鸣器
//串行输入信号控制脚
sbit DATp=P1^5;
sbit CLKp=P1^4;
sbit CTLp=P1^3;
unsigned char bdata tData[2]; /* 数据暂存区 */
sbit as1=tData[0]^0; //按钮状态
sbit as2=tData[0]^1;
sbit as3=tData[0]^2;
sbit as4=tData[0]^3;
sbit as5=tData[0]^4;
sbit as6=tData[0]^5;
sbit as7=tData[0]^6;
sbit as8=tData[0]^7;
sbit ls1=tData[1]^7; //灯的状态
sbit ls2=tData[1]^6;
sbit ls3=tData[1]^5;
sbit ls4=tData[1]^4;
sbit ls5=tData[1]^3;
sbit ls6=tData[1]^2;
sbit ls7=tData[1]^1;
sbit ls8=tData[1]^0;
sbit led1=P3^3; //指示灯状态
sbit led2=P3^4;
sbit led3=P3^5;
sbit led4=P2^0;
sbit led5=P2^1;
sbit led6=P2^2;
sbit led7=P2^3;
sbit led8=P2^4;
//若要改变发送顺序,则可以改变diss,astate,lstate的字节顺序
unsigned char bdata diss; //消音状态位
sbit dis1=diss^7;
sbit dis2=diss^6;
sbit dis3=diss^5;
sbit dis4=diss^4;
sbit dis5=diss^3;
sbit dis6=diss^2;
sbit dis7=diss^1;
sbit dis8=diss^0;
unsigned char bdata astate; //按钮延时判断状态位
sbit ass1=astate^7;
sbit ass2=astate^6;
sbit ass3=astate^5;
sbit ass4=astate^4;
sbit ass5=astate^3;
sbit ass6=astate^2;
sbit ass7=astate^1;
sbit ass8=astate^0;
unsigned char bdata lstate; //指示灯延时判断状态位
sbit lss1=lstate^7;
sbit lss2=lstate^6;
sbit lss3=lstate^5;
sbit lss4=lstate^4;
sbit lss5=lstate^3;
sbit lss6=lstate^2;
sbit lss7=lstate^1;
sbit lss8=lstate^0;
unsigned char bdata DataIn; /* 串行数据输入 */
sbit IN2 = DataIn^0;
bit flash,flashs;
void InitSJA( void ); //SJA初始化
void SEND( void ); //发送函数
void InitSYS( void ); //系统初始化
void ReadData(void) //串行读数据
{
unsigned char i,j;
CLKp = HIGH; /* 时钟线置高 */
DATp = HIGH; /* 数据线置高 */
CTLp = HIGH; /* 采样数据 */
CTLp = LOW;
CLKp = LOW; /* 时钟线置低 */
for(j=0;j<2;j++)
{
for(i=0;i<8;i++)
{ DataIn = DataIn<<1; /* 数据读入 一共8个 */
IN2 = DATp;
CLKp = HIGH; /* 时钟翻转 */
CLKp = LOW;
}
tData[j] = DataIn; /* 把数据存入暂存区 */
}
}
void delay(unsigned int i)
{
while(i--);
}
//SJA1000初始化
void InitSJA( void )
{
PX0 = PRIORITY_HIGH; /*设CAN 优先中断 */
IT0 = INTLEVELACT; /*中断0 为电平激活 */
EA = DISABLE; /*所有中断禁能 */
SJAIntEn = DISABLE; /*来自SJA100 的外部中断禁能 */
while((ModeControlReg & RM_RR_Bit)==ClrByte)
{
/*其他位而不是复位模式/请求位没有改变 */
ModeControlReg = ModeControlReg|RM_RR_Bit;
}
ClockDivideReg = CANMode_Bit|CLKOff_Bit;/*PeliCan,同时关闭时钟*/
/*定义验收代码和屏蔽 */
AcceptCode0Reg = 0xaa;
AcceptCode1Reg = 0xaa;
AcceptCode2Reg = 0xaa;
AcceptCode3Reg = 0xaa;
AccepMask0Reg = 0x00;
AccepMask1Reg = 0x00;
AccepMask2Reg = 0x00;
AccepMask3Reg = 0x00;
/*位频率250Kbit/s@16MHz 总线被采样一次 */
BusTiming0Reg= 0x01;
BusTiming1Reg= 0x1C;
/*配置CAN 输出TX0 悬空TX1 推挽正常输出模式 */
OutControlReg = Tx1Float|Tx0PshPull|NormalMode;
do /*等待直到RM_RR_Bit 清零 */
{
ModeControlReg = AFM_Bit; //进入工作模式,选择单个验收滤波器32位
}while((ModeControlReg&RM_RR_Bit) != ClrByte);
InterruptEnReg = RIE_Bit|BEIE_Bit|DOIE_Bit; /*SJA1000 的接收中断使能 */
/*SJA1000 的错误中断使能 */
/*SJA1000 的溢出中断使能 */
SJAIntEn = ENABLE; /*SJA1000 的外部中断使能 */
EA = ENABLE; /*所有中断使能 */
}
//数据发送
void SEND(void)
{
if(StatusReg&TBS_Bit==TBS_Bit); //发送缓冲区释放
{
TxFramInFo = 0x88; /* 扩展帧 */
TxBuffer1 = FramID[0]; //帧ID
TxBuffer2 = FramID[1];
TxBuffer3 = FramID[2];
TxBuffer4 = FramID[3];
TxBuffer5 = TXDData[0]; //发送的数据
TxBuffer6 = TXDData[1];
TxBuffer7 = TXDData[2];
TxBuffer8 = TXDData[3];
TxBuffer9 = TXDData[4];
TxBuffer10 = TXDData[5];
TxBuffer11 = TXDData[6];
TxBuffer12 = TXDData[7];
CommandReg = TR_Bit; /*置位发送请求位 */
}
}
void senddata(Uchar word)
{ P=0;
ACC=0;
ACC=word;
TB8=!P;
SBUF=ACC;
while(TI==0);
TI=0;
}
void send_422(void)
{
aa=0;
bb=0;
chk=0;
a[12]=0xff-lstate;
a[13]=0xff-astate;
aa=a[0]+a[2]+a[4]+a[6]+a[8]+a[10]+a[12]+a[16];
bb=a[1]+a[3]+a[5]+a[7]+a[9]+a[11]+a[13]+a[17];
chk=(aa<<8)+bb;
chk = (chk >> 16) + (chk & 0xffff);
chk+=(chk>>16);
a[15]=~chk;
a[14]=~(chk>>8);
senddata(a[0]);
senddata(a[1]);
senddata(a[2]);
senddata(a[3]);
senddata(a[4]);
senddata(a[5]);
senddata(a[6]);
senddata(a[7]);
senddata(a[8]);
senddata(a[9]);
senddata(a[10]);
senddata(a[11]);
senddata(a[12]);
senddata(a[13]);
senddata(a[14]);
senddata(a[15]);
senddata(a[16]);
senddata(a[17]);
}
//系统初始化
void InitSYS(void)
{ delay(1000);
TMOD=0x21; // 定时器1工作在模式2,自动再装入的8位计数器
// 定时器0工作在模式1,16位计数器
ET0=1; // 开定时器0中断
TR0=1; // 启动定时器0
EXTRAMCtrReg=EXTRAM; /* 低地址(0~128) 使用外部RAM */
EA=1;
SCON=0xD0; //方式3
TH1=0xf7;
TR1=1;
TI=1;
PCON|=0X80;
}
//定时器0中断程序
void Timer0_int( void ) interrupt 1
{ static unsigned char c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13,c14,c15,c16,c17; //计数用
TR0=0;
if( Count >= 7 )
{ SEND();
flash=!flash; //快闪信号
Count = 0;
}
else Count++;
if( Count1 >= 15 )
{
flashs=!flashs; //慢闪信号
Count1 = 0;
}
else Count1++;
if( Count == 7 )
send_422();
ReadData();
if(as1) //按钮1
{ c1++;
if(c1>4)
{ass1=1;c1=0;}
}
else
{ass1=0;c1=0;dis1=0;}
if(as2) //按钮2
{ c2++;
if(c2>4)
{ass2=1;c2=0;}
}
else
{ass2=0;c2=0;dis2=0;}
if(as3) //按钮3
{ c3++;
if(c3>4)
{ass3=1;c3=0;}
}
else
{ass3=0;c3=0;dis3=0;}
if(as4) //按钮4
{ c4++;
if(c4>4)
{ass4=1;c4=0;}
}
else
{ass4=0;c4=0;dis4=0;}
if(as5) //按钮5
{ c5++;
if(c5>4)
{ass5=1;c5=0;}
}
else
{ass5=0;c5=0;dis5=0;}
if(as6) //按钮6
{ c6++;
if(c6>4)
{ass6=1;c6=0;}
}
else
{ass6=0;c6=0;dis6=0;}
if(as7) //按钮7
{ c7++;
if(c7>4)
{ass7=1;c7=0;}
}
else
{ass7=0;c7=0;dis7=0;}
if(as8) //按钮8
{ c8++;
if(c8>4)
{ass8=1;c8=0;}
}
else
{ass8=0;c8=0;dis8=0;}
if(ls1) //指示灯1
{ c9++;
if(c9>4)
{lss1=1;c9=0;}
}
else
{lss1=0;c9=0;}
if(ls2) //指示灯2
{ c10++;
if(c10>4)
{lss2=1;c10=0;}
}
else
{lss2=0;c10=0;}
if(ls3) //指示灯3
{ c11++;
if(c11>4)
{lss3=1;c11=0;}
}
else
{lss3=0;c11=0;}
if(ls4) //指示灯4
{ c12++;
if(c12>4)
{lss4=1;c12=0;}
}
else
{lss4=0;c12=0;}
if(ls5) //指示灯5
{ c13++;
if(c13>4)
{lss5=1;c13=0;}
}
else
{lss5=0;c13=0;}
if(ls6) //指示灯6
{ c14++;
if(c14>4)
{lss6=1;c14=0;}
}
else
{lss6=0;c14=0;}
if(ls7) //指示灯7
{ c15++;
if(c15>4)
{lss7=1;c15=0;}
}
else
{lss7=0;c15=0;}
if(ls8) //指示灯8
{ c16++;
if(c16>4)
{lss8=1;c16=0;}
}
else
{lss8=0;c16=0;}
if(!mute)
{dis1=ass1;
dis2=ass2;
dis3=ass3;
dis4=ass4;
dis5=ass5;
dis6=ass6;
dis7=ass7;
dis8=ass8;
}
if(astate!=(lstate|diss)) //蜂鸣器
{c17++;
if(c17>2)
{ha=flash;c17=3;bell=0;}
}
else
{ha=1;bell=1;c17=0;}
TR0=1;
}
/* CAN总线中断子程序 */
void CANInt(void) interrupt 0
{
/*从SJA1000 读中断寄存器的内容并临时保存所有中断标志被清除在PeliCAN 模式里
接收中断RI 被首先清除当给出释放缓冲器命令时*/
ET0 = DISABLE; /* 定时器0 中断禁能 */
CANInterrupt = InterruptReg;
CANState = StatusReg;
if(BEI_BitVar )
InitSJA();
/* 错误中断处理 */
if(EI_BitVar == YES)
{
if((ModeControlReg&RM_RR_Bit) != ClrByte)
{
ModeControlReg = ClrByte; /* 进入工作模式 */
InterruptEnReg = RIE_Bit|EIE_Bit|DOIE_Bit; /*SJA1000 的接收中断使能 */
/*SJA1000 的错误中断使能 */
/*SJA1000 的溢出中断使能 */
}
}
/*检查接收中断和读一个或所有接收到的信息 */
if(RI_BitVar == YES) /*检测到接收中断 */
{ /*从SJA1000 得到接收缓冲器的内容并将它存入控制器的内部存储器*/
RXDData[0]=RxBuffer5;
RXDData[1]=RxBuffer6;
RXDData[2]=RxBuffer7;
RXDData[3]=RxBuffer8;
RXDData[4]=RxBuffer9;
RXDData[5]=RxBuffer10;
RXDData[6]=RxBuffer11;
RXDData[7]=RxBuffer12;
CommandReg = RRB_Bit; /* 释放接收缓冲器 */
}
if(DOI_BitVar == YES ) /* 检查数据是否溢出 */
{
CommandReg = CDO_Bit; /* 发清除数据溢出命令 */
}
ET0 = ENABLE; /* 定时器0 中断使能 */
}
void main( void )
{
InitSYS();
InitSJA();
while( 1 )
{
FramID[0] = 0x04; //帧ID
FramID[1] = 0xb1;
FramID[2] = 0xc0;
FramID[3] = 0x00;
TXDData[0] = 0xff-lstate; //发送的数据
TXDData[1] = 0xff-astate;
TXDData[2] = 0x00;
TXDData[3] = 0x00;
TXDData[4] = 0x00;
TXDData[5] = 0x00;
TXDData[6] = 0x00;
TXDData[7] = 0x00;
led1=!ass1|(!lss1&((flash&!dis1)|(flashs&dis1)));
led2=!ass2|(!lss2&((flash&!dis2)|(flashs&dis2)));
led3=!ass3|(!lss3&((flash&!dis3)|(flashs&dis3)));
led4=!ass4|(!lss4&((flash&!dis4)|(flashs&dis4)));
led5=!ass5|(!lss5&((flash&!dis5)|(flashs&dis5)));
led6=!ass6|(!lss6&((flash&!dis6)|(flashs&dis6)));
led7=!ass7|(!lss7&((flash&!dis7)|(flashs&dis7)));
led8=!ass8|(!lss8&((flash&!dis8)|(flashs&dis8)));
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -