基于CAN總線的溫濕度與光感度測量單片機(jī)課程設(shè)計(jì)報(bào)告書_第1頁
基于CAN總線的溫濕度與光感度測量單片機(jī)課程設(shè)計(jì)報(bào)告書_第2頁
基于CAN總線的溫濕度與光感度測量單片機(jī)課程設(shè)計(jì)報(bào)告書_第3頁
基于CAN總線的溫濕度與光感度測量單片機(jī)課程設(shè)計(jì)報(bào)告書_第4頁
基于CAN總線的溫濕度與光感度測量單片機(jī)課程設(shè)計(jì)報(bào)告書_第5頁
已閱讀5頁,還剩45頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、單片機(jī)系統(tǒng)課程設(shè)計(jì)報(bào)告專 業(yè):組 員:指 導(dǎo) 教 師:完成日期:2013 年 7 月 11 日基于CAN總線的溫濕度與光感度測量摘要:隨著我國工業(yè)生產(chǎn)的發(fā)展和自動(dòng)化程度的不斷提高,迫切需要對(duì)各種生產(chǎn)過程中的物理量進(jìn)行精確檢測。溫度、濕度作為大多數(shù)生產(chǎn)過程中的重要物理量,對(duì)它們的精確檢測和遠(yuǎn)傳越來越受到人們重視。因此,研制一種高精度、高穩(wěn)定性、低成本的溫濕度儀表將具有重要意義,必將擁有廣闊的市場前景。同時(shí),由于工業(yè)現(xiàn)場對(duì)抗電磁干擾和傳輸距離有比較高的要求,所以本文設(shè)計(jì)了一種基于CAN(ControlArea Network局域網(wǎng)控制)總線的遠(yuǎn)程實(shí)時(shí)溫濕度數(shù)據(jù)采集系統(tǒng)。該系統(tǒng)主要由兩大模塊構(gòu)成,分

2、別是數(shù)據(jù)現(xiàn)場采集模塊、和顯示處理模塊。本設(shè)計(jì)使用C語言進(jìn)行了各個(gè)模塊軟件的設(shè)計(jì),完成對(duì)傳感器信號(hào)的處理和CAN模塊報(bào)文的發(fā)送和接收。關(guān)鍵詞:430 CAN DHT11 溫濕度 光感度1設(shè)計(jì)方案論證1.1主控芯片選擇(1) 用可編程邏輯器件設(shè)計(jì)。可采用ALTERA公司的FLEX10K系列PLD器件。設(shè)計(jì)起來結(jié)構(gòu)清晰,各個(gè)模塊,從硬件上設(shè)計(jì)起來相對(duì)簡單,控制與顯示的模塊間的連接也會(huì)比較方便。但是考慮到本設(shè)計(jì)的特點(diǎn),EDA在功能擴(kuò)展上比較受局限,而且EDA占用的資源也相對(duì)多一些。從成本上來講,用可編程邏輯器件來設(shè)計(jì)也沒有什么優(yōu)勢(shì)。 (2) 用MSP430F149作主控芯片,編程簡單,功能豐

3、富,速度很快,功耗很低。因此選擇430作為數(shù)據(jù)采集和顯示處理的主控芯片。2顯示部分的方案選擇(1) 數(shù)碼管顯示方式采用八段數(shù)碼管經(jīng)濟(jì)實(shí)惠,亮度高,對(duì)比度高,顯示清晰;但操作很復(fù)雜,占用很多CPU時(shí)間。(2) 液晶顯示方式 液晶顯示效果出眾,操作簡單,輸入完顯示信息后不占用CPU時(shí)間,顯示容量也大,因此采用1602液晶顯示器。3傳感器選擇(1) 采用DS18B20數(shù)字溫度傳感器,精度高,靈敏度高;但不能采集濕度信息;(2) 采用DHT11數(shù)字溫度傳感器,可同時(shí)測量溫度和濕度,精度和靈敏度,轉(zhuǎn)換速度也都能滿足本次系統(tǒng)要求,而且DHT11采用單總線通信模式,占用IO口少。因此選用DHT11數(shù)字溫濕度

