?? can
字號:
Delay(60000);
}
}
}
///////////////////////////////////////////////////主函數////////////////////////////////////
void main(void)
{
bit Flag;
RST=0;
Delay(200);
Delay(200);
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;//定時器設置 0.1ms in 12M crystal
TH0=(65536-100)/256;
TL0=(65536-100)%256;//定時0.1mS
IE= 0x82; //打開中斷
TR0=1;
xsg();
CYCLE = 10;// 時間可以調整 這個是10調整 8位PWM就是256步
while(1)
{
/////////////////////
while(qieh)
{
CAN_RXD();
anjian();
while(!Flag)
{
Delay(5000); //延時時間,從一個亮度到下一個亮度的間隔時間,速度快就能看到連續效果
PWM_ON++;//這個使用較長延時,以便能看清楚變化過程
anjian();
if(PWM_ON == CYCLE)
{ //這個里可以添加其他程序 如到最亮時候控制設備
Flag=1;
}
}
CAN_RXD();
while(Flag) //亮度遞減 同上,是個相反的過程
{
Delay(5000);
PWM_ON--;
anjian();
CAN_RXD();
if(PWM_ON == 0)
{
Flag=0;
}
}
}
///////////////////////
while(!qieh)
{
CAN_RXD();
if(PWM_Num>=5)
PWM_Num=0;
switch(PWM_Num)
{
case 4:PWM_ON=0;break;//高電平時長
case 3:PWM_ON=4;break;
case 2:PWM_ON=6;break;
case 1:PWM_ON=8;break;
case 0:PWM_ON=10;break;
default:break;
}
if(p14==0)
{
Delay(300);
if(p14==0)
{
qieh=1;
}
}
CAN_RXD();
anjian();
}
}
}
void CAN_init( void )
{ uchar ACRR[4];
uchar AMRR[4];
ACRR[0] = 0x00;
ACRR[1] = 0x01;
ACRR[2] = 0x02;
ACRR[3] = 0x03;//接收代碼寄存器,節點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 = 0x01;// .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_yuan( void )
{
uchar data qushu;
uchar data TX_buffer[ N_can ] ;
CMR=0x04;
/*向CPU里面寫數據*/ TX_buffer[0] = 0xc8;//TX.7=1擴展幀;TX.6=0數據幀; .3=1數據長度
TX_buffer[1] = 0x11;//本節點地址
TX_buffer[2] = 0x22;//
TX_buffer[3] = 0x33;//
TX_buffer[4] = 0x44;//
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_TXD( void )
{
uchar data qushu;
uchar data TX_buffer[ N_can ] ;
CMR=0x04;
/*向CPU里面寫數據*/ TX_buffer[0] = 0x88;//TX.7=1擴展幀;TX.6=0數據幀; .3=1數據長度
TX_buffer[1] = 0x11;//本節點地址
TX_buffer[2] = 0x22;//
TX_buffer[3] = 0x33;//
TX_buffer[4] = 0x44;//
TX_buffer[5] = PWM_Num;
TX_buffer[6] = 0xef;
TX_buffer[7] = 0xee;
TX_buffer[8] = 0x44;//
TX_buffer[9] = 0x55;//
TX_buffer[10] = 0x66;//
TX_buffer[11] = 0x77;//
TX_buffer[12] =0x55;
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];
TBSR12 = TX_buffer[12];
CMR = 0x01;
Delay(100);
Delay(100);
}
/////////delay程序////////////////
void Delay(uint delay_time)
{//延時程序
while(delay_time--)
{}
}
void CAN_RXD( void )
{//接收數據函數,在中斷服務程序中調用
uchar data Judge;
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; //jia1
RX_buffer[12] = RBSR12; //
CMR=0x04;//釋放接收緩沖器
Judge = ALC;//釋放仲裁隨時捕捉寄存器
Judge = ECC;//釋放錯誤代碼捕捉寄存器
if(RX_buffer[0]==0xc8)
{ CAN_TXD();
}
if(RX_buffer[12]==2)
{qh=1;
xswsd();//調用溫度濕度接收程序
}
if(RX_buffer[12]==1)
{//LCD_Write_Chinese(0,2,4);
qieh=0;
PWM_Num=RX_buffer[11];
qh=0;
xsg();//調用對方光照等級程序
}
}
}
}
}
/********************************/
/* 定時中斷 */
/********************************/
void tim(void) interrupt 1 using 1
{
static unsigned char count; //
TH0=(65536-100)/256;
TL0=(65536-100)%256;//定時0.1mS
if (count==PWM_ON)
{
p10=0; //燈滅
}
count++;
if(count == CYCLE)
{
count=0;
if(PWM_ON!=0) //如果左右時間是0 保持原來狀態
p10=1;//燈亮
}
}
//////液晶顯示光照等級
void xsg(void)
{
if(qh==0) //液晶顯示光照等級
{
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,PWM_Num);//數據
}
}
//////液晶顯示對方的溫度濕度
void xswsd(void)
{
if(qh==1)
{
LCD_Clear();
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(6,2,RX_buffer[5]);//濕度
LCD_Write_Charater(7,2,RX_buffer[6]);//
LCD_Write_Charater(8,2,RX_buffer[7]);//
LCD_Write_Charater(6,0,RX_buffer[8]);//溫度
LCD_Write_Charater(7,0,RX_buffer[9]);//
LCD_Write_Charater(8,0,RX_buffer[10]);//
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -