版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 單片機系統(tǒng)課程設計報告</p><p> 完成日期:2013 年 7 月 11 日</p><p> 基于CAN總線的溫濕度及光感度測量</p><p><b> 摘要:</b></p><p> 隨著我國工業(yè)生產的發(fā)展和自動化程度的不斷提高,迫切需要對各種生產過程中的物理量進行精確檢測。
2、溫度、濕度作為大多數(shù)生產過程中的重要物理量,對它們的精確檢測和遠傳越來越受到人們重視。因此,研制一種高精度、高穩(wěn)定性、低成本的溫濕度儀表將具有重要意義,必將擁有廣闊的市場前景。同時,由于工業(yè)現(xiàn)場對抗電磁干擾和傳輸距離有比較高的要求,所以本文設計了一種基于CAN(ControlArea Network局域網(wǎng)控制)總線的遠程實時溫濕度數(shù)據(jù)采集系統(tǒng)。該系統(tǒng)主要由兩大模塊構成,分別是數(shù)據(jù)現(xiàn)場采集模塊、和顯示處理模塊。本設計使用C語言進行了各個模
3、塊軟件的設計,完成對傳感器信號的處理和CAN模塊報文的發(fā)送和接收。</p><p> 關鍵詞:430 CAN DHT11 溫濕度 光感度</p><p><b> 1設計方案論證</b></p><p><b> 1.1主控芯片選擇</b></p><p> 用可編程邏輯器件設計。可采用AL
4、TERA公司的FLEX10K系列PLD器件。設計起來結構清晰,各個模塊,從硬件上設計起來相對簡單,控制與顯示的模塊間的連接也會比較方便。但是考慮到本設計的特點,EDA在功能擴展上比較受局限,而且EDA占用的資源也相對多一些。從成本上來講,用可編程邏輯器件來設計也沒有什么優(yōu)勢。 </p><p> 用MSP430F149作主控芯片,編程簡單,功能豐富,速度很快,功耗很低。因此選擇430作為數(shù)據(jù)采集和顯示
5、處理的主控芯片。</p><p> 2顯示部分的方案選擇</p><p><b> 數(shù)碼管顯示方式</b></p><p> 采用八段數(shù)碼管經濟實惠,亮度高,對比度高,顯示清晰;但操作很復雜,占用很多CPU時間。</p><p><b> 液晶顯示方式 </b></p><
6、;p> 液晶顯示效果出眾,操作簡單,輸入完顯示信息后不占用CPU時間,顯示容量也大,因此采用1602液晶顯示器。</p><p><b> 3傳感器選擇</b></p><p> 采用DS18B20數(shù)字溫度傳感器,精度高,靈敏度高;但不能采集濕度信息;</p><p> 采用DHT11數(shù)字溫度傳感器,可同時測量溫度和濕度,精度和靈
7、敏度,轉換速度也都能滿足本次系統(tǒng)要求,而且DHT11采用單總線通信模式,占用IO口少。因此選用DHT11數(shù)字溫濕度傳感器。</p><p><b> 2系統(tǒng)設計</b></p><p> 采用MSP430F149作為數(shù)據(jù)采集和接收處理顯示模塊的主控芯片,430和各種傳感器通信讀出各種測量參數(shù),通過CAN控制器將信息發(fā)送到CAN 總線上;數(shù)據(jù)接收模塊從CAN總線上讀
8、取各種信息并通過顯示模塊顯示出來。</p><p><b> 3單元電路設計</b></p><p> 3.1溫濕度采集系統(tǒng)</p><p> 由圖2所示,溫濕度數(shù)據(jù)采集模塊的硬件由以下四部分構成:傳感器DHT11,微控制器MSP430F149,CAN控制器和CAN收發(fā)器。微控制器MSP430F149主要負責對傳感器輸出的兩路模擬信號進行
9、循環(huán)采集并AD轉換,SJAl000的初始化,通過控制JAl000實現(xiàn)數(shù)據(jù)的發(fā)送和接收。SJAl000負責數(shù)據(jù)鏈路層的工作,把發(fā)送緩沖器的數(shù)據(jù)經過處理后送到TJAl050,信息經過處理后放到接收緩沖器等待微處理器的讀取。TJA1050提供SJA1000與物理總線之間的接口。</p><p> 3.2數(shù)據(jù)處理顯示模塊</p><p> 如圖3所示TJA1050收發(fā)器將信號差分放大去除噪聲后
10、送給SJA1000控制器,控制器將接到的報文處理后提取數(shù)據(jù)給430,430將數(shù)據(jù)顯示到1602顯示器上。</p><p><b> 4系統(tǒng)功能</b></p><p> 本文設計的系統(tǒng)能實時測量遠程溫濕度及光強度。</p><p> 測量范圍:溫度0~50℃,濕度20~90%RH,光強1lx-65535lx;</p><
11、;p> 分辨率:溫度1℃,濕度+/-2℃,光強1lx;</p><p><b> 測量距離:1km</b></p><p><b> 5程序模塊流程圖</b></p><p><b> 參考文獻</b></p><p> [1] 李正軍編著.現(xiàn)場總線及其應用技術
12、[M].北京機械工業(yè)出版社.2005.1</p><p> [2] 任廣永等.基于AT89C55和CAN總線的遠程數(shù)據(jù)采集系統(tǒng)的設計[J].電腦學習.2007.2</p><p> [3] 潘琢金,施國君.C8051FXXX高速SOC單片機原理及應用[M].北京:北京航空航天大學出版社.2002</p><p> [4]吳文珍,韓玉祥,司光宇等.基于CAN總線
13、智能檢測儀的設計[D].大慶石油學院學報.2005,29(5)</p><p> [5]SJAl000獨立CAN控制器數(shù)據(jù)手冊.廣州周立功單片機發(fā)展有限公司.</p><p><b> 心得體會</b></p><p><b> 謝廣昊:</b></p><p> 通過此次課程設計,使我更加
14、扎實的掌握了有關CAN總線方面的知識,在設計過程中雖然遇到了一些問題,但經過一次又一次的思考,一遍又一遍的檢查終于找出了原因所在,也暴露出了前期我在這方面的知識欠缺和經驗不足。實踐出真知,通過親自動手制作,使我們掌握的知識不再是紙上談兵。 </p><p> 過而能改,善莫大焉。在課程設計過程中,我們不斷發(fā)現(xiàn)錯誤,不斷改正,不斷領悟,不斷獲取。最終的檢測調試環(huán)節(jié),本身就是在踐行“過而能改,善莫大焉”的
15、知行觀。這次課程設計終于順利完成了,在設計中遇到了很多問題,最后在老師的指導下,終于游逆而解。在今后社會的發(fā)展和學習實踐過程中,一定要不懈努力,不能遇到問題就想到要退縮,一定要不厭其煩的發(fā)現(xiàn)問題所在,然后一一進行解決,只有這樣,才能成功的做成想做的事,才能在今后的道路上劈荊斬棘,而不是知難而退,那樣永遠不可能收獲成功,收獲喜悅,也永遠不可能得到社會及他人對你的認可!</p><p><b> 馬少波:
16、</b></p><p> 我認為,在這學期的實驗中,不僅培養(yǎng)了獨立思考、動手操作的能力,在各種其它能力上也都有了提高。更重要的是,在實驗課上,我們學會了很多學習的方法。而這是日后最實用的,真的是受益匪淺。要面對社會的挑戰(zhàn),只有不斷的學習、實踐,再學習、再實踐。這對于我們的將來也有很大的幫助。以后,不管有多苦,我想我們都能變苦為樂,找尋有趣的事情,發(fā)現(xiàn)其中珍貴的事情。就像中國提倡的艱苦奮斗一樣,我們
17、都可以在實驗結束之后變的更加成熟,會面對需要面對的事情。 </p><p> 回顧起此課程設計,至今我仍感慨頗多,從理論到實踐,在這段日子里,可以說得是苦多于甜,但是可以學到很多很多的東西,同時不僅可以鞏固了以前所學過的知識,而且學到了很多在書本上所沒有學到過的知識。通過這次課程設計使我懂得了理論與實際相結合是很重要的,只有理論知識是遠遠不夠的,只有把所學的理論知識與實踐相結合起來,從理論中得出結論,
18、才能真正為社會服務,從而提高自己的實際動手能力和獨立思考的能力。在設計的過程中遇到問題,可以說得是困難重重,但可喜的是最終都得到了解決。 </p><p><b> 張巨龍:</b></p><p> 回顧起此次單片機課程設計,至今我仍感慨頗多,的確,從選題到定稿,從理論到實踐,在整整兩星期的日子里,可以說得是苦多于甜,但是可以學到很多很多的的東西,同時
19、不僅可以鞏固了以前所學過的知識,而且學到了很多在書本上所沒有學到過的知識。通過這次課程設計使我懂得了理論與實際相結合是很重要的,只有理論知識是遠遠不夠的,只有把所學的理論知識與實踐相結合起來,從理論中得出結論,才能真正為社會服務,從而提高自己的實際動手能力和獨立思考的能力。在設計的過程中遇到問題,可以說得是困難重重,這畢竟第一次做的,難免會遇到過各種各樣的問題。最后在老師的辛勤指導下,終于游逆而解。同時,在老師的身上我學得到很多實用的知
20、識,在次我表示感謝!同時,對給過我?guī)椭乃型瑢W和各位指導老師再次表示忠心的感謝!</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> //**************************精確延時**********************************</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 //接收中斷標志
25、</p><p> #define err_flag 0x02 //錯誤中斷標志</p><p> #define Over_flag 0x04 //CAN總線超載標志</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ā)送標志</p><p> unsigned char Can_INT_DATA=0; //用于存儲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); //小延時</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); //通電,等待測量指令</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; //清除接收標志位</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ā)送標志位</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; //清除溢出標志位</p><p> Can_DATA_OVER();</p><p><b> }</b></p>
41、<p> if((Can_INT_DATA & err_flag)==err_flag )//錯誤中斷</p><p><b> {</b></p><p> Can_INT_DATA &= ~err_flag; //清除錯誤標志位</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> /*下面六行程序關閉所有的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; //打開電平轉換</p><p> // P2DIR |= BIT3;P2OUT &= ~BIT3; //電平轉換方向3.3V--->5V</p><p> //----------P1
46、.7外部中斷------------------//</p><p> P1DIR &= ~BIT7; //設置P1.7為輸入</p><p> P1IES |= BIT7; //設置為下降沿中斷</p><p> P1IE |= BIT7; //允許P1.7中斷</p><p> //-----------
47、------------------------------//</p><p> //-----------切換時鐘---------------------//</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> //----------------定時器設置-------------------//</p><p> /* TACCTL0 = CCIE; //使能CCR0中斷</p><p> CCR0 = 2048; //設定
51、周期1S </p><p> TACTL = TASSEL_1 + ID_3 + MC_1;//定時器A的時鐘源選擇ACLK,增計數(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、*********************精確延時**********************************</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; //電平轉換方向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; //電平轉換方向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; //電平轉換方向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在復位模式下,檢測CAN控制器SJA1000的通信是否正
73、常,只用于產品</p><p> 的測試,如果在正常模式下使用這個寄存器進行測試,將導致設備不可預測的結果。</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;} //讀測試正確</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進入復位工作模式</p><p> 返回值說明: 0:表示SJA1000成功進入復位工作模式</p><p> 1:表示S
77、JA1000進入復位模式失敗</p><p> **********************************************************/</p><p> char enter_RST(void)</p><p><b> {</b></p><p> unsigned char M
78、ID_DATA; //定義一個字節(jié)變量,用于存儲從SJA1000控制寄存器讀出的數(shù)據(jù)</p><p> MID_DATA = Read_Reg(CONTROL);//訪問SJA1000控制寄存器,保存原始值</p><p> Write_Reg(CONTROL,MID_DATA|0x01); //置位復位請求</p><p> if((Read_Reg(
79、CONTROL)&0x01)==1) //讀SJA1000的控制寄存器數(shù)值,判斷復位請求是否有效</p><p> {return 0;} //表示SJA1000成功進入復位工作模式</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退出復位工作模式</p><p> 返回值說明: 0:
81、表示SJA1000成功退出復位工作模式</p><p> 1:表示SJA1000退出復位模式失敗</p><p> **********************************************************/</p><p> char quit_RST(void)</p><p><b> {&l
82、t;/b></p><p> unsigned char MID_DATA; //定義一個字節(jié)變量,用于存儲從SJA1000控制寄存器讀出的數(shù)據(jù)</p><p> MID_DATA = Read_Reg(CONTROL);//訪問SJA1000控制寄存器,保存原始值</p><p> Write_Reg(CONTROL,MID_DATA&0xf
83、e); //置位復位請求</p><p> if((Read_Reg(CONTROL)&0x01)==0) //讀SJA1000的控制寄存器數(shù)值,判斷清除復位請求是否有效</p><p> {return 0;} //0:表示SJA1000成功退出復位工作模式</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ù)功能:用于設置CAN總線的通信波特率,只能在SJA1000進入復位模式下使用</p><p> 參數(shù)說明:參數(shù)CAN_rate_num用于存放CAN通信波特率的數(shù)組列表中的系列號,范圍為0~12.</p><p> 返回值說明: 0:波特率設置成功</p><p><b> 1:波特率設置失敗&l
86、t;/b></p><p> **********************************************************/</p><p> unsigned char rate_tab[]={</p><p> 0x53,0x2f, //20kbit/s的波特率預設值</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ù)組中讀出來的數(shù)值</p><p> unsigned char wrong_count=32; //32次報錯次數(shù)</p><p> if(CAN_rate_num>12) //設置數(shù)組列表中的序列號范圍為0~12</p><p> { wrong_flag=1;} //如果超出范圍,報警,波特率設置失敗&
92、lt;/p><p><b> else</b></p><p><b> {</b></p><p> while(--wrong_count) //最多32次設置SJA1000內部寄存器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ù)組中讀出</p><p> Write_Reg(BIT_0,BIT0_data);//訪問CAN總線定時寄存器0,寫入?yún)?shù)</p><p> if(Read
94、_Reg(BIT_0) != BIT0_data )continue; //校驗寫入值</p><p> Write_Reg(BIT_1,BIT1_data);//訪問CAN總線定時寄存器1,寫入?yún)?shù)</p><p> if(Read_Reg(BIT_1) != BIT1_data )continue; //校驗寫入值</p><p> wrong_fla
95、g = 0;</p><p><b> break;</b></p><p> } //while 結束</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ù)功能:用于設置驗收代碼寄存器(ACR),屏蔽寄
97、存器(AMR)只能在SJA1000進入復位模式下使用</p><p> 參數(shù)說明:ACR_DATA :用于存放驗收代碼寄存器(ACR)的參數(shù)值</p><p> AMR_DATA :用于存放驗收代碼寄存器(AMR)的參數(shù)值</p><p> 返回值說明: 0:通信對象設置成功</p><p><b> 1:通信對象置失敗&l
98、t;/b></p><p> **********************************************************/</p><p> char set_ACR_AMR(unsigned char ACR_DATA,unsigned char AMR_DATA) //濾波器設計</p><p><b> {
99、</b></p><p> Write_Reg(ACR,ACR_DATA);//訪問CAN總線驗收代碼寄存器,寫入?yún)?shù) </p><p> if(Read_Reg(ACR) != ACR_DATA)//校驗寫入值</p><p> {return 1;}</p><p> Write_Reg(AMR,AMR_DATA);
100、//訪問CAN總線驗收代碼寄存器,寫入?yún)?shù) </p><p> if(Read_Reg(AMR) != AMR_DATA)//校驗寫入值</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ù)功能:用于設置輸出寄存器(OCR)的參數(shù)、時鐘分頻寄存
102、器(CDR)的參數(shù),</p><p> 只能在SJA1000進入復位模式下使用</p><p> 參數(shù)說明:SJA_OUT_MODE :用于存放輸出寄存器(OC)的參數(shù)</p><p> SJA_Clock_Out :用于存放時鐘分頻寄存器(CDR)的參數(shù)</p><p> 返回值說明: 0:設置(OCR)和(CDR)寄存器成功<
103、;/p><p> 1:設置(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);//訪問輸出控制寄存器,寫入設置的OCR參數(shù)值</p><p> if(Read_Reg(OCR) != SJA_OUT_MODE)//校驗寫入值</p><p> {return 1;}</p>
105、<p> Write_Reg(CDR,SJA_Clock_Out);//訪問輸出控制寄存器,寫入設置的CDR參數(shù)值</p><p> // if(Read_Reg(CDR) != SJA_Clock_Out)//校驗寫入值</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ù)幀或遠程幀)到SJA1000的發(fā)送緩沖區(qū),</p><p> 數(shù)據(jù)幀長度不大于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ù)幀還是遠程幀判定</p><p><b> {</b></p><p> send_num = (senddatabuf[1]&0x0f); //是數(shù)據(jù)幀,則取一幀CAN數(shù)據(jù)的第2字節(jié)的低4位,</p><p> //計算得出發(fā)送數(shù)據(jù)的長度</p><p>
114、 if(send_num>8) //發(fā)送最大長度為8個字節(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; //是遠程幀,則發(fā)送數(shù)據(jù)長度為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); //調用發(fā)送請求</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ù)功能:設置命令寄存器(CMR)中的特定位,執(zhí)行相應命令</p><p> 參數(shù)說明:order是SJA1000命令寄存器(CMR)中的特定位</p><p> TR_order (0x01):發(fā)送請求命令</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進入睡眠狀態(tài)</p><p> 返回值說明: 0:執(zhí)行命令成功</p><p><b> 1:執(zhí)行命令失敗</b></p><p> *******
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機大棚溫濕度控制的課程設計
- 單片機大棚溫濕度控制的課程設計
- 基于單片機溫濕度測量系統(tǒng)的研究與設計
- 畢業(yè)設計---單片機溫濕度控制的課程設計
- 基于單片機的溫濕度檢測
- 基于單片機的溫濕度檢測
- 基于單片機溫濕度監(jiān)測系統(tǒng)設計
- 單片機無線溫濕度測量系統(tǒng)畢業(yè)設計
- 單片機溫濕度畢業(yè)設計
- 基于單片機的糧倉溫濕度控制
- 基于單片機的溫濕度檢測系統(tǒng)的設計
- 基于單片機大棚溫濕度監(jiān)控系統(tǒng)設計
- 基于單片機的溫濕度控制系統(tǒng)設計
- 基于單片機的溫濕度控制系統(tǒng)設計
- 基于avr單片機的溫濕度采集系統(tǒng)
- 基于單片機的溫濕度檢測系統(tǒng)的設計.pdf
- 基于51單片機的溫濕度及氣壓檢測系統(tǒng)
- 基于單總線的溫濕度測量系統(tǒng)的設計
- 基于單片機數(shù)字溫濕度控制器的設計
- 基于單片機控制溫濕度的系統(tǒng)外文及翻譯
評論
0/150
提交評論