單片機(jī)課程設(shè)計(jì)--基于can總線的溫濕度及光感度測(cè)量_第1頁(yè)
已閱讀1頁(yè),還剩53頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論