版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 單片機(jī)系統(tǒng)課程設(shè)計(jì)報(bào)告</p><p> 完成日期:2013 年 7 月 11 日</p><p> 基于CAN總線的溫濕度及光感度測(cè)量</p><p><b> 摘要:</b></p><p> 隨著我國(guó)工業(yè)生產(chǎn)的發(fā)展和自動(dòng)化程度的不斷提高,迫切需要對(duì)各種生產(chǎn)過程中的物理量進(jìn)行精確檢測(cè)。
2、溫度、濕度作為大多數(shù)生產(chǎn)過程中的重要物理量,對(duì)它們的精確檢測(cè)和遠(yuǎn)傳越來(lái)越受到人們重視。因此,研制一種高精度、高穩(wěn)定性、低成本的溫濕度儀表將具有重要意義,必將擁有廣闊的市場(chǎng)前景。同時(shí),由于工業(yè)現(xiàn)場(chǎng)對(duì)抗電磁干擾和傳輸距離有比較高的要求,所以本文設(shè)計(jì)了一種基于CAN(ControlArea Network局域網(wǎng)控制)總線的遠(yuǎn)程實(shí)時(shí)溫濕度數(shù)據(jù)采集系統(tǒng)。該系統(tǒng)主要由兩大模塊構(gòu)成,分別是數(shù)據(jù)現(xiàn)場(chǎng)采集模塊、和顯示處理模塊。本設(shè)計(jì)使用C語(yǔ)言進(jìn)行了各個(gè)模
3、塊軟件的設(shè)計(jì),完成對(duì)傳感器信號(hào)的處理和CAN模塊報(bào)文的發(fā)送和接收。</p><p> 關(guān)鍵詞:430 CAN DHT11 溫濕度 光感度</p><p><b> 1設(shè)計(jì)方案論證</b></p><p><b> 1.1主控芯片選擇</b></p><p> 用可編程邏輯器件設(shè)計(jì)??刹捎肁L
4、TERA公司的FLEX10K系列PLD器件。設(shè)計(jì)起來(lái)結(jié)構(gòu)清晰,各個(gè)模塊,從硬件上設(shè)計(jì)起來(lái)相對(duì)簡(jiǎn)單,控制與顯示的模塊間的連接也會(huì)比較方便。但是考慮到本設(shè)計(jì)的特點(diǎn),EDA在功能擴(kuò)展上比較受局限,而且EDA占用的資源也相對(duì)多一些。從成本上來(lái)講,用可編程邏輯器件來(lái)設(shè)計(jì)也沒有什么優(yōu)勢(shì)。 </p><p> 用MSP430F149作主控芯片,編程簡(jiǎn)單,功能豐富,速度很快,功耗很低。因此選擇430作為數(shù)據(jù)采集和顯示
5、處理的主控芯片。</p><p> 2顯示部分的方案選擇</p><p><b> 數(shù)碼管顯示方式</b></p><p> 采用八段數(shù)碼管經(jīng)濟(jì)實(shí)惠,亮度高,對(duì)比度高,顯示清晰;但操作很復(fù)雜,占用很多CPU時(shí)間。</p><p><b> 液晶顯示方式 </b></p><
6、;p> 液晶顯示效果出眾,操作簡(jiǎn)單,輸入完顯示信息后不占用CPU時(shí)間,顯示容量也大,因此采用1602液晶顯示器。</p><p><b> 3傳感器選擇</b></p><p> 采用DS18B20數(shù)字溫度傳感器,精度高,靈敏度高;但不能采集濕度信息;</p><p> 采用DHT11數(shù)字溫度傳感器,可同時(shí)測(cè)量溫度和濕度,精度和靈
7、敏度,轉(zhuǎn)換速度也都能滿足本次系統(tǒng)要求,而且DHT11采用單總線通信模式,占用IO口少。因此選用DHT11數(shù)字溫濕度傳感器。</p><p><b> 2系統(tǒng)設(shè)計(jì)</b></p><p> 采用MSP430F149作為數(shù)據(jù)采集和接收處理顯示模塊的主控芯片,430和各種傳感器通信讀出各種測(cè)量參數(shù),通過CAN控制器將信息發(fā)送到CAN 總線上;數(shù)據(jù)接收模塊從CAN總線上讀
8、取各種信息并通過顯示模塊顯示出來(lái)。</p><p><b> 3單元電路設(shè)計(jì)</b></p><p> 3.1溫濕度采集系統(tǒng)</p><p> 由圖2所示,溫濕度數(shù)據(jù)采集模塊的硬件由以下四部分構(gòu)成:傳感器DHT11,微控制器MSP430F149,CAN控制器和CAN收發(fā)器。微控制器MSP430F149主要負(fù)責(zé)對(duì)傳感器輸出的兩路模擬信號(hào)進(jìn)行
9、循環(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與物理總線之間的接口。</p><p> 3.2數(shù)據(jù)處理顯示模塊</p><p> 如圖3所示TJA1050收發(fā)器將信號(hào)差分放大去除噪聲后
10、送給SJA1000控制器,控制器將接到的報(bào)文處理后提取數(shù)據(jù)給430,430將數(shù)據(jù)顯示到1602顯示器上。</p><p><b> 4系統(tǒng)功能</b></p><p> 本文設(shè)計(jì)的系統(tǒng)能實(shí)時(shí)測(cè)量遠(yuǎn)程溫濕度及光強(qiáng)度。</p><p> 測(cè)量范圍:溫度0~50℃,濕度20~90%RH,光強(qiáng)1lx-65535lx;</p><
11、;p> 分辨率:溫度1℃,濕度+/-2℃,光強(qiáng)1lx;</p><p><b> 測(cè)量距離:1km</b></p><p><b> 5程序模塊流程圖</b></p><p><b> 參考文獻(xiàn)</b></p><p> [1] 李正軍編著.現(xiàn)場(chǎng)總線及其應(yīng)用技術(shù)
12、[M].北京機(jī)械工業(yè)出版社.2005.1</p><p> [2] 任廣永等.基于AT89C55和CAN總線的遠(yuǎn)程數(shù)據(jù)采集系統(tǒng)的設(shè)計(jì)[J].電腦學(xué)習(xí).2007.2</p><p> [3] 潘琢金,施國(guó)君.C8051FXXX高速SOC單片機(jī)原理及應(yīng)用[M].北京:北京航空航天大學(xué)出版社.2002</p><p> [4]吳文珍,韓玉祥,司光宇等.基于CAN總線
13、智能檢測(cè)儀的設(shè)計(jì)[D].大慶石油學(xué)院學(xué)報(bào).2005,29(5)</p><p> [5]SJAl000獨(dú)立CAN控制器數(shù)據(jù)手冊(cè).廣州周立功單片機(jī)發(fā)展有限公司.</p><p><b> 心得體會(huì)</b></p><p><b> 謝廣昊:</b></p><p> 通過此次課程設(shè)計(jì),使我更加
14、扎實(shí)的掌握了有關(guān)CAN總線方面的知識(shí),在設(shè)計(jì)過程中雖然遇到了一些問題,但經(jīng)過一次又一次的思考,一遍又一遍的檢查終于找出了原因所在,也暴露出了前期我在這方面的知識(shí)欠缺和經(jīng)驗(yàn)不足。實(shí)踐出真知,通過親自動(dòng)手制作,使我們掌握的知識(shí)不再是紙上談兵。 </p><p> 過而能改,善莫大焉。在課程設(shè)計(jì)過程中,我們不斷發(fā)現(xiàn)錯(cuò)誤,不斷改正,不斷領(lǐng)悟,不斷獲取。最終的檢測(cè)調(diào)試環(huán)節(jié),本身就是在踐行“過而能改,善莫大焉”的
15、知行觀。這次課程設(shè)計(jì)終于順利完成了,在設(shè)計(jì)中遇到了很多問題,最后在老師的指導(dǎo)下,終于游逆而解。在今后社會(huì)的發(fā)展和學(xué)習(xí)實(shí)踐過程中,一定要不懈努力,不能遇到問題就想到要退縮,一定要不厭其煩的發(fā)現(xiàn)問題所在,然后一一進(jìn)行解決,只有這樣,才能成功的做成想做的事,才能在今后的道路上劈荊斬棘,而不是知難而退,那樣永遠(yuǎn)不可能收獲成功,收獲喜悅,也永遠(yuǎn)不可能得到社會(huì)及他人對(duì)你的認(rèn)可!</p><p><b> 馬少波:
16、</b></p><p> 我認(rèn)為,在這學(xué)期的實(shí)驗(yàn)中,不僅培養(yǎng)了獨(dú)立思考、動(dòng)手操作的能力,在各種其它能力上也都有了提高。更重要的是,在實(shí)驗(yàn)課上,我們學(xué)會(huì)了很多學(xué)習(xí)的方法。而這是日后最實(shí)用的,真的是受益匪淺。要面對(duì)社會(huì)的挑戰(zhàn),只有不斷的學(xué)習(xí)、實(shí)踐,再學(xué)習(xí)、再實(shí)踐。這對(duì)于我們的將來(lái)也有很大的幫助。以后,不管有多苦,我想我們都能變苦為樂,找尋有趣的事情,發(fā)現(xiàn)其中珍貴的事情。就像中國(guó)提倡的艱苦奮斗一樣,我們
17、都可以在實(shí)驗(yàn)結(jié)束之后變的更加成熟,會(huì)面對(duì)需要面對(duì)的事情。 </p><p> 回顧起此課程設(shè)計(jì),至今我仍感慨頗多,從理論到實(shí)踐,在這段日子里,可以說得是苦多于甜,但是可以學(xué)到很多很多的東西,同時(shí)不僅可以鞏固了以前所學(xué)過的知識(shí),而且學(xué)到了很多在書本上所沒有學(xué)到過的知識(shí)。通過這次課程設(shè)計(jì)使我懂得了理論與實(shí)際相結(jié)合是很重要的,只有理論知識(shí)是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識(shí)與實(shí)踐相結(jié)合起來(lái),從理論中得出結(jié)論,
18、才能真正為社會(huì)服務(wù),從而提高自己的實(shí)際動(dòng)手能力和獨(dú)立思考的能力。在設(shè)計(jì)的過程中遇到問題,可以說得是困難重重,但可喜的是最終都得到了解決。 </p><p><b> 張巨龍:</b></p><p> 回顧起此次單片機(jī)課程設(shè)計(jì),至今我仍感慨頗多,的確,從選題到定稿,從理論到實(shí)踐,在整整兩星期的日子里,可以說得是苦多于甜,但是可以學(xué)到很多很多的的東西,同時(shí)
19、不僅可以鞏固了以前所學(xué)過的知識(shí),而且學(xué)到了很多在書本上所沒有學(xué)到過的知識(shí)。通過這次課程設(shè)計(jì)使我懂得了理論與實(shí)際相結(jié)合是很重要的,只有理論知識(shí)是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識(shí)與實(shí)踐相結(jié)合起來(lái),從理論中得出結(jié)論,才能真正為社會(huì)服務(wù),從而提高自己的實(shí)際動(dòng)手能力和獨(dú)立思考的能力。在設(shè)計(jì)的過程中遇到問題,可以說得是困難重重,這畢竟第一次做的,難免會(huì)遇到過各種各樣的問題。最后在老師的辛勤指導(dǎo)下,終于游逆而解。同時(shí),在老師的身上我學(xué)得到很多實(shí)用的知
20、識(shí),在次我表示感謝!同時(shí),對(duì)給過我?guī)椭乃型瑢W(xué)和各位指導(dǎo)老師再次表示忠心的感謝!</p><p><b> 附錄一</b></p><p><b> 元件清單</b></p><p><b> 附錄二</b></p><p><b> 系統(tǒng)程序清單</
21、b></p><p><b> Main.c</b></p><p> #include<msp430x14x.h></p><p> #include "SJA1000.h"</p><p> #include "DHT11.h"</p>
22、<p> #include "BH1750.h"</p><p> #include "IIC.h"</p><p> //**************************精確延時(shí)**********************************</p><p> #define CPU_F ((dou
23、ble)8000000)</p><p> #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))</p><p> #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))</p><p> //**
24、******************************************************************</p><p> #define uint unsigned int</p><p> #define uchar unsigned char</p><p> #define rcv_flag 0x01 //接收中斷標(biāo)志
25、</p><p> #define err_flag 0x02 //錯(cuò)誤中斷標(biāo)志</p><p> #define Over_flag 0x04 //CAN總線超載標(biāo)志</p><p> void Init_BH1750(); //BH1750初始化</p><p> void SJA_Process(void);<
26、;/p><p> void init_CPU (void); //初始化MSP430</p><p> uchar send_flag = 0; //CAN總線發(fā)送標(biāo)志</p><p> unsigned char Can_INT_DATA=0; //用于存儲(chǔ)SJA1000的中斷寄存器數(shù)據(jù),430中不能位尋址 </p><
27、p> //--------------------------------------</p><p> uchar rcv_data[10]; //接收數(shù)據(jù)數(shù)組 </p><p> //--------------------------------------</p><p> void main( void )</p>&l
28、t;p><b> {</b></p><p> WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer to prevent time out reset</p><p> uchar SJA_status;</p><p> init_CPU (); //初始化MSP430
29、</p><p> Init_BH1750(); //初始化BH1750</p><p><b> do</b></p><p><b> {</b></p><p> delay_ms(10); //小延時(shí)</p><p> SJA_status = i
30、nit_SJA1000 (); </p><p> }while(SJA_status); //初始化SJA1000</p><p> Can_INT_DATA=0; //CAN中斷變量清零</p><p> delay_ms(1000);</p><p> _EINT(); //開總中斷</p>
31、<p><b> while(1)</b></p><p><b> { </b></p><p> uchar Read_BUF[2] = {0,0}; //讀回BH1750數(shù)據(jù)變量</p><p> read_TRH(); //讀取溫濕度傳感器 </p><p>
32、delay_ms(120);</p><p> Read_1Byte_currentaddress(Read_BUF); //讀回BH1750數(shù)據(jù)</p><p> send_data[6] = Read_BUF[0];</p><p> send_data[7] = Read_BUF[1];</p><p> send_flag =
33、 1;</p><p> SJA_Process();//SJA最終處理</p><p><b> } </b></p><p><b> }</b></p><p> /********************************************</p><
34、p> 函數(shù)原型:void Init_BH1750();</p><p> 函數(shù)功能:BH1750初始化</p><p> *********************************************/</p><p> void Init_BH1750()</p><p><b> {</b>
35、;</p><p> Write_1Byte(0x01); //通電,等待測(cè)量指令</p><p> Write_1Byte(0x07); //通電后,重置數(shù)字寄存器</p><p> Write_1Byte(0x10); //連續(xù)H分辨率模式</p><p><b> }</b></p>&
36、lt;p> /*********************************************************</p><p> 函數(shù)功能:SJA_1000最終處理函數(shù)</p><p> **********************************************************/</p><p> void
37、SJA_Process(void)</p><p><b> {</b></p><p> if((Can_INT_DATA & rcv_flag)==rcv_flag )//接收中斷</p><p><b> {</b></p><p> Can_INT_DATA &= ~
38、rcv_flag; //清除接收標(biāo)志位</p><p> SJA_rcv_data(rcv_data); //接收CAN總線數(shù)據(jù)到rcv_data數(shù)組</p><p><b> }</b></p><p> if(send_flag)//發(fā)送中斷</p><p><b> {</b>&
39、lt;/p><p> send_flag=0; //清除發(fā)送標(biāo)志位</p><p> SJA_send_data(send_data); //把send_data數(shù)組中數(shù)據(jù)寫入到發(fā)送緩沖區(qū)</p><p><b> }</b></p><p> if((Can_INT_DATA & Over_flag
40、)==Over_flag)//溢出中斷</p><p><b> {</b></p><p> Can_INT_DATA &= ~Over_flag; //清除溢出標(biāo)志位</p><p> Can_DATA_OVER();</p><p><b> }</b></p>
41、<p> if((Can_INT_DATA & err_flag)==err_flag )//錯(cuò)誤中斷</p><p><b> {</b></p><p> Can_INT_DATA &= ~err_flag; //清除錯(cuò)誤標(biāo)志位</p><p> Can_error();</p><
42、p><b> }</b></p><p><b> }</b></p><p> /*********************************************************</p><p> 函數(shù)功能:初始化MSP430</p><p> *********
43、*************************************************/</p><p> void init_CPU (void)</p><p><b> {</b></p><p> /*下面六行程序關(guān)閉所有的IO口*/</p><p> P1DIR = 0XFF;P1OUT =
44、 0XFF;</p><p> P2DIR = 0XFF;P2OUT = 0XFF;</p><p> P3DIR = 0XFF;P3OUT = 0XFF;</p><p> P4DIR = 0XFF;P4OUT = 0XFF;</p><p> P5DIR = 0XFF;P5OUT = 0XFF;</p><p&
45、gt; P6DIR = 0XFF;P6OUT = 0XFF;</p><p> //P6DIR |= BIT2;P6OUT &= ~BIT2; //打開電平轉(zhuǎn)換</p><p> // P2DIR |= BIT3;P2OUT &= ~BIT3; //電平轉(zhuǎn)換方向3.3V--->5V</p><p> //----------P1
46、.7外部中斷------------------//</p><p> P1DIR &= ~BIT7; //設(shè)置P1.7為輸入</p><p> P1IES |= BIT7; //設(shè)置為下降沿中斷</p><p> P1IE |= BIT7; //允許P1.7中斷</p><p> //-----------
47、------------------------------//</p><p> //-----------切換時(shí)鐘---------------------//</p><p> unsigned int j;</p><p> BCSCTL1 &= ~XT2OFF; // XT2on, max RSEL</p>&
48、lt;p><b> do</b></p><p><b> {</b></p><p> IFG1 &=~OFIFG;</p><p> for(j=0xff;j>0;j--);</p><p><b> }</b></p><
49、p> while(IFG1&OFIFG);</p><p> BCSCTL2 |= SELS+DIVS_0; //SMCLK = XT2;SMCLK=8MHZ</p><p> BCSCTL2 |= SELM_2+DIVM_0; //MCLK = XT2;MCLK=8MHZ</p><p> //----------------------
50、----------------------*/</p><p> //----------------定時(shí)器設(shè)置-------------------//</p><p> /* TACCTL0 = CCIE; //使能CCR0中斷</p><p> CCR0 = 2048; //設(shè)定
51、周期1S </p><p> TACTL = TASSEL_1 + ID_3 + MC_1;//定時(shí)器A的時(shí)鐘源選擇ACLK,增計(jì)數(shù)模式</p><p> _EINT(); //開總中斷*/</p><p> //---------------------------------------------//</p&
52、gt;<p><b> }</b></p><p> #pragma vector=PORT1_VECTOR //P1口中斷源</p><p> __interrupt void P1_ISR(void) //中斷名P1_ISR(void)</p><p><b> {</b></p>
53、;<p> if(P1IFG & BIT7)</p><p><b> { </b></p><p> Can_INT_DATA = Read_Reg(INTERRUPT);</p><p><b> }</b></p><p> P1IFG = 0;</p&g
54、t;<p><b> }</b></p><p><b> SJA1000.c</b></p><p> #include<msp430x14x.h></p><p> #include "SJA1000.h"</p><p> //*****
55、*********************精確延時(shí)**********************************</p><p> #define CPU_F ((double)8000000)</p><p> #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))</p><
56、;p> #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))</p><p> //********************************************************************</p><p> uchar send_data[10]; //發(fā)送數(shù)據(jù)
57、數(shù)組</p><p> /*********************************************************</p><p> 函數(shù)原型:unsigned char Read_Reg(unsigned char reg)</p><p> 函數(shù)功能:讀取SJA1000寄存器中的值</p><p> 參數(shù)
58、說明:reg:寄存器地址 </p><p> **********************************************************/</p><p> unsigned char Read_Reg(unsigned char reg)</p><p><b> {</b></p><p&
59、gt; unsigned char Reg_Data;</p><p><b> C_ALE; </b></p><p><b> S_RD;</b></p><p><b> S_WR;</b></p><p><b> S_CS;</b>&l
60、t;/p><p><b> S_ALE;</b></p><p><b> _NOP();</b></p><p> PortDIR=0xff;</p><p> //P2OUT &= ~BIT3; //電平轉(zhuǎn)換方向3.3V--->5V </p><p>
61、; PortOUT = reg;</p><p><b> _NOP();</b></p><p><b> C_ALE;</b></p><p><b> _NOP();</b></p><p><b> C_CS;</b></p>
62、<p><b> _NOP();</b></p><p><b> C_RD;</b></p><p> _NOP();_NOP();</p><p> // P2OUT |= BIT3; //電平轉(zhuǎn)換方向5V--->3.3V</p><p> PortDIR=0x
63、00;</p><p> Reg_Data=PortIN;</p><p><b> S_RD;</b></p><p><b> _NOP();</b></p><p><b> S_CS;</b></p><p> return Reg_D
64、ata;</p><p><b> }</b></p><p> /*********************************************************</p><p> 函數(shù)原型:void Write_Reg(unsigned char reg,unsigned char reg_data)</p&g
65、t;<p> 函數(shù)功能:向SJA1000寄存器中寫值</p><p> 參數(shù)說明: reg:寄存器地址</p><p> reg_data:要寫入的值</p><p> **********************************************************/</p><p> void
66、 Write_Reg(unsigned char reg,unsigned char reg_data)</p><p><b> { </b></p><p><b> C_ALE;</b></p><p><b> S_CS;</b></p><p><b>
67、; S_RD;</b></p><p><b> S_WR;</b></p><p><b> S_ALE;</b></p><p><b> _NOP();</b></p><p> //P2OUT &= ~BIT3; //電平轉(zhuǎn)換方向3.3
68、V--->5V</p><p> PortDIR =0xff; </p><p> PortOUT = reg;</p><p><b> _NOP();</b></p><p><b> C_ALE;</b></p><p><b> _NOP(
69、);</b></p><p><b> C_CS;</b></p><p><b> _NOP();</b></p><p><b> C_WR;</b></p><p><b> _NOP();</b></p><
70、p> PortOUT= reg_data;</p><p><b> _NOP();</b></p><p><b> _NOP();</b></p><p><b> S_WR;</b></p><p><b> _NOP();</b>&
71、lt;/p><p><b> S_CS;</b></p><p><b> _NOP();</b></p><p><b> _NOP();</b></p><p><b> S_ALE;</b></p><p><b&g
72、t; }</b></p><p> /*********************************************************</p><p> 函數(shù)原型:char create_communication(void)</p><p> 函數(shù)功能:用于SJA1000在復(fù)位模式下,檢測(cè)CAN控制器SJA1000的通信是否正
73、常,只用于產(chǎn)品</p><p> 的測(cè)試,如果在正常模式下使用這個(gè)寄存器進(jìn)行測(cè)試,將導(dǎo)致設(shè)備不可預(yù)測(cè)的結(jié)果。</p><p> 返回值說明: 0:表示SJA1000建立通信正常</p><p> 1:表示SJA1000與處理器通信異常</p><p> *****************************************
74、*****************/</p><p> char create_communication(void)</p><p><b> {</b></p><p> Write_Reg(TEST,0xaa); //向TEST寄存器中寫入0xaa</p><p> if(Read_Reg(TEST)
75、== 0xaa) </p><p> { return 0;} //讀測(cè)試正確</p><p><b> else</b></p><p> { return 1;}</p><p><b> }</b></p><p> /*********
76、************************************************</p><p> 函數(shù)原型:char enter_RST(void)</p><p> 函數(shù)功能:用于SJA1000進(jìn)入復(fù)位工作模式</p><p> 返回值說明: 0:表示SJA1000成功進(jìn)入復(fù)位工作模式</p><p> 1:表示S
77、JA1000進(jìn)入復(fù)位模式失敗</p><p> **********************************************************/</p><p> char enter_RST(void)</p><p><b> {</b></p><p> unsigned char M
78、ID_DATA; //定義一個(gè)字節(jié)變量,用于存儲(chǔ)從SJA1000控制寄存器讀出的數(shù)據(jù)</p><p> MID_DATA = Read_Reg(CONTROL);//訪問SJA1000控制寄存器,保存原始值</p><p> Write_Reg(CONTROL,MID_DATA|0x01); //置位復(fù)位請(qǐng)求</p><p> if((Read_Reg(
79、CONTROL)&0x01)==1) //讀SJA1000的控制寄存器數(shù)值,判斷復(fù)位請(qǐng)求是否有效</p><p> {return 0;} //表示SJA1000成功進(jìn)入復(fù)位工作模式</p><p><b> else</b></p><p> {return 1;}</p><p><b&g
80、t; }</b></p><p> /*********************************************************</p><p> 函數(shù)原型:char quit_RST(void)</p><p> 函數(shù)功能:用于SJA1000退出復(fù)位工作模式</p><p> 返回值說明: 0:
81、表示SJA1000成功退出復(fù)位工作模式</p><p> 1:表示SJA1000退出復(fù)位模式失敗</p><p> **********************************************************/</p><p> char quit_RST(void)</p><p><b> {&l
82、t;/b></p><p> unsigned char MID_DATA; //定義一個(gè)字節(jié)變量,用于存儲(chǔ)從SJA1000控制寄存器讀出的數(shù)據(jù)</p><p> MID_DATA = Read_Reg(CONTROL);//訪問SJA1000控制寄存器,保存原始值</p><p> Write_Reg(CONTROL,MID_DATA&0xf
83、e); //置位復(fù)位請(qǐng)求</p><p> if((Read_Reg(CONTROL)&0x01)==0) //讀SJA1000的控制寄存器數(shù)值,判斷清除復(fù)位請(qǐng)求是否有效</p><p> {return 0;} //0:表示SJA1000成功退出復(fù)位工作模式</p><p><b> else</b></
84、p><p> {return 1;}</p><p><b> }</b></p><p> /*********************************************************</p><p> 函數(shù)原型:char set_rate(unsignen char CAN_rate_nu
85、m)</p><p> 函數(shù)功能:用于設(shè)置CAN總線的通信波特率,只能在SJA1000進(jìn)入復(fù)位模式下使用</p><p> 參數(shù)說明:參數(shù)CAN_rate_num用于存放CAN通信波特率的數(shù)組列表中的系列號(hào),范圍為0~12.</p><p> 返回值說明: 0:波特率設(shè)置成功</p><p><b> 1:波特率設(shè)置失敗&l
86、t;/b></p><p> **********************************************************/</p><p> unsigned char rate_tab[]={</p><p> 0x53,0x2f, //20kbit/s的波特率預(yù)設(shè)值</p><p> 0x8
87、7,0xff, //40kbit/s</p><p> 0x47,0x2f, //50kbit/s</p><p> 0x83,0xff, //80kbit/s</p><p> 0x43,0x2f, //100kbit/s</p><p> 0x03,0x1c, //125kbit/s</p>
88、;<p> 0x81,0xfa, //200kbit/s</p><p> 0x01,0x1c, //250kbit/s</p><p> 0x80,0xfa, //400kbit/s</p><p> 0x00,0x1c, //500kbit/s</p><p> 0x80,0xb6,
89、 //666kbit/s</p><p> 0x00,0x16, //800kbit/s</p><p> 0x00,0x14 //1000kbit/s</p><p><b> };</b></p><p> //--------------------------------------
90、----------------------</p><p> char set_rate (unsigned char CAN_rate_num)</p><p><b> {</b></p><p> char wrong_flag=1;</p><p> unsigned char BIT0_data,BI
91、T1_data; //用于存放從波特率數(shù)組中讀出來(lái)的數(shù)值</p><p> unsigned char wrong_count=32; //32次報(bào)錯(cuò)次數(shù)</p><p> if(CAN_rate_num>12) //設(shè)置數(shù)組列表中的序列號(hào)范圍為0~12</p><p> { wrong_flag=1;} //如果超出范圍,報(bào)警,波特率設(shè)置失敗&
92、lt;/p><p><b> else</b></p><p><b> {</b></p><p> while(--wrong_count) //最多32次設(shè)置SJA1000內(nèi)部寄存器BIT0和BIT1</p><p><b> {</b></p>&l
93、t;p> BIT0_data=rate_tab[CAN_rate_num*2];</p><p> BIT1_data=rate_tab[CAN_rate_num*2+1];//將波特率的設(shè)置值從數(shù)組中讀出</p><p> Write_Reg(BIT_0,BIT0_data);//訪問CAN總線定時(shí)寄存器0,寫入?yún)?shù)</p><p> if(Read
94、_Reg(BIT_0) != BIT0_data )continue; //校驗(yàn)寫入值</p><p> Write_Reg(BIT_1,BIT1_data);//訪問CAN總線定時(shí)寄存器1,寫入?yún)?shù)</p><p> if(Read_Reg(BIT_1) != BIT1_data )continue; //校驗(yàn)寫入值</p><p> wrong_fla
95、g = 0;</p><p><b> break;</b></p><p> } //while 結(jié)束</p><p><b> }</b></p><p> return wrong_flag;</p><p><b> }</b>
96、</p><p> /*********************************************************</p><p> 函數(shù)原型:char set_ACR_AMR(unsignen char ACR_DATA,unsignen char AMR_DATA)</p><p> 函數(shù)功能:用于設(shè)置驗(yàn)收代碼寄存器(ACR),屏蔽寄
97、存器(AMR)只能在SJA1000進(jìn)入復(fù)位模式下使用</p><p> 參數(shù)說明:ACR_DATA :用于存放驗(yàn)收代碼寄存器(ACR)的參數(shù)值</p><p> AMR_DATA :用于存放驗(yàn)收代碼寄存器(AMR)的參數(shù)值</p><p> 返回值說明: 0:通信對(duì)象設(shè)置成功</p><p><b> 1:通信對(duì)象置失敗&l
98、t;/b></p><p> **********************************************************/</p><p> char set_ACR_AMR(unsigned char ACR_DATA,unsigned char AMR_DATA) //濾波器設(shè)計(jì)</p><p><b> {
99、</b></p><p> Write_Reg(ACR,ACR_DATA);//訪問CAN總線驗(yàn)收代碼寄存器,寫入?yún)?shù) </p><p> if(Read_Reg(ACR) != ACR_DATA)//校驗(yàn)寫入值</p><p> {return 1;}</p><p> Write_Reg(AMR,AMR_DATA);
100、//訪問CAN總線驗(yàn)收代碼寄存器,寫入?yún)?shù) </p><p> if(Read_Reg(AMR) != AMR_DATA)//校驗(yàn)寫入值</p><p> {return 1;}</p><p><b> return 0;</b></p><p><b> }</b></p>
101、<p> /*********************************************************</p><p> 函數(shù)原型:char set_CLK (unsigned char SJA_OUT_MODE,unsigned char SJA_Clock_Out)</p><p> 函數(shù)功能:用于設(shè)置輸出寄存器(OCR)的參數(shù)、時(shí)鐘分頻寄存
102、器(CDR)的參數(shù),</p><p> 只能在SJA1000進(jìn)入復(fù)位模式下使用</p><p> 參數(shù)說明:SJA_OUT_MODE :用于存放輸出寄存器(OC)的參數(shù)</p><p> SJA_Clock_Out :用于存放時(shí)鐘分頻寄存器(CDR)的參數(shù)</p><p> 返回值說明: 0:設(shè)置(OCR)和(CDR)寄存器成功<
103、;/p><p> 1:設(shè)置(OCR)和(CDR)寄存器失敗</p><p> **********************************************************/</p><p> char set_CLK (unsigned char SJA_OUT_MODE,unsigned char SJA_Clock_Out)</p
104、><p><b> {</b></p><p> Write_Reg(OCR,SJA_OUT_MODE);//訪問輸出控制寄存器,寫入設(shè)置的OCR參數(shù)值</p><p> if(Read_Reg(OCR) != SJA_OUT_MODE)//校驗(yàn)寫入值</p><p> {return 1;}</p>
105、<p> Write_Reg(CDR,SJA_Clock_Out);//訪問輸出控制寄存器,寫入設(shè)置的CDR參數(shù)值</p><p> // if(Read_Reg(CDR) != SJA_Clock_Out)//校驗(yàn)寫入值</p><p> // {return 1;}</p><p><b> return 0;</b>&l
106、t;/p><p><b> }</b></p><p> /*********************************************************</p><p> 函數(shù)原型:char SJA_send_data(unsigned char *senddatabuf)</p><p> 函
107、數(shù)功能:用于發(fā)送CAN總線一幀數(shù)據(jù)(數(shù)據(jù)幀或遠(yuǎn)程幀)到SJA1000的發(fā)送緩沖區(qū),</p><p> 數(shù)據(jù)幀長(zhǎng)度不大于8字節(jié)</p><p> 參數(shù)說明:senddatabuf :指向的用于存放發(fā)送數(shù)據(jù)的數(shù)組的首址</p><p> 返回值說明: 0:將發(fā)送數(shù)組的數(shù)據(jù)成功送至SJA1000的發(fā)送區(qū)</p><p> 1:SJA1000
108、正在接收信息,或SJA1000的發(fā)送緩沖區(qū)被鎖定,</p><p> 或上一次發(fā)送的一幀數(shù)據(jù)還沒有完成發(fā)送</p><p> **********************************************************/</p><p> char SJA_send_data(unsigned char *senddatabuf)
109、 //gai!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!</p><p><b> {</b></p><p> unsigned char send_num,STATUS_data; </p><p> unsigned char i; </p><p> STA
110、TUS_data = Read_Reg(STATUS);//讀取狀態(tài)寄存器數(shù)值到STATUS_data</p><p> if(STATUS_data & 0x10)</p><p> {return 1;} //STATUS_data^4,表示SJA1000在接收信息 </p><p> if((STATUS_da
111、ta & 0x04)==0)//判斷SJA1000發(fā)送緩沖區(qū)是否為鎖定狀態(tài),0鎖定</p><p> {return 1;}</p><p> if((STATUS_data & 0x08)==0)//判斷上次發(fā)送是否完成,0上次發(fā)送未完成</p><p> {return 1;}</p><p> senddatab
112、uf[0] = 0xAC;</p><p> senddatabuf[1] = 0x06;</p><p> Write_Reg(TxBuffer1,senddatabuf[0]);</p><p> Write_Reg(TxBuffer2,senddatabuf[1]);</p><p> if((senddatabuf[1]&am
113、p;0x10)==0) //判斷RTR位,是數(shù)據(jù)幀還是遠(yuǎn)程幀判定</p><p><b> {</b></p><p> send_num = (senddatabuf[1]&0x0f); //是數(shù)據(jù)幀,則取一幀CAN數(shù)據(jù)的第2字節(jié)的低4位,</p><p> //計(jì)算得出發(fā)送數(shù)據(jù)的長(zhǎng)度</p><p>
114、 if(send_num>8) //發(fā)送最大長(zhǎng)度為8個(gè)字節(jié)</p><p> send_num = 8;</p><p> for(i=0; i< send_num; i++)</p><p><b> {</b></p><p> Write_Reg(TxBu
115、ffer3+i,senddatabuf[2+i]);</p><p> delay_us(2); </p><p> } </p><p><b> }</b></p><p><b> else</b></p&
116、gt;<p><b> {</b></p><p> send_num=0; //是遠(yuǎn)程幀,則發(fā)送數(shù)據(jù)長(zhǎng)度為0</p><p> for(i=0; i< send_num; i++)</p><p><b> {</b></p><p> Write_Re
117、g(TxBuffer3+i,senddatabuf[2+i]);</p><p> delay_us(2); </p><p> } </p><p><b> }</b></p><p> SJA_command_control(0x01); //調(diào)用發(fā)送請(qǐng)求</p&g
118、t;<p><b> return 0;</b></p><p><b> }</b></p><p> /*********************************************************</p><p> 函數(shù)原型:char SJA_rcv_data(unsigne
119、d char *rcvdatabuf)</p><p> 函數(shù)功能:用于接收CAN總線一幀數(shù)據(jù)</p><p> 參數(shù)說明:rcvdatabuf :指向的用于存放發(fā)送數(shù)據(jù)的數(shù)組的首址</p><p> 返回值說明: 0:成功接收CAN總線的一幀數(shù)據(jù)</p><p> 1:接收CAN總線的一幀數(shù)據(jù)失敗</p><p&
120、gt; **********************************************************/</p><p> char SJA_rcv_data(unsigned char *rcvdatabuf)</p><p><b> {</b></p><p> unsigned char rcv_num,S
121、TATUS_data;</p><p> STATUS_data = Read_Reg(STATUS);//讀取狀態(tài)寄存器數(shù)值到STATUS_data</p><p> if((STATUS_data & 0x01)==0) //判斷接收緩沖區(qū)中是否有信息,為0表示沒有信息</p><p> {return 1;} </p><
122、p> rcvdatabuf[0] = Read_Reg(RxBuffer1); </p><p> rcvdatabuf[1] = Read_Reg(RxBuffer2); </p><p> unsigned char i;</p><p> if(0 == (rcvdatabuf[1] & 0x10))</p><
123、;p><b> {</b></p><p> rcv_num = (rcvdatabuf[1] & 0x0f);</p><p> if( rcv_num > 8 ) </p><p> rcv_num = 8;</p><p> for(i=0; i<rcv_num; i++)<
124、;/p><p> rcvdatabuf[2+i] = Read_Reg(RxBuffer3 + i);</p><p><b> }</b></p><p> SJA_command_control(0x04); //釋放接收緩沖區(qū) </p><p><b> return 0;</b>&
125、lt;/p><p><b> }</b></p><p> /*********************************************************</p><p> 函數(shù)原型:char SJA_command_control(unsigned char order)</p><p> 函
126、數(shù)功能:設(shè)置命令寄存器(CMR)中的特定位,執(zhí)行相應(yīng)命令</p><p> 參數(shù)說明:order是SJA1000命令寄存器(CMR)中的特定位</p><p> TR_order (0x01):發(fā)送請(qǐng)求命令</p><p> AT_order (0x02):中止發(fā)送命令</p><p> RRB_order(0x04):釋放接收緩沖區(qū)
127、</p><p> CDO_order(0x08):清除數(shù)據(jù)溢出命令</p><p> GTS_order (0x10) : SJA1000進(jìn)入睡眠狀態(tài)</p><p> 返回值說明: 0:執(zhí)行命令成功</p><p><b> 1:執(zhí)行命令失敗</b></p><p> *******
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機(jī)大棚溫濕度控制的課程設(shè)計(jì)
- 單片機(jī)大棚溫濕度控制的課程設(shè)計(jì)
- 基于單片機(jī)溫濕度測(cè)量系統(tǒng)的研究與設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)---單片機(jī)溫濕度控制的課程設(shè)計(jì)
- 基于單片機(jī)的溫濕度檢測(cè)
- 基于單片機(jī)的溫濕度檢測(cè)
- 基于單片機(jī)溫濕度監(jiān)測(cè)系統(tǒng)設(shè)計(jì)
- 單片機(jī)無(wú)線溫濕度測(cè)量系統(tǒng)畢業(yè)設(shè)計(jì)
- 單片機(jī)溫濕度畢業(yè)設(shè)計(jì)
- 基于單片機(jī)的糧倉(cāng)溫濕度控制
- 基于單片機(jī)的溫濕度檢測(cè)系統(tǒng)的設(shè)計(jì)
- 基于單片機(jī)大棚溫濕度監(jiān)控系統(tǒng)設(shè)計(jì)
- 基于單片機(jī)的溫濕度控制系統(tǒng)設(shè)計(jì)
- 基于單片機(jī)的溫濕度控制系統(tǒng)設(shè)計(jì)
- 基于avr單片機(jī)的溫濕度采集系統(tǒng)
- 基于單片機(jī)的溫濕度檢測(cè)系統(tǒng)的設(shè)計(jì).pdf
- 基于51單片機(jī)的溫濕度及氣壓檢測(cè)系統(tǒng)
- 基于單總線的溫濕度測(cè)量系統(tǒng)的設(shè)計(jì)
- 基于單片機(jī)數(shù)字溫濕度控制器的設(shè)計(jì)
- 基于單片機(jī)控制溫濕度的系統(tǒng)外文及翻譯
評(píng)論
0/150
提交評(píng)論