4、傳感器。2系統(tǒng)設(shè)計(jì)采用MSP430F149作為數(shù)據(jù)采集和接收處理顯示模塊的主控芯片,430和各種傳感器通信讀出各種測量參數(shù),通過CAN控制器將信息發(fā)送到CAN 總線上;數(shù)據(jù)接收模塊從CAN總線上讀取各種信息并通過顯示模塊顯示出來。傳感器數(shù)據(jù)采集數(shù)據(jù)接收顯示模塊CAN總線圖1 遠(yuǎn)程溫濕度數(shù)據(jù)采集3單元電路設(shè)計(jì)3.1溫濕度采集系統(tǒng)DHT11數(shù)字溫濕度傳感器BH1750FVI環(huán)境光強(qiáng)度傳感器MSP430F149SJA1000CAN控制器TJAl050收發(fā)器CAN BUS圖2 遠(yuǎn)程溫濕度數(shù)據(jù)采集模塊由圖2所示,溫濕度數(shù)據(jù)采集模塊的硬件由以下四部分構(gòu)成:傳感器DHT11,微控制器MSP430F149,C

5、AN控制器和CAN收發(fā)器。微控制器MSP430F149主要負(fù)責(zé)對(duì)傳感器輸出的兩路模擬信號(hào)進(jìn)行循環(huán)采集并AD轉(zhuǎn)換,SJAl000的初始化,通過控制JAl000實(shí)現(xiàn)數(shù)據(jù)的發(fā)送和接收。SJAl000負(fù)責(zé)數(shù)據(jù)鏈路層的工作,把發(fā)送緩沖器的數(shù)據(jù)經(jīng)過處理后送到TJAl050,信息經(jīng)過處理后放到接收緩沖器等待微處理器的讀取。TJA1050提供SJA1000與物理總線之間的接口。3.2數(shù)據(jù)處理顯示模塊SJA1000CAN控制器TJAl050收發(fā)器CAN BUS圖3數(shù)據(jù)接收處理顯示模塊MSP430F149EnC/SR/W1602液晶顯示器如圖3所示TJA1050收發(fā)器將信號(hào)差分放大去除噪聲后送給SJA1000控制

6、器,控制器將接到的報(bào)文處理后提取數(shù)據(jù)給430,430將數(shù)據(jù)顯示到1602顯示器上。4系統(tǒng)功能本文設(shè)計(jì)的系統(tǒng)能實(shí)時(shí)測量遠(yuǎn)程溫濕度與光強(qiáng)度。測量圍:溫度050,濕度2090%RH,光強(qiáng)1lx-65535lx;分辨率:溫度1,濕度+/-2,光強(qiáng)1lx;測量距離:1km5程序模塊流程圖開始初始化系統(tǒng)初始化SJA1000是否中斷接收一個(gè)字節(jié)數(shù)據(jù)轉(zhuǎn)存開始初始化系統(tǒng)初始化SJA1000是否發(fā)完發(fā)送一個(gè)字節(jié)圖4 數(shù)據(jù)接收模塊程序流程圖圖5 數(shù)據(jù)發(fā)送模塊程序流程圖參考文獻(xiàn)1 正軍編著現(xiàn)場總線與其應(yīng)用技術(shù)M機(jī)械工業(yè)200512 任廣永等基于AT89C55和CAN總線的遠(yuǎn)程數(shù)據(jù)采集系統(tǒng)的設(shè)計(jì)J電腦學(xué)習(xí)200723

7、琢金,施國君C8051FXXX高速SOC單片機(jī)原理與應(yīng)用M:航空航天大學(xué)20024吳文珍,玉祥,司光宇等基于CAN總線智能檢測儀的設(shè)計(jì)D石油學(xué)院學(xué)報(bào)2005,29(5)5SJAl000獨(dú)立CAN控制器數(shù)據(jù)手冊(cè)周立功單片機(jī)發(fā)展心得體會(huì)廣昊:通過此次課程設(shè)計(jì),使我更加扎實(shí)的掌握了有關(guān)CAN總線方面的知識(shí),在設(shè)計(jì)過程中雖然遇到了一些問題,但經(jīng)過一次又一次的思考,一遍又一遍的檢查終于找出了原因所在,也暴露出了前期我在這方面的知識(shí)欠缺和經(jīng)驗(yàn)不足。實(shí)踐出真知,通過親自動(dòng)手制作,使我們掌握的知識(shí)不再是紙上談兵。 過而能改,善莫大焉。在課程設(shè)計(jì)過程中,我們不斷發(fā)現(xiàn)錯(cuò)誤,不斷改正,不斷領(lǐng)悟,不斷獲取。

