?? 00-整形,長整形(節點一).c
字號:
//00-整形數據發送實驗(節點一).c
//發送角色
//akuei2 22-10-09
#include "reg52.h"
#include "sja1000.h"
#define uchar unsigned char
#define Length sizeof(unsigned int)
//IO聲明
sbit SJACS=P2^0;
sbit SJARST=P2^3;
//數碼管嗎,位選碼
uchar code Led_Code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
uchar code Led_Select[]={0xef,0xdf,0xbf,0x7f};
//數據變量聲明
uchar ACR[4],AMR[4],TXD_Buffer[13],RXD_Buffer[13],TXD_Data,RXD_Data;
unsigned int Sec,t0;
//函數聲明
void Display(void);
void CAN_TXD(void);
void Split();
//50微秒延遲函數
void Delay_50us(int t)
{
uchar j;
t--;
for(;t>0;t--)
for(j=19;j>0;j--);
}
//數據初始化函數
void Init_Data(void)
{
int i;
ACR[0]='C';
ACR[1]='A';
ACR[2]='N';
ACR[3]='1';
AMR[0]=0x00;
AMR[1]=0x00;
AMR[2]=0x00;
AMR[3]=0x03;
TXD_Buffer[0]=0x88;
TXD_Buffer[1]='C';
TXD_Buffer[2]='A';
TXD_Buffer[3]='N';
TXD_Buffer[4]='2';
TXD_Buffer[5]=TXD_Data;
TXD_Buffer[6]=0x00;
TXD_Buffer[7]=0x00;
TXD_Buffer[8]=0x00;
TXD_Buffer[9]=0x00;
TXD_Buffer[10]=0x00;
TXD_Buffer[11]=0x00;
TXD_Buffer[12]=0x00;
for(i=0;i<13;i++)
{
RXD_Buffer[i]=0x00;
}
TXD_Data=0x00;
RXD_Data=0x00;
}
//CPU初始化函數
void Init_CPU(void)
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
ET0=1;
SJACS=1;
SJARST=1;
//IT0=1;
//EX0=1;
EA=1;
}
//節點初始化函數
void Init_CAN(void)
{
unsigned char bdata temp; //建立存儲在bdata中的臨時變量temp
do
{
MODR=0x09;
temp=MODR; //模式寄存器-設置復位模式而且單驗收濾波模式
}
while(!(temp&0x01)); //判斷
CDR=0x88; //時鐘分頻寄存器-設置PeliCAN模式,Clock off有效
BTR0=0x31; //總線時序寄存器-波特率為10kbps
BTR1=0x1c;
IER=0x01; //中斷使能寄存器-全部關閉
OCR=0xaa; //輸出控制寄存器-借簽...
CMR=0x04; //命令寄存器-釋放RXFIF0
ACR0=ACR[0]; //接收代碼寄存器-本節點地址位CAN0
ACR1=ACR[1];
ACR2=ACR[2];
ACR3=ACR[3];
AMR0=AMR[0]; //接收屏蔽寄存器-無任何屏蔽
AMR1=AMR[1];
AMR2=AMR[2];
AMR3=AMR[3]; //最后兩位為無用位,必須設置為邏輯1
do
{
MODR=0x08;
temp=MODR; //模式寄存器-退出復位模式,保持單驗收濾波模式
}
while(temp&0x01); //判斷...
}
//主函數
void main(void)
{
Init_Data();
Init_CPU();
Init_CAN();
while(1)
{
Display();
}
}
//數碼管顯示函數
void Display(void)
{
int Digit[4],i;
Digit[3]=Sec/1000; //第一個數碼管取千位
Digit[2]=Sec%1000/100; //第二個數碼管取百位
Digit[1]=Sec%100/10; //第三個數碼管取十位
Digit[0]=Sec%10; //第四個數碼管取個位
for(i=0;i<4;i++)
{
P0=Led_Code[Digit[3-i]]; //送數碼管碼
P2=Led_Select[i]; //送位選碼
Delay_50us(20); //延遲1微秒
}
}
//節點發送函數
void CAN_TXD(void)
{
unsigned char bdata temp;
do
{
temp=SR; //判斷報文接收完畢?
}
while(temp&0x10); //SR.4=0 發送閑置,SR.4=1 發送狀態中
do
{
temp=SR; //判斷最后報文請求?
}
while(!(temp&0x08)); //SR.3=0 沒有余報文請求,SR.3=1 還存在報文請求
do
{
temp=SR; //判斷TXFIFO是否鎖定?
}
while(!(temp&0x04)); //SR.2=0 鎖定,SR.2=1 開放
TBSR0=TXD_Buffer[0];
TBSR1=TXD_Buffer[1];
TBSR2=TXD_Buffer[2];
TBSR3=TXD_Buffer[3];
TBSR4=TXD_Buffer[4];
TBSR5=TXD_Buffer[5];
TBSR6=TXD_Buffer[6];
TBSR7=TXD_Buffer[7];
TBSR8=TXD_Buffer[8];
TBSR9=TXD_Buffer[9];
TBSR10=TXD_Buffer[10];
TBSR11=TXD_Buffer[11];
TBSR12=TXD_Buffer[12];
CMR=0x01; //命令寄存器-發送請求
}
//拆分函數
void Split()
{
unsigned int i,temp;
temp=Sec;
for(i=0;i<Length;i++) // 將變量a的值,逐個字節拆分然后復制temp
{
TXD_Buffer[i+5]=temp;
temp=temp>>8;
}
}
//定時器0中斷函數
void Ir_T0(void) interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t0++;
if(t0>=20)
{
t0=0;
Sec++;
Split();
CAN_TXD();
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -