久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5159|回復(fù): 1
收起左側(cè)

dsPIC30F6014 CAN總線發(fā)送功能+DS18B20溫度采集

[復(fù)制鏈接]
ID:75926 發(fā)表于 2015-4-2 23:18 | 顯示全部樓層 |閱讀模式
  1. 1。DS18B20定時采集溫度
  2. 2。溫度采集時間間隔用T1定時器控制
  3. 3。采集到的溫度通過CAN總線送另一主機(jī)處理
  4. #include <p30f6014.h>             //dsPIC30F6014標(biāo)準(zhǔn)頭文件
  5.   _FOSC(0x0ffe5);                 //4倍頻晶振,F(xiàn)ailsafe 時鐘關(guān)閉
  6.   _FWDT(WDT_OFF);                 //關(guān)閉看門狗定時器
  7.   _FBORPOR(PBOR_OFF & MCLR_EN);   //掉電復(fù)位禁止,MCLR復(fù)位使能。
  8.   _FGS(CODE_PROT_OFF);            //代碼保護(hù)禁止
  9. unsigned long int i = 0;
  10. #define  uch unsigned char                     //給unsigned char起別名 uch
  11. # define DQ PORTFbits.RF6                      //定義18B20數(shù)據(jù)端口
  12. # define DQ_DIR TRISFbits.TRISF6               //定義18B20D口方向寄存器
  13. # define DQ_HIGH() DQ_DIR =1                   //設(shè)置數(shù)據(jù)口為輸入
  14. # define DQ_LOW() DQ = 0; DQ_DIR = 0           //設(shè)置數(shù)據(jù)口為輸出
  15. #define rs LATBbits.LATB4          //定義LCD控制位(注意這里只能用LATB寄存器,不能直接用PORTB寄存器)
  16. #define rw LATBbits.LATB5
  17. #define e  LATBbits.LATB6
  18.                         
  19. unsigned char __attribute__((address(0x900))) TLV;   //采集到的溫度高8位
  20. unsigned char __attribute__((address(0x902))) THV;   //采集到的溫度低8位
  21. unsigned char __attribute__((address(0x904))) TZ;    //轉(zhuǎn)換后的溫度值整數(shù)部分
  22. unsigned char __attribute__((address(0x906))) TX;    //轉(zhuǎn)換后的溫度值小數(shù)部分
  23. unsigned int  __attribute__((address(0x908))) wd;    //轉(zhuǎn)換后的溫度值BCD碼形式
  24. unsigned char __attribute__((address(0x9a0))) loop;  //LCD顯示次數(shù)計數(shù)器
  25. //**********************CAN總線初始化*************************
  26. void initcan()
  27. {
  28.     C1CTRLbits.REQOP = 0x4; //請求進(jìn)入配置模式
  29.     while (C1CTRLbits.OPMODE!=0x4){}  //確認(rèn)進(jìn)入配置模式
  30.     C1TX0CON = 0x0003;      //發(fā)送0郵箱配置
  31.     C1TX0SID = 0x0020;      //發(fā)送0標(biāo)準(zhǔn)標(biāo)識符,11位
  32.     C1TX0DLC = 0x01c0;      //發(fā)送0數(shù)據(jù)長度,8字節(jié)
  33.     C1RX0CON = 0x0000;      //接收0郵箱配置
  34.     C1RX0DLC = 0x0008;      //接收0數(shù)據(jù)長度,8字節(jié)
  35.     C1RXF0SID = 0x0020;     //接收濾波器0標(biāo)準(zhǔn)標(biāo)識符,11位
  36.     C1RXM0SID = 0xffff;     //接收屏蔽0標(biāo)準(zhǔn)標(biāo)識符
  37.    C1CFG1bits.SJW=0;  //SJW=1 x TQ
  38.    C1CFG1bits.BRP = 9;      //125K  
  39.    C1CFG2 = 0x03Ac;         //SEG2PH=5;SEG1PH=6;PRSEG=4
  40.     C1CTRLbits.REQOP = 0x0; //請求進(jìn)入正常模式
  41.     while (C1CTRLbits.OPMODE!=0x0){}  //確認(rèn)進(jìn)入正常模式
  42. return;
  43. }      

  44. //**********************延時函數(shù)**************************
  45. //延時函數(shù)(延時時間為(2+x)us)
  46. void delay(  char x)
  47. {
  48.    unsigned char i;
  49.    for(i=0;i<x;i++);
  50. }
  51. //********************系統(tǒng)初始化函數(shù)**********************
  52. void init()
  53. {
  54.   TRISF=0X0000;                                 //先設(shè)置18B20口方向?yàn)檩敵?br />
  55.   TRISB=0X0000;                                 //設(shè)置B口方向?yàn)檩敵?br />
  56.   TRISD=0X0000;                                 //設(shè)置D口方向?yàn)檩敵?br />
  57.   IFS0bits.T1IF=0;                              //先清除定時器中斷標(biāo)志位
  58.   PR1=0XFFFF;                                   //周期定最大
  59.   T1CON=0X0020;                                 //分頻比為1:64
  60.   INTCON1=0x0000;
  61.   INTCON2=0x0000;                             //關(guān)閉所有中斷  
  62. }

  63. //******************復(fù)位DS18B20函數(shù)*****************************
  64. //主控制器(dsPIC30F6014A)先拉低總線480us,然后釋放總線回到高電平
  65. //18B20檢測到上升沿后先等待15-60us,然后拉低總線做為復(fù)位的應(yīng)答信號
  66. //主控制器釋放總線后到復(fù)位結(jié)束時間應(yīng)為480US
  67. reset(void)
  68. {
  69.   char presence=1;
  70.   while(presence)
  71.   {
  72.     DQ_LOW() ;                                //主機(jī)拉至低電平
  73.     delay(100);                        
  74.     delay(100);   
  75.     delay(100);   
  76.     delay(100);
  77.     delay(78);                                //以上5條共延時480us
  78.     DQ_HIGH();                                //釋放總線等電阻拉高總線,并保持15~60us
  79.     delay(38);                                //延時40us        
  80.     if(DQ==1) presence=1;                     //沒有接收到應(yīng)答信號,繼續(xù)復(fù)位
  81.     else presence=0;                          //接收到應(yīng)答信號
  82.     delay(100);                        
  83.     delay(100);   
  84.     delay(100);   
  85.     delay(100);
  86.     delay(38);                                //以上5條共延時440us
  87.    }
  88.   }
  89. //****************寫18b20寫字節(jié)函數(shù)*****************************
  90. //主控制器寫數(shù)據(jù)1:先把總線拉低,然后在15us內(nèi)釋放總線
  91. //主控制器寫數(shù)據(jù)0:把總線拉低至少60us
  92. //寫一位數(shù)據(jù)至少需要60us
  93. //兩位數(shù)據(jù)之間至少延時1us
  94. void write_byte(uch val)
  95. {
  96. uch i;
  97. uch temp;
  98. for(i=8;i>0;i--)
  99. {
  100.    temp=val&0x01;                            //最低位移出
  101.    DQ_LOW();
  102.    delay(3);                                 //保持拉低5us
  103.    if(temp==1)  DQ_HIGH();                   //如果寫1,拉高電平
  104.    delay(58);                                //延時60us
  105.    DQ_HIGH();
  106.    delay(1);                                 //在兩位之間插入3us延時
  107.    val=val>>1;                               //右移一位
  108.   }
  109. }
  110. //****************18b20讀字節(jié)函數(shù)********************************
  111. //主控制器把總線拉低至少1US,然后釋放
  112. //主控制器讀數(shù)據(jù)1:18B20保持總線狀態(tài)不變
  113. //主控制器讀數(shù)據(jù)0:18B20檢測到總線拉低后繼續(xù)拉低總線至少60ms
  114. //主控制器在拉低總線后的15us讀取總線上的狀態(tài)
  115. //讀取1位數(shù)據(jù)至少需要60us
  116. uch read_byte(void)
  117. {
  118. uch i;
  119. uch value=0;                                //讀出溫度
  120. for(i=8;i>0;i--)
  121. {
  122.    value>>=1;
  123.    DQ_LOW();
  124.    delay(1);                                //保持總線拉低3us
  125.    DQ_HIGH();                               //拉至高電平
  126.    delay(5);                                //釋放總線后保持7us再讀取數(shù)據(jù)
  127.    if(DQ) value|=0x80;
  128.    delay(48);                               //延時50us,保證每1位的60us延時
  129.   }
  130.   return(value);
  131. }
  132. //*****************啟動溫度轉(zhuǎn)換函數(shù)***************************
  133. void get_temp()
  134. {
  135. int i;
  136. DQ_HIGH();                              
  137. reset();                                 //復(fù)位等待從機(jī)應(yīng)答
  138. write_byte(0XCC);                        //忽略ROM匹配
  139. write_byte(0X44);                        //發(fā)送溫度轉(zhuǎn)化命令  
  140. for(i=0;i<8;i++)
  141.     {
  142.         
  143.       delay(98);                         //確保溫度轉(zhuǎn)換完成所需要的時間
  144.     }
  145. reset();                                 //再次復(fù)位,等待從機(jī)應(yīng)答
  146. write_byte(0XCC);                        //忽略ROM匹配
  147. write_byte(0XBE);                        //發(fā)送讀溫度命令
  148. TLV=read_byte();                         //讀出溫度低8
  149. THV=read_byte();                         //讀出溫度高8位
  150. DQ_HIGH();                               //釋放總線
  151. TZ=(TLV>>4)|(THV<<4)&0X3f;               //溫度整數(shù)部分
  152. TX=TLV<<4;                               //溫度小數(shù)部分
  153. }
  154. //************************主函數(shù)********************************
  155. int main(void)
  156. {
  157.    init();                              //調(diào)用系統(tǒng)初始化函數(shù)
  158.    initcan();
  159.    LATDbits.LATD0=1;
  160.    LATDbits.LATD1=0;
  161.    while(1)
  162.      {
  163.        TMR1=0XC2F6;                     //定時器初值
  164.        T1CONbits.TON=1;                 //啟動定時器
  165.        while(!IFS0bits.T1IF);           //等待0.1s定時到
  166.        IFS0bits.T1IF=0;
  167.        get_temp();                      //調(diào)用溫度轉(zhuǎn)換函數(shù)
  168.       
  169.        C1TX0B1 = TZ;                    
  170.        C1TX0B2 = TX;
  171.        C1TX0B3 = 0x5A5A;                //B3跟B4四字節(jié)數(shù)據(jù)無效,也可做效驗(yàn)用
  172.        C1TX0B4 = 0xa5a5;
  173.        C1TX0CONbits.TXREQ = 1;          //啟動發(fā)送
  174.        while (C1TX0CONbits.TXREQ==1){} //等待發(fā)送完成
  175.        for (i=0;i<2;i++){}
  176.      }
  177. }
復(fù)制代碼


回復(fù)

使用道具 舉報

ID:342505 發(fā)表于 2018-6-27 16:48 | 顯示全部樓層
問一下,你這個CAN發(fā)送有沒有碰到過TXERR的情況?如果碰到了,怎么解決?謝謝
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日日做夜夜爽毛片麻豆 | 成人在线免费视频 | 久久久久国产精品一区二区 | 凹凸日日摸日日碰夜夜 | 91中文在线观看 | 欧美久久久久久 | 亚洲高清在线播放 | 久久久久国产一区二区 | 久久久国产一区二区三区四区小说 | 久草网址 | 波多野结衣中文视频 | 久久久91 | 成人不卡视频 | 国产精彩视频一区 | 热re99久久精品国99热观看 | 国产一区二区电影 | 国产真实精品久久二三区 | 欧美激情在线观看一区二区三区 | 亚洲福利av | 久久久久1| 黄色成人免费看 | 一级毛片视频在线 | 成人黄色在线 | 国产精品特级毛片一区二区三区 | 五月激情婷婷网 | 精品国产乱码久久久久久老虎 | 亚洲在线中文字幕 | 国产九一精品 | 精品无码三级在线观看视频 | 亚洲成人一区二区三区 | 成人免费观看男女羞羞视频 | 亚洲精品一二区 | 在线视频h | 久久一区二区三区四区 | 国产精品一区二区三级 | 亚洲高清成人在线 | 精品96久久久久久中文字幕无 | 日韩免费网站 | 免费看国产片在线观看 | 日韩精品免费在线观看 | 亚洲 中文 欧美 日韩 在线观看 |