8、最終的檢測調(diào)試環(huán)節(jié),本身就是在踐行“過而能改,善莫大焉”的知行觀。這次課程設(shè)計(jì)終于順利完成了,在設(shè)計(jì)中遇到了很多問題,最后在老師的指導(dǎo)下,終于游逆而解。在今后社會(huì)的發(fā)展和學(xué)習(xí)實(shí)踐過程中,一定要不懈努力,不能遇到問題就想到要退縮,一定要不厭其煩的發(fā)現(xiàn)問題所在,然后一一進(jìn)行解決,只有這樣,才能成功的做成想做的事,才能在今后的道路上劈荊斬棘,而不是知難而退,那樣永遠(yuǎn)不可能收獲成功,收獲喜悅,也永遠(yuǎn)不可能得到社會(huì)與他人對(duì)你的認(rèn)可!馬少波:我認(rèn)為,在這學(xué)期的實(shí)驗(yàn)中,不僅培養(yǎng)了獨(dú)立思考、動(dòng)手操作的能力,在各種其它能力上也都有了提高。更重要的是,在實(shí)驗(yàn)課上,我們學(xué)會(huì)了很多學(xué)習(xí)的方法。而這是日后最實(shí)用的,真的

9、是受益匪淺。要面對(duì)社會(huì)的挑戰(zhàn),只有不斷的學(xué)習(xí)、實(shí)踐,再學(xué)習(xí)、再實(shí)踐。這對(duì)于我們的將來也有很大的幫助。以后,不管有多苦,我想我們都能變苦為樂,找尋有趣的事情,發(fā)現(xiàn)其中珍貴的事情。就像中國提倡的艱苦奮斗一樣,我們都可以在實(shí)驗(yàn)結(jié)束之后變的更加成熟,會(huì)面對(duì)需要面對(duì)的事情。 回顧起此課程設(shè)計(jì),至今我仍感慨頗多,從理論到實(shí)踐,在這段日子里,可以說得是苦多于甜,但是可以學(xué)到很多很多的東西,同時(shí)不僅可以鞏固了以前所學(xué)過的知識(shí),而且學(xué)到了很多在書本上所沒有學(xué)到過的知識(shí)。通過這次課程設(shè)計(jì)使我懂得了理論與實(shí)際相結(jié)合是很重要的,只有理論知識(shí)是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識(shí)與實(shí)踐相結(jié)合起來,從理論中得出結(jié)論

10、,才能真正為社會(huì)服務(wù),從而提高自己的實(shí)際動(dòng)手能力和獨(dú)立思考的能力。在設(shè)計(jì)的過程中遇到問題,可以說得是困難重重,但可喜的是最終都得到了解決。 巨龍:回顧起此次單片機(jī)課程設(shè)計(jì),至今我仍感慨頗多,的確,從選題到定稿,從理論到實(shí)踐,在整整兩星期的日子里,可以說得是苦多于甜,但是可以學(xué)到很多很多的的東西,同時(shí)不僅可以鞏固了以前所學(xué)過的知識(shí),而且學(xué)到了很多在書本上所沒有學(xué)到過的知識(shí)。通過這次課程設(shè)計(jì)使我懂得了理論與實(shí)際相結(jié)合是很重要的,只有理論知識(shí)是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識(shí)與實(shí)踐相結(jié)合起來,從理論中得出結(jié)論,才能真正為社會(huì)服務(wù),從而提高自己的實(shí)際動(dòng)手能力和獨(dú)立思考的能力。在設(shè)計(jì)的過程中遇

