?? main.c
字號(hào):
#include <P8XC5X2.H>
#include <intrins.H>
#include "sja_bcanconf.h"
#include "X5045.h"
sbit io=P2^6;
/*CAN通信定義*/
volatile unsigned char bdata flag_init; //保存中斷寄存器值
sbit rcv_flag=flag_init^0; //接收中斷標(biāo)志
sbit err_flag=flag_init^2; //錯(cuò)誤中斷標(biāo)志
unsigned char SendBuf[6]; //CAN發(fā)送緩沖區(qū)
unsigned char SampleHVal[8],SampleLVal[8]; //模擬量采集結(jié)果
#define BaseID 0
#define RTR 0
#define DLC 4
#define V_T1s 255 //1秒
#define V_T1m 20
#define V_T50ms 10 //100ms
#define V_TH0 0xEA /*10ms ,!notice: crystal 24MHz */
#define V_TL0 0x00
#define TERMINAL 0x00 //主機(jī)命令CAN通信標(biāo)識(shí)兼功能碼
volatile unsigned char CanID; //當(dāng)前CAN節(jié)點(diǎn)的標(biāo)識(shí)
void LedTest()
{
static char led=1;
led=!led;
io=led;
}
void InitWtd()
{
wren_dog(); //看門狗寫使能
wrsr_dog(0x03); //看門狗周期1.4秒
wrdi_dog(); //看門狗寫禁止
}
void FeedDog()
{
rest_dog();
}
void delayUs()
{
_nop_();
}
void delayMs(unsigned char a)
{
unsigned char i, j;
for(i = a; i > 0; i--)
for(j = 100; j > 0; j--);
}
/**//*****************************DS18B20*******************************/
sbit ds = P1^0;
//初始化DS18B20
//讓DS18B20一段相對長時(shí)間低電平, 然后一段相對非常短時(shí)間高電平, 即可啟動(dòng)
void dsInit()
{
//對于11.0592MHz時(shí)鐘, unsigned int型的i, 作一個(gè)i++操作的時(shí)間大于為8us
unsigned char i;
ds = 0;
i = 100; //拉低約800us, 符合協(xié)議要求的480us以上
while(i>0) i--;
ds = 1; //產(chǎn)生一個(gè)上升沿, 進(jìn)入等待應(yīng)答狀態(tài)
i = 5;
while(i>0) i--;
}
void dsWait()
{
unsigned char i;
while(ds)FeedDog();
while(~ds)FeedDog(); //檢測到應(yīng)答脈沖
//LedTest();
i = 4;
while(i > 0) i--;
}
//向DS18B20讀取一位數(shù)據(jù)
//讀一位, 讓DS18B20一小周期低電平, 然后兩小周期高電平,
//之后DS18B20則會(huì)輸出持續(xù)一段時(shí)間的一位數(shù)據(jù)
bit readBit()
{
unsigned char i;
bit b;
ds = 0;
i++; //延時(shí)約8us, 符合協(xié)議要求至少保持1us
ds = 1;
i++; i++; //延時(shí)約16us, 符合協(xié)議要求的至少延時(shí)15us以上
b = ds;
i = 10;
while(i>0) i--; //延時(shí)約64us, 符合讀時(shí)隙不低于60us要求
return b;
}
//讀取一字節(jié)數(shù)據(jù), 通過調(diào)用readBit()來實(shí)現(xiàn)
unsigned char readByte()
{
unsigned char i;
unsigned char j, dat;
dat = 0;
for(i=0; i<8; i++)
{
j = readBit();
//最先讀出的是最低位數(shù)據(jù)
dat = (j << 7) | (dat >> 1);
}
return dat;
}
//向DS18B20寫入一字節(jié)數(shù)據(jù)
void writeByte(unsigned char dat)
{
unsigned char i;
unsigned char j;
bit b;
for(j = 0; j < 8; j++)
{
b = dat & 0x01;
dat >>= 1;
//寫"1", 將DQ拉低15us后, 在15us~60us內(nèi)將DQ拉高, 即完成寫1
if(b)
{
ds = 0;
i++; i++; i++; //拉低約16us, 符號(hào)要求15~60us內(nèi)
ds = 1;
i = 10; while(i>0) i--; //延時(shí)約64us, 符合寫時(shí)隙不低于60us要求
}
else //寫"0", 將DQ拉低60us~120us
{
ds = 0;
i = 10; while(i>0) i--; //拉低約64us, 符號(hào)要求
ds = 1;
i++; i++; //整個(gè)寫0時(shí)隙過程已經(jīng)超過60us, 這里就不用像寫1那樣, 再延時(shí)64us了
}
}
}
//向DS18B20發(fā)送溫度轉(zhuǎn)換命令
void sendChangeCmd()
{
dsInit(); //初始化DS18B20, 無論什么命令, 首先都要發(fā)起初始化
dsWait(); //等待DS18B20應(yīng)答
delayMs(1); //延時(shí)1ms, 因?yàn)镈S18B20會(huì)拉低DQ 60~240us作為應(yīng)答信號(hào)
writeByte(0x44); //寫入溫度轉(zhuǎn)換命令字 Convert T
}
//向DS18B20發(fā)送讀取數(shù)據(jù)命令
void sendReadCmd()
{
dsInit();
dsWait();
delayMs(1);
writeByte(0xcc); //寫入跳過序列號(hào)命令字 Skip Rom
writeByte(0xbe); //寫入讀取數(shù)據(jù)令字 Read Scratchpad
}
//獲取當(dāng)前溫度值
void getTmpValue()
{
sendReadCmd();
//連續(xù)讀取兩個(gè)字節(jié)數(shù)據(jù)
SampleLVal[0] = readByte();
SampleHVal[0] = readByte();
//if(SampleHVal[0]==0xFF)LedTest();
}
/**//*****************************DS18B20*******************************/
void InitCPU()
{
EX0 =1;
PX0 =1;
}
void CheckCan()
{
if(rcv_flag) //if there is receive charerrupt
{
}
if(err_flag)
{
EA=0;
err_flag=0; //錯(cuò)誤標(biāo)志位清零
Config_SJA(); //初始化SJA
EA=1;
}
}
void SendByCan()
{
SendBuf[0]=TERMINAL; //主機(jī)標(biāo)識(shí)
SendBuf[1]=0x00|DLC; //標(biāo)識(shí)低3位和RTR以及請求數(shù)據(jù)位數(shù)
SendBuf[2]=CanID; //本地CAN標(biāo)識(shí)
SendBuf[3]=0; //第i路遙測值
SendBuf[4]=SampleLVal[0]; //遙測低字節(jié)值
SendBuf[5]=SampleHVal[0]; //遙測高字節(jié)值
BCAN_DATA_WRITE(SendBuf);
BCAN_CMD_PRG(TR_CMD);
}
void InitCanID()
{
//讀入P2口狀態(tài),其中0~3為跳線設(shè)置
CanID=~P2;
CanID&=0x0f;
CanID|=0x80;
}
void main()
{
InitCanID(); //計(jì)算當(dāng)前節(jié)點(diǎn)的CAN標(biāo)識(shí)
Config_SJA(); //CAN初始化,SJA1000配置
InitCPU(); //CPU初始化
P3_4=0;
P1=0;
InitWtd(); //看門狗電路初始化
sendChangeCmd();
while(1)
{
CheckCan();
delayMs(255); //溫度轉(zhuǎn)換時(shí)間需要750ms以上
FeedDog();
delayMs(255);
delayMs(255);
FeedDog();
delayMs(255);
delayMs(255);
FeedDog();
delayMs(255);
delayMs(255);
getTmpValue();
SendByCan();
//LedTest();
sendChangeCmd();
FeedDog();
}
}
void SJA_INTR() interrupt 0 using 1
{
SJA_BCANAdr=REG_INTERRUPT; //指針指向中斷寄存器
flag_init=*SJA_BCANAdr; //保持中斷寄存器值
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -