嵌入式爱好者

查看: 2860|回复: 3

DS18B20 的温度问题

[复制链接]

5

主题

21

帖子

30

积分

扫一扫,手机访问本帖
发表于 2013-10-3 17:38:22 | 显示全部楼层 |阅读模式
FL2440的板子 ,读取ds18b20的温度完全不正常,全部为0,自带的光盘资料里面的ADS实验代码下载进去,读出来的温度也是乱码,但是Test的二进制文件下载进去是可以读出来的,有人遇见这种情况吗?怎么解决的
回复

使用道具 举报

110

主题

1358

帖子

1443

积分

A40i/T3/T507/T527通行证i.MX6Q通行证i.MX6UL通行证i.MX8MM通行证i.MX8MP通行证RK3568通行证RK3588通行证RK3399通行证LS1028A通行证G2L通行证LS1012A通行证LS1043A\46A通行证TCU通行证FDU产品通行证FCU1401通行证FCU1301通行证FCU11xx通行证FCU1201通行证FCU2201通行证FCU2301/FCU2302通行证FCU2401通行证5G转接卡通行证FCU3001通行证AM5718通行证Hi3519A通信证AM335x通行证i.MX RT通行证XX18通行证AM62x资料下载FDU070K02\FDU101K02通行证i.MX9352通行证

发表于 2013-10-9 13:58:15 | 显示全部楼层
不会吧楼主,您可以吧源码贴出来吗?
该会员没有填写今日想说内容.
点评回复 支持 反对

使用道具 举报

5

主题

21

帖子

30