11、到問題,可以說得是困難重重,這畢竟第一次做的,難免會(huì)遇到過各種各樣的問題。最后在老師的辛勤指導(dǎo)下,終于游逆而解。同時(shí),在老師的身上我學(xué)得到很多實(shí)用的知識(shí),在次我表示感!同時(shí),對(duì)給過我?guī)椭乃型瑢W(xué)和各位指導(dǎo)老師再次表示忠心的感!附錄一元件清單器件數(shù)量MSP430F149 芯片2SAJ1000CAN控制器2BH1750光強(qiáng)度傳感器1DHT11溫濕度傳感器11602液晶顯示器1排線5*8=40排針5*8=40電阻2K4紅色發(fā)光二級(jí)管4BUTTON(復(fù)位開關(guān))2附錄二系統(tǒng)程序清單Main.c#include<msp430x14x.h>#include "SJA1000.h&qu

12、ot;#include "DHT11.h"#include "BH1750.h"#include "IIC.h"/*精確延時(shí)*#define CPU_F (double)8000000)#define delay_us(x) _delay_cycles(long)(CPU_F*(double)x/1000000.0)#define delay_ms(x) _delay_cycles(long)(CPU_F*(double)x/1000.0)/*#define uint unsigned int#define uchar unsigne

13、d char#define rcv_flag 0x01 /接收中斷標(biāo)志#define err_flag 0x02 /錯(cuò)誤中斷標(biāo)志#define Over_flag 0x04 /CAN總線超載標(biāo)志void Init_BH1750(); /BH1750初始化void SJA_Process(void);void init_CPU (void); /初始化MSP430uchar send_flag = 0; /CAN總線發(fā)送標(biāo)志unsigned char Can_INT_DATA=0; /用于存儲(chǔ)SJA1000的中斷寄存器數(shù)據(jù),430中不能位尋址 /-uchar rcv_data10; /接收數(shù)據(jù)數(shù)

14、組 /-void main( void ) WDTCTL = WDTPW + WDTHOLD; / Stop watchdog timer to prevent time out reset uchar SJA_status; init_CPU (); /初始化MSP430 Init_BH1750(); /初始化BH1750 do delay_ms(10); /小延時(shí) SJA_status = init_SJA1000 (); while(SJA_status); /初始化SJA1000 Can_INT_DATA=0; /CAN中斷變量清零 delay_ms(1000); _EINT(); /

15、開總中斷 while(1) uchar Read_BUF2 = 0,0; /讀回BH1750數(shù)據(jù)變量 read_TRH(); /讀取溫濕度傳感器 delay_ms(120); Read_1Byte_currentaddress(Read_BUF); /讀回BH1750數(shù)據(jù) send_data6 = Read_BUF0; send_data7 = Read_BUF1; send_flag = 1; SJA_Process();/SJA最終處理 /*函數(shù)原型:void Init_BH1750();函數(shù)功能:BH1750初始化*/void Init_BH1750() Write_1Byte(0x01

16、); /通電,等待測量指令 Write_1Byte(0x07); /通電后,重置數(shù)字寄存器 Write_1Byte(0x10); /連續(xù)H分辨率模式/*函數(shù)功能:SJA_1000最終處理函數(shù)*/void SJA_Process(void) if(Can_INT_DATA & rcv_flag)=rcv_flag )/接收中斷 Can_INT_DATA &= rcv_flag; /清除接收標(biāo)志位 SJA_rcv_data(rcv_data); /接收CAN總線數(shù)據(jù)到rcv_data數(shù)組 if(send_flag)/發(fā)送中斷 send_flag=0; /清除發(fā)送標(biāo)志位 SJA_se

17、nd_data(send_data); /把send_data數(shù)組中數(shù)據(jù)寫入到發(fā)送緩沖區(qū) if(Can_INT_DATA & Over_flag)=Over_flag)/溢出中斷 Can_INT_DATA &= Over_flag; /清除溢出標(biāo)志位 Can_DATA_OVER(); if(Can_INT_DATA & err_flag)=err_flag )/錯(cuò)誤中斷 Can_INT_DATA &= err_flag; /清除錯(cuò)誤標(biāo)志位 Can_error(); /*函數(shù)功能:初始化MSP430*/void init_CPU (void) /*下面六行程序關(guān)閉

18、所有的IO口*/ P1DIR = 0XFF;P1OUT = 0XFF; P2DIR = 0XFF;P2OUT = 0XFF; P3DIR = 0XFF;P3OUT = 0XFF; P4DIR = 0XFF;P4OUT = 0XFF; P5DIR = 0XFF;P5OUT = 0XFF; P6DIR = 0XFF;P6OUT = 0XFF; /P6DIR |= BIT2;P6OUT &= BIT2; /打開電平轉(zhuǎn)換 / P2DIR |= BIT3;P2OUT &= BIT3; /電平轉(zhuǎn)換方向3.3V->5V /-P1.7外部中斷-/ P1DIR &= BIT7; /

