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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7467|回復: 0
打印 上一主題 下一主題
收起左側

dsPIC30F6014控制DS18B20溫度+CAN總線的發送程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:75926 發表于 2015-4-2 23:16 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. dsPIC30F6014控制DS18B20溫度+CAN總線的發送程序
  2. //          1。DS18B20定時采集溫度
  3. //          2。溫度采集時間間隔用T1定時器控制
  4. //          3。采集到的溫度通過CAN總線送另一主機處理

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

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

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


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产激情免费视频 | 精品欧美一区二区三区久久久 | cao在线 | 久久成| 美女131mm久久爽爽免费 | 日韩三级在线 | 亚洲欧美在线视频 | 国产一区二区在线免费观看 | 噜噜噜色网 | 日韩激情视频一区 | 在线一区| 美女天天干天天操 | 国产精品久久精品 | 一区二区国产精品 | 国产第一页在线播放 | 亚洲乱码国产乱码精品精的特点 | 国产伦一区二区三区四区 | 亚洲女优在线播放 | 国产精品国产成人国产三级 | 国产一区二区三区久久久久久久久 | 日韩高清中文字幕 | 亚洲精久 | 国产日韩欧美 | 欧美久久大片 | 欧美日韩视频在线 | 国产美女自拍视频 | 国产网站在线免费观看 | 久久99精品视频 | 成人在线 | 69av片| av性色全交蜜桃成熟时 | 夜夜爽99久久国产综合精品女不卡 | 国产在线一区二区 | 春色av| 中文字幕在线精品 | 国产精品日韩在线观看一区二区 | 日韩小视频在线 | 欧美九九九 | 成人亚洲片 | 久久成人免费 | www.国产精 |