积分

 楼主| 发表于 2013-10-9 16:03:48 | 显示全部楼层
  1. /**********************实验*********************************/
  2. // 公司名称 :保定飞凌嵌入式技术有限公司
  3. // 描    述 :温度传感器试验,由串口打印采集数据
  4. // 版    权 :保定飞凌嵌入式技术有限公司
  5. // 网    址 :www.witech.com.cn
  6. /***************************************************************/

  7. /*-------------------------地址声明----------------------------*/
  8. #define GPGCON (*(volatile unsigned *)0x56000060)     //18b20寄存器设置
  9. #define GPGDAT (*(volatile unsigned *)0x56000064)
  10. #define GPGUP (*(volatile unsigned *)0x56000068)

  11. #define UFCON0     (*(volatile unsigned *)0x50000008)   //串口寄存器设置
  12. #define UMCON0     (*(volatile unsigned *)0x5000000c)
  13. #define ULCON0     (*(volatile unsigned *)0x50000000)       
  14. #define UCON0      (*(volatile unsigned *)0x50000004)
  15. #define UBRDIV0    (*(volatile unsigned *)0x50000028)
  16. #define UTRSTAT0   (*(volatile unsigned *)0x50000010)
  17. #define UTXH0                 (*(volatile unsigned*)0x50000020)
  18. #define URXH0                 (*(volatile unsigned*)0x50000024)
  19.    
  20. /*-------------------------变量定义----------------------------*/
  21. unsigned char wd[4];  
  22. unsigned int sdata;                //测量到的温度的整数部分
  23. unsigned char xiaoshu1;        //小数第一位
  24. unsigned char xiaoshu2;        //小数第二位
  25. unsigned char xiaoshu;        //两位小数

  26. /*-------------------------函数声明----------------------------*/
  27. void zh(void);
  28. void Delay(unsigned int x) ;
  29. void uart(void);
  30. void DS18B20PRO(void);
  31. void dmsec (unsigned int t);
  32. void tmreset (void);
  33. unsigned char tmrbit (void);
  34. unsigned char tmrbyte (void) ;
  35. void tmwbyte (unsigned char dat);
  36. void tmstart (void) ;
  37. void tmrtemp (void) ;

  38. /*-------------------------------------------------------------/
  39. 函数名称:        Main
  40. 功能描述:        入口函数
  41.                         不停循环检测温度值,并转换为asc||码,通过串口传出来
  42. 传    参:        无
  43. 返 回 值:        int
  44. --------------------------------------------------------------*/
  45. int Main(void)                     
  46. {  
  47.     while(1)
  48.     {  
  49.                    DS18B20PRO();      
  50.                 zh();
  51.                 uart();
  52.                 Delay(30);                     
  53.         }
  54.    
  55.         return(0);
  56. }

  57. /*-------------------------------------------------------------/
  58. 函数名称:        dmsec
  59. 功能描述:        精确延时函数
  60. 传    参:        unsigned int t
  61. 返 回 值:        无
  62. --------------------------------------------------------------*/
  63. void dmsec(unsigned int t)       //精确延时函数  
  64. {   
  65.         unsigned int i;
  66.     unsigned int j;
  67.     j = 1 * t;
  68.     for(i=0; i<j; i++);
  69. }

  70. /*-------------------------------------------------------------/
  71. 函数名称:        tmreset
  72. 功能描述:        18b20初始化
  73. 传    参:        无
  74. 返 回 值:        无
  75. --------------------------------------------------------------*/         
  76. void tmreset(void)
  77. {   
  78.         unsigned int i;                           
  79.    
  80.         GPGCON &= 0xfffffffc;    //设置寄存器对18b20进行写操作
  81.         GPGCON |= 0x01;
  82.        
  83.         GPGDAT |= 0x01;
  84.     dmsec(100);

  85.         GPGDAT &= 0xfffe;     
  86.         dmsec(600);
  87.   
  88.                 
  89.         GPGDAT |= 0x01;
  90.        
  91.         dmsec(100);
  92.         GPGCON &= 0xfffffffc;     //设置寄存器对18b20进行读操作
  93.         i = GPGDAT;
  94.        
  95. }            

  96. /*-------------------------------------------------------------/
  97. 函数名称:        Delay
  98. 功能描述:        延时函数
  99. 传    参:        int x
  100. 返 回 值:        无
  101. --------------------------------------------------------------*/
  102. unsigned char tmrbyte (void)        //读一个字节函数
  103. {   
  104.          unsigned int j;              
  105.          unsigned char i, u=0;      
  106.                
  107.          for (i=1; i<=8; i++)      
  108.          {
  109.                   GPGCON &= 0xfffffffc;
  110.                  GPGCON |= 0x01;            //GPG0设为输出
  111.                 
  112.                   GPGDAT &= 0xfffe;  
  113.                  u >>= 1;
  114.           
  115.                   GPGCON &= 0xfffffffc;     //设为输入口
  116.                   j = GPGDAT;
  117.                 if (j & 0x01)
  118.                           u |= 0x80;
  119.           
  120.                 dmsec(46);
  121.                 GPGDAT |= 0x01;  
  122.          }        
  123.          return (u);      
  124.   
  125. }

  126. /*-------------------------------------------------------------/
  127. 函数名称:        tmwbyte
  128. 功能描述:        写一个字节函数
  129. 传    参:        unsigned char dat
  130. 返 回 值:        无
  131. --------------------------------------------------------------*/         
  132. void tmwbyte (unsigned char dat)     //写一个字节函数
  133. {                       
  134.          unsigned char j;      
  135.          
  136.          GPGCON &= 0xfffffffc;
  137.          GPGCON |= 0x01;      
  138.          for (j=1; j<=8; j++)      
  139.          {
  140.                  GPGDAT &= 0xfffe;
  141.             dmsec(1);      
  142.             GPGDAT |= (dat & 0x01);  
  143.             dmsec(47);
  144.             GPGDAT |= 0x01;   
  145.             dat = dat >> 1;      
  146.         }        
  147. }

  148. /*-------------------------------------------------------------/
  149. 函数名称:        tmstart
  150. 功能描述:        发送ds1820 开始转换
  151. 传    参:        无
  152. 返 回 值:        无
  153. --------------------------------------------------------------*/
  154. void tmstart (void)   
  155. {                          
  156.         tmreset();             //复位   
  157.         dmsec(120);            //延时   
  158.         tmwbyte(0xcc);         //跳过序列号命令   
  159.         tmwbyte(0x44);         //发转换命令 44H,
  160. }         

  161. /*-------------------------------------------------------------/
  162. 函数名称:        tmrtemp
  163. 功能描述:        读取温度
  164. 传    参:        无
  165. 返 回 值:        无
  166. --------------------------------------------------------------*/
  167. void tmrtemp (void)
  168. {                          
  169.         unsigned char a,b;
  170.         tmreset();                      //复位     
  171.         dmsec(2000);                   //延时     
  172.         tmwbyte(0xcc);                  //跳过序列号命令   
  173.         tmwbyte(0xbe);                  //发送读取命令     
  174.         a = tmrbyte();                  //读取低位温度   
  175.         b = tmrbyte();                  //读取高位温度           
  176.        
  177.         sdata = a / 16 + b * 16;      //整数部分
  178.        
  179.         xiaoshu1 = (a&0x0f) * 10 / 16;    //小数第一位
  180.         xiaoshu2 = (a&0x0f) * 100 / 16 %10;//小数第二位
  181.         xiaoshu = xiaoshu1*10 + xiaoshu2; //小数两位
  182. }

  183. /*-------------------------------------------------------------/
  184. 函数名称:        zh
  185. 功能描述:       
  186. 传    参:        无
  187. 返 回 值:        无
  188. --------------------------------------------------------------*/
  189. void zh(void)
  190. {
  191.         unsigned int wdata;
  192.         wdata = sdata;
  193.         wd[0] = wdata / 10 + 0x30;
  194.         wd[1] = wdata % 10 + 0x30;
  195.         wd[2] = xiaoshu / 10 + 0x30;
  196.         wd[3] = xiaoshu % 10 + 0x30;
  197. }

  198. /*-------------------------------------------------------------/
  199. 函数名称:        DS18B20PRO
  200. 功能描述:       
  201. 传    参:        无
  202. 返 回 值:        无
  203. --------------------------------------------------------------*/
  204. void DS18B20PRO(void)         
  205. {   
  206.   tmstart();          //uart(10);     
  207.   dmsec(5);         //如果是不断地读取的话可以不延时
  208.   tmrtemp();         //读取温度,执行完毕温度将存于TMP
  209. }                                                                          

  210. /*-------------------------------------------------------------/
  211. 函数名称:        uart
  212. 功能描述:        串口函数用于发送温度值
  213. 传    参:        无
  214. 返 回 值:        无
  215. --------------------------------------------------------------*/      
  216. void uart(void)
  217. {       
  218.        
  219.     UFCON0 = 0x0;
  220.     UMCON0 = 0x0;
  221.     ULCON0 = 0x3;  
  222.     UCON0  = 0x245;  
  223.     UBRDIV0=( (int)(50000000/16/115200+0.5) -1 );
  224.          
  225.             while(!(UTRSTAT0 & 0x2));
  226.                 UTXH0='\n';
  227.                 while(!(UTRSTAT0 & 0x2));
  228.                 UTXH0='\r';
  229.                 while(!(UTRSTAT0 & 0x2));            
  230.                 UTXH0=wd[0];
  231.                 while(!(UTRSTAT0 & 0x2));
  232.                 UTXH0=wd[1];
  233.                 while(!(UTRSTAT0 & 0x2));
  234.                 UTXH0=46;
  235.                 while(!(UTRSTAT0 & 0x2));
  236.                 UTXH0=wd[2];
  237.                 while(!(UTRSTAT0 & 0x2));
  238.                 UTXH0=wd[3];
  239.                 while(!(UTRSTAT0 & 0x2));
  240.                 UTXH0=39;
  241.                 while(!(UTRSTAT0 & 0x2));
  242.                 UTXH0=67;
  243. }

  244. /*-------------------------------------------------------------/
  245. 函数名称:        Delay
  246. 功能描述:        延时函数
  247. 传    参:        int x
  248. 返 回 值:        无
  249. --------------------------------------------------------------*/
  250. void Delay(unsigned int x)        
  251. {
  252.   unsigned int i, j, k;
  253.   for(i=0; i<=x; i++)
  254.     for(j=0; j<0xff; j++)
  255.       for(k=0; k<0xff; k++);
  256. }
复制代码
点评回复 支持 反对

使用道具 举报

5

主题

21

帖子

30

积分

 楼主| 发表于 2013-10-9 16:05:46 | 显示全部楼层
飞凌-路飞 发表于 2013-10-9 13:58
不会吧楼主,您可以吧源码贴出来吗?

源码已贴;详细情况是这样的,Test.bin下载到分区运行,温度完全正常,而将实验源码中的温度程序编译成bin文件下载分区运行,就出现问题了,温度显示全部为0,好像18b20通讯不上
点评回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋| 飞凌嵌入式 ( 冀ICP备12004394号-1 )

GMT+8, 2024-12-22 15:34

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表