19、設(shè)置P1.7為輸入 P1IES |= BIT7; /設(shè)置為下降沿中斷 P1IE |= BIT7; /允許P1.7中斷 /-/ /-切換時(shí)鐘-/ unsigned int j; BCSCTL1 &= XT2OFF; / XT2on, max RSEL do IFG1 &=OFIFG; for(j=0xff;j>0;j-); while(IFG1&OFIFG); BCSCTL2 |= SELS+DIVS_0; /SMCLK = XT2;SMCLK=8MHZ BCSCTL2 |= SELM_2+DIVM_0; /MCLK = XT2;MCLK=8MHZ /-*/ /-定

20、時(shí)器設(shè)置-/ /* TACCTL0 = CCIE; /使能CCR0中斷 CCR0 = 2048; /設(shè)定周期1S TACTL = TASSEL_1 + ID_3 + MC_1;/定時(shí)器A的時(shí)鐘源選擇ACLK,增計(jì)數(shù)模式 _EINT(); /開總中斷*/ /-/#pragma vector=PORT1_VECTOR /P1口中斷源_interrupt void P1_ISR(void) /中斷名P1_ISR(void) if(P1IFG & BIT7) Can_INT_DATA = Read_Reg(INTERRUPT); P1IFG = 0;SJA1000.c#include<m

21、sp430x14x.h>#include "SJA1000.h"/*精確延時(shí)*#define CPU_F (double)8000000)#define delay_us(x) _delay_cycles(long)(CPU_F*(double)x/1000000.0)#define delay_ms(x) _delay_cycles(long)(CPU_F*(double)x/1000.0)/* uchar send_data10; /發(fā)送數(shù)據(jù)數(shù)組/*函數(shù)原型:unsigned char Read_Reg(unsigned char reg)函數(shù)功能:讀取SJA10

22、00寄存器中的值參數(shù)說明:reg:寄存器地址 */unsigned char Read_Reg(unsigned char reg) unsigned char Reg_Data; C_ALE; S_RD; S_WR; S_CS; S_ALE; _NOP(); PortDIR=0xff; /P2OUT &= BIT3; /電平轉(zhuǎn)換方向3.3V->5V PortOUT = reg; _NOP(); C_ALE; _NOP(); C_CS; _NOP(); C_RD; _NOP();_NOP(); / P2OUT |= BIT3; /電平轉(zhuǎn)換方向5V->3.3V PortDIR

23、=0x00; Reg_Data=PortIN; S_RD; _NOP(); S_CS; return Reg_Data;/*函數(shù)原型:void Write_Reg(unsigned char reg,unsigned char reg_data)函數(shù)功能:向SJA1000寄存器中寫值參數(shù)說明: reg:寄存器地址 reg_data:要寫入的值*/void Write_Reg(unsigned char reg,unsigned char reg_data) C_ALE; S_CS; S_RD; S_WR; S_ALE; _NOP(); /P2OUT &= BIT3; /電平轉(zhuǎn)換方向3.

24、3V->5V PortDIR =0xff; PortOUT = reg; _NOP(); C_ALE; _NOP(); C_CS; _NOP(); C_WR; _NOP(); PortOUT= reg_data; _NOP(); _NOP(); S_WR; _NOP(); S_CS; _NOP(); _NOP(); S_ALE;/*函數(shù)原型:char create_communication(void)函數(shù)功能:用于SJA1000在復(fù)位模式下,檢測CAN控制器SJA1000的通信是否正常,只用于產(chǎn)品 的測試,如果在正常模式下使用這個(gè)寄存器進(jìn)行測試,將導(dǎo)致設(shè)備不可預(yù)測的結(jié)果。返回值說明:

25、0:表示SJA1000建立通信正常 1:表示SJA1000與處理器通信異常*/char create_communication(void) Write_Reg(TEST,0xaa); /向TEST寄存器中寫入0xaa if(Read_Reg(TEST) = 0xaa) return 0; /讀測試正確 else return 1;/*函數(shù)原型:char enter_RST(void)函數(shù)功能:用于SJA1000進(jìn)入復(fù)位工作模式返回值說明: 0:表示SJA1000成功進(jìn)入復(fù)位工作模式 1:表示SJA1000進(jìn)入復(fù)位模式失敗*/char enter_RST(void) unsigned char

