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