26、 MID_DATA; /定義一個(gè)字節(jié)變量,用于存儲(chǔ)從SJA1000控制寄存器讀出的數(shù)據(jù) MID_DATA = Read_Reg(CONTROL);/訪問SJA1000控制寄存器,保存原始值 Write_Reg(CONTROL,MID_DATA|0x01); /置位復(fù)位請(qǐng)求 if(Read_Reg(CONTROL)&0x01)=1) /讀SJA1000的控制寄存器數(shù)值,判斷復(fù)位請(qǐng)否有效 return 0; /表示SJA1000成功進(jìn)入復(fù)位工作模式 else return 1; /*函數(shù)原型:char quit_RST(void)函數(shù)功能:用于SJA1000退出復(fù)位工作模式返回值說明: 0

27、:表示SJA1000成功退出復(fù)位工作模式 1:表示SJA1000退出復(fù)位模式失敗*/char quit_RST(void) unsigned char MID_DATA; /定義一個(gè)字節(jié)變量,用于存儲(chǔ)從SJA1000控制寄存器讀出的數(shù)據(jù) MID_DATA = Read_Reg(CONTROL);/訪問SJA1000控制寄存器,保存原始值 Write_Reg(CONTROL,MID_DATA&0xfe); /置位復(fù)位請(qǐng)求 if(Read_Reg(CONTROL)&0x01)=0) /讀SJA1000的控制寄存器數(shù)值,判斷清除復(fù)位請(qǐng)否有效 return 0; /0:表示SJA100

28、0成功退出復(fù)位工作模式 else return 1; /*函數(shù)原型:char set_rate(unsignen char CAN_rate_num)函數(shù)功能:用于設(shè)置CAN總線的通信波特率,只能在SJA1000進(jìn)入復(fù)位模式下使用參數(shù)說明:參數(shù)CAN_rate_num用于存放CAN通信波特率的數(shù)組列表中的系列號(hào),圍為012.返回值說明: 0:波特率設(shè)置成功 1:波特率設(shè)置失敗*/unsigned char rate_tab= 0x53,0x2f, /20kbit/s的波特率預(yù)設(shè)值 0x87,0xff, /40kbit/s 0x47,0x2f, /50kbit/s 0x83,0xff, /80k

29、bit/s 0x43,0x2f, /100kbit/s 0x03,0x1c, /125kbit/s 0x81,0xfa, /200kbit/s 0x01,0x1c, /250kbit/s 0x80,0xfa, /400kbit/s 0x00,0x1c, /500kbit/s 0x80,0xb6, /666kbit/s 0x00,0x16, /800kbit/s 0x00,0x14 /1000kbit/s;/-char set_rate (unsigned char CAN_rate_num) char wrong_flag=1; unsigned char BIT0_data,BIT1_dat

30、a; /用于存放從波特率數(shù)組中讀出來的數(shù)值 unsigned char wrong_count=32; /32次報(bào)錯(cuò)次數(shù) if(CAN_rate_num>12) /設(shè)置數(shù)組列表中的序列號(hào)圍為012 wrong_flag=1; /如果超出圍,報(bào)警,波特率設(shè)置失敗 else while(-wrong_count) /最多32次設(shè)置SJA1000部寄存器BIT0和BIT1 BIT0_data=rate_tabCAN_rate_num*2; BIT1_data=rate_tabCAN_rate_num*2+1;/將波特率的設(shè)置值從數(shù)組中讀出 Write_Reg(BIT_0,BIT0_data);

31、/訪問CAN總線定時(shí)寄存器0,寫入?yún)?shù) if(Read_Reg(BIT_0) != BIT0_data )continue; /校驗(yàn)寫入值 Write_Reg(BIT_1,BIT1_data);/訪問CAN總線定時(shí)寄存器1,寫入?yún)?shù) if(Read_Reg(BIT_1) != BIT1_data )continue; /校驗(yàn)寫入值 wrong_flag = 0; break; /while 結(jié)束 return wrong_flag;/*函數(shù)原型:char set_ACR_AMR(unsignen char ACR_DATA,unsignen char AMR_DATA)函數(shù)功能:用于設(shè)置驗(yàn)收代

32、碼寄存器(ACR),屏蔽寄存器(AMR)只能在SJA1000進(jìn)入復(fù)位模式下使用參數(shù)說明:ACR_DATA :用于存放驗(yàn)收代碼寄存器(ACR)的參數(shù)值 AMR_DATA :用于存放驗(yàn)收代碼寄存器(AMR)的參數(shù)值返回值說明: 0:通信對(duì)象設(shè)置成功 1:通信對(duì)象置失敗*/char set_ACR_AMR(unsigned char ACR_DATA,unsigned char AMR_DATA) /濾波器設(shè)計(jì) Write_Reg(ACR,ACR_DATA);/訪問CAN總線驗(yàn)收代碼寄存器,寫入?yún)?shù) if(Read_Reg(ACR) != ACR_DATA)/校驗(yàn)寫入值 return 1; Writ

33、e_Reg(AMR,AMR_DATA);/訪問CAN總線驗(yàn)收代碼寄存器,寫入?yún)?shù) if(Read_Reg(AMR) != AMR_DATA)/校驗(yàn)寫入值 return 1; return 0;/*函數(shù)原型:char set_CLK (unsigned char SJA_OUT_MODE,unsigned char SJA_Clock_Out)函數(shù)功能:用于設(shè)置輸出寄存器(OCR)的參數(shù)、時(shí)鐘分頻寄存器(CDR)的參數(shù), 只能在SJA1000進(jìn)入復(fù)位模式下使用參數(shù)說明:SJA_OUT_MODE :用于存放輸出寄存器(OC)的參數(shù) SJA_Clock_Out :用于存放時(shí)鐘分頻寄存器(CDR)的參

34、數(shù)返回值說明: 0:設(shè)置(OCR)和(CDR)寄存器成功 1:設(shè)置(OCR)和(CDR)寄存器失敗*/char set_CLK (unsigned char SJA_OUT_MODE,unsigned char SJA_Clock_Out) Write_Reg(OCR,SJA_OUT_MODE);/訪問輸出控制寄存器,寫入設(shè)置的OCR參數(shù)值 if(Read_Reg(OCR) != SJA_OUT_MODE)/校驗(yàn)寫入值 return 1; Write_Reg(CDR,SJA_Clock_Out);/訪問輸出控制寄存器,寫入設(shè)置的CDR參數(shù)值 / if(Read_Reg(CDR) != SJA_

35、Clock_Out)/校驗(yàn)寫入值 / return 1; return 0;/*函數(shù)原型:char SJA_send_data(unsigned char *senddatabuf)函數(shù)功能:用于發(fā)送CAN總線一幀數(shù)據(jù)(數(shù)據(jù)幀或遠(yuǎn)程幀)到SJA1000的發(fā)送緩沖區(qū), 數(shù)據(jù)幀長度不大于8字節(jié)參數(shù)說明:senddatabuf :指向的用于存放發(fā)送數(shù)據(jù)的數(shù)組的首址返回值說明: 0:將發(fā)送數(shù)組的數(shù)據(jù)成功送至SJA1000的發(fā)送區(qū) 1:SJA1000正在接收信息,或SJA1000的發(fā)送緩沖區(qū)被鎖定, 或上一次發(fā)送的一幀數(shù)據(jù)還沒有完成發(fā)送*/char SJA_send_data(unsigned char

36、 *senddatabuf) /gai! unsigned char send_num,STATUS_data; unsigned char i; STATUS_data = Read_Reg(STATUS);/讀取狀態(tài)寄存器數(shù)值到STATUS_data if(STATUS_data & 0x10) return 1; /STATUS_data4,表示SJA1000在接收信息 if(STATUS_data & 0x04)=0)/判斷SJA1000發(fā)送緩沖區(qū)是否為鎖定狀態(tài),0鎖定 return 1; if(STATUS_data & 0x08)=0)/判斷上次發(fā)送是否完成

37、,0上次發(fā)送未完成 return 1; senddatabuf0 = 0xAC; senddatabuf1 = 0x06; Write_Reg(TxBuffer1,senddatabuf0); Write_Reg(TxBuffer2,senddatabuf1); if(senddatabuf1&0x10)=0) /判斷RTR位,是數(shù)據(jù)幀還是遠(yuǎn)程幀判定 send_num = (senddatabuf1&0x0f); /是數(shù)據(jù)幀,則取一幀CAN數(shù)據(jù)的第2字節(jié)的低4位, /計(jì)算得出發(fā)送數(shù)據(jù)的長度 if(send_num>8) /發(fā)送最大長度為8個(gè)字節(jié) send_num = 8;

38、 for(i=0; i< send_num; i+) Write_Reg(TxBuffer3+i,senddatabuf2+i); delay_us(2); else send_num=0; /是遠(yuǎn)程幀,則發(fā)送數(shù)據(jù)長度為0 for(i=0; i< send_num; i+) Write_Reg(TxBuffer3+i,senddatabuf2+i); delay_us(2); SJA_command_control(0x01); /調(diào)用發(fā)送請(qǐng)求 return 0;/*函數(shù)原型:char SJA_rcv_data(unsigned char *rcvdatabuf)函數(shù)功能:用于接收

39、CAN總線一幀數(shù)據(jù)參數(shù)說明:rcvdatabuf :指向的用于存放發(fā)送數(shù)據(jù)的數(shù)組的首址返回值說明: 0:成功接收CAN總線的一幀數(shù)據(jù) 1:接收CAN總線的一幀數(shù)據(jù)失敗*/char SJA_rcv_data(unsigned char *rcvdatabuf) unsigned char rcv_num,STATUS_data; STATUS_data = Read_Reg(STATUS);/讀取狀態(tài)寄存器數(shù)值到STATUS_data if(STATUS_data & 0x01)=0) /判斷接收緩沖區(qū)中是否有信息,為0表示沒有信息 return 1; rcvdatabuf0 = Rea

40、d_Reg(RxBuffer1); rcvdatabuf1 = Read_Reg(RxBuffer2); unsigned char i; if(0 = (rcvdatabuf1 & 0x10) rcv_num = (rcvdatabuf1 & 0x0f); if( rcv_num > 8 ) rcv_num = 8; for(i=0; i<rcv_num; i+) rcvdatabuf2+i = Read_Reg(RxBuffer3 + i); SJA_command_control(0x04); /釋放接收緩沖區(qū) return 0;/*函數(shù)原型:char SJA

41、_command_control(unsigned char order)函數(shù)功能:設(shè)置命令寄存器(CMR)中的特定位,執(zhí)行相應(yīng)命令參數(shù)說明:order是SJA1000命令寄存器(CMR)中的特定位 TR_order (0x01):發(fā)送請(qǐng)求命令 AT_order (0x02):中止發(fā)送命令 RRB_order(0x04):釋放接收緩沖區(qū) CDO_order(0x08):清除數(shù)據(jù)溢出命令 GTS_order (0x10) : SJA1000進(jìn)入睡眠狀態(tài)返回值說明: 0:執(zhí)行命令成功 1:執(zhí)行命令失敗*/char SJA_command_control(unsigned char order) W

42、rite_Reg(COMMAND,order); /寫入命令到SJA1000命令寄存器 switch(order) case TR_order: /發(fā)送請(qǐng)求命令 return 0; break; case AT_order: /中止發(fā)送命令 if(Read_Reg(STATUS) & 0x20)=0) /判斷SJA1000是否正在發(fā)送信息 return 0; else return 1; break; case RRB_order: if(Read_Reg(STATUS) & 0x01)=1) /判斷SJA1000是否釋放接收緩沖區(qū) return 1; else return 0; break; case CDO_order: if(Read_

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論