KEIL+PROTEUS联调DS18B20,编译通过,显示温度值什么全是0

[复制链接]
1352|4
 楼主| pyl77434616 发表于 2015-6-11 14:47 | 显示全部楼层 |阅读模式
本帖最后由 pyl77434616 于 2015-6-11 15:20 编辑

  1. /*************************´Ë²¿·ÖΪ18B20µÄÇý¶¯³ÌÐò*************************************/
  2. #include <reg52.H>
  3. #include <intrins.h>
  4. #define  NOP()   _nop_()   /* ¶¨Òå¿ÕÖ¸Áî */
  5. #define  _Nop()  _nop_()   /*¶¨Òå¿ÕÖ¸Áî*/

  6. //else IO
  7. sbit    LS138A=P2^2;       //¹Ü½Å¶¨Òå
  8. sbit    LS138B=P2^3;
  9. sbit    LS138C=P2^4;
  10. sbit          D1 =P1^5;
  11. sbit    D18B20=P3^7;

  12. //´Ë±íΪ LED µÄ×ÖÄ£, ¹²ÒõÊýÂë¹Ü 0-9  -
  13. unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
  14. unsigned long  LedOut[4],LedNumVal;

  15. void TempDelay (unsigned char  us);
  16. void Init18b20 (void);
  17. void WriteByte (unsigned char  wr);  //µ¥×Ö½ÚдÈë
  18. void read_bytes (unsigned char  j);
  19. unsigned char CRC (unsigned char j);
  20. void GemTemp (void);
  21. void Config18b20 (void);
  22. void ReadID (void);
  23. void TemperatuerResult(void);
  24. void GetTemp(void);                                                           //ÉùÃ÷ÒýÓÃÍⲿº¯Êý
  25. unsigned int   Temperature;                      // ÉùÃ÷ÒýÓÃÍⲿ±äÁ¿
  26. void delay(unsigned int i);

  27. bit  flag;
  28. unsigned char  temp_buff[9]; //´æ´¢¶ÁÈ¡µÄ×Ö½Ú£¬read scratchpadΪ9×Ö½Ú£¬read rom IDΪ8×Ö½Ú
  29. unsigned char  id_buff[8];
  30. unsigned char  *p,TIM;
  31. unsigned char  crc_data;


  32. unsigned char code CrcTable [256]={
  33. 0,  94, 188,  226,  97,  63,  221,  131,  194,  156,  126,  32,  163,  253,  31,  65,
  34. 157,  195,  33,  127,  252,  162,  64,  30,  95,  1,  227,  189,  62,  96,  130,  220,
  35. 35,  125,  159,  193,  66,  28,  254,  160,  225,  191,  93,  3,  128,  222,  60,  98,
  36. 190,  224,  2,  92,  223,  129,  99,  61,  124,  34,  192,  158,  29,  67,  161,  255,
  37. 70,  24,  250,  164,  39,  121,  155,  197,  132,  218,  56,  102,  229,  187,  89,  7,
  38. 219,  133, 103,  57,  186,  228,  6,  88,  25,  71,  165,  251,  120,  38,  196,  154,
  39. 101,  59, 217,  135,  4,  90,  184,  230,  167,  249,  27,  69,  198,  152,  122,  36,
  40. 248,  166, 68,  26,  153,  199,  37,  123,  58,  100,  134,  216,  91,  5,  231,  185,
  41. 140,  210, 48,  110,  237,  179,  81,  15,  78,  16,  242,  172,  47,  113,  147,  205,
  42. 17,  79,  173,  243,  112,  46,  204,  146,  211,  141,  111,  49,  178,  236,  14,  80,
  43. 175,  241, 19,  77,  206,  144,  114,  44,  109,  51,  209,  143,  12,  82,  176,  238,
  44. 50,  108,  142,  208,  83,  13,  239,  177,  240,  174,  76,  18,  145,  207,  45,  115,
  45. 202,  148, 118,  40,  171,  245,  23,  73,  8,  86,  180,  234,  105,  55,  213, 139,
  46. 87,  9,  235,  181,  54,  104,  138,  212,  149,  203,  41,  119,  244,  170,  72,  22,
  47. 233,  183,  85,  11,  136,  214,  52,  106,  43,  117,  151,  201,  74,  20,  246,  168,
  48. 116,  42,  200,  150,  21,  75,  169,  247,  182,  232,  10,  84,  215,  137,  107,  53};
  49. //
  50. /************************************************************
  51. *Function:ÑÓʱ´¦Àí
  52. *parameter:
  53. *Return:
  54. *Modify:
  55. *************************************************************/
  56. void TempDelay (unsigned char  us)
  57. {
  58.         while(us--);
  59. }

  60. /************************************************************
  61. *Function:18B20³õʼ»¯
  62. *parameter:
  63. *Return:
  64. *Modify:
  65. *************************************************************/
  66. void Init18b20 (void)
  67. {
  68.         D18B20=1;
  69.         _nop_();
  70.         D18B20=0;
  71.         TempDelay(80);   //delay 530 uS//80
  72.         _nop_();
  73.         D18B20=1;
  74.         TempDelay(14);   //delay 100 uS//14
  75.         _nop_();
  76.         _nop_();
  77.         _nop_();
  78.         
  79.         if(D18B20==0)
  80.                 flag = 1;   //detect 1820 success!
  81.         else
  82.                 flag = 0;    //detect 1820 fail!
  83.         TempDelay(20);       //20
  84.         _nop_();
  85.         _nop_();
  86.         D18B20 = 1;
  87. }

  88. /************************************************************
  89. *Function:Ïò18B20дÈëÒ»¸ö×Ö½Ú
  90. *parameter:
  91. *Return:
  92. *Modify:
  93. *************************************************************/
  94. void WriteByte (unsigned char  wr)  //µ¥×Ö½ÚдÈë
  95. {
  96.         unsigned char  i;
  97.         for (i=0;i<8;i++)
  98.         {
  99.                 D18B20 = 0;
  100.                 _nop_();
  101.                 D18B20=wr&0x01;
  102.                 TempDelay(3);   //delay 45 uS //5
  103.                 _nop_();
  104.                 _nop_();
  105.                 D18B20=1;
  106.                 wr >>= 1;
  107.         }
  108. }

  109. /************************************************************
  110. *Function:¶Á18B20µÄÒ»¸ö×Ö½Ú
  111. *parameter:
  112. *Return:
  113. *Modify:
  114. *************************************************************/
  115. unsigned char ReadByte (void)     //¶ÁÈ¡µ¥×Ö½Ú
  116. {
  117.         unsigned char  i,u=0;
  118.         for(i=0;i<8;i++)
  119.         {
  120.                 D18B20 = 0;
  121.                 u >>= 1;
  122.                 D18B20 = 1;
  123.                 if(D18B20==1)
  124.                 u |= 0x80;
  125.                 TempDelay (2);
  126.                 _nop_();
  127.         }
  128.         return(u);
  129. }

  130. /************************************************************
  131. *Function:¶Á18B20
  132. *parameter:
  133. *Return:
  134. *Modify:
  135. *************************************************************/
  136. void read_bytes (unsigned char  j)
  137. {
  138.          unsigned char  i;
  139.          for(i=0;i<j;i++)
  140.          {
  141.                   *p = ReadByte();
  142.                   p++;
  143.          }
  144. }

  145. /************************************************************
  146. *Function:CRCУÑé
  147. *parameter:
  148. *Return:
  149. *Modify:
  150. *************************************************************/
  151. unsigned char CRC (unsigned char j)
  152. {
  153.            unsigned char  i,crc_data=0;
  154.           for(i=0;i<j;i++)  //²é±íУÑé
  155.             crc_data = CrcTable[crc_data^temp_buff[i]];
  156.     return (crc_data);
  157. }

  158. /************************************************************
  159. *Function:¶ÁȡζÈ
  160. *parameter:
  161. *Return:
  162. *Modify:
  163. *************************************************************/
  164. void GemTemp (void)
  165. {
  166.    read_bytes (9);
  167.    if (CRC(9)==0) //УÑéÕýÈ·
  168.    {
  169.             Temperature = temp_buff[1]*0x100 + temp_buff[0];
  170. //            Temperature *= 0.625;
  171.                 Temperature /= 16;
  172.                 TempDelay(1);
  173.     }
  174. }

  175. /************************************************************
  176. *Function:ÄÚ²¿ÅäÖÃ
  177. *parameter:
  178. *Return:
  179. *Modify:
  180. *************************************************************/
  181. void Config18b20 (void)  //ÖØÐÂÅäÖñ¨¾¯ÏÞ¶¨ÖµºÍ·Ö±æÂÊ
  182. {
  183.      Init18b20();
  184.      WriteByte(0xcc);  //skip rom
  185.      WriteByte(0x4e);  //write scratchpad
  186.      WriteByte(0x19);  //ÉÏÏÞ
  187.      WriteByte(0x1a);  //ÏÂÏÞ
  188.      WriteByte(0x7f);     //set 12 bit (0.125)
  189.      Init18b20();
  190.      WriteByte(0xcc);  //skip rom
  191.      WriteByte(0x48);  //±£´æÉ趨ֵ
  192.      Init18b20();
  193.      WriteByte(0xcc);  //skip rom
  194.      WriteByte(0xb8);  //»Øµ÷É趨ֵ
  195. }

  196. /************************************************************
  197. *Function:¶Á18B20ID
  198. *parameter:
  199. *Return:
  200. *Modify:
  201. *************************************************************/
  202. void ReadID (void)//¶ÁÈ¡Æ÷¼þ id
  203. {
  204.         Init18b20();
  205.         WriteByte(0x33);  //read rom
  206.         read_bytes(8);
  207. }

  208. /************************************************************
  209. *Function:18B20IDÈ«´¦Àí
  210. *parameter:
  211. *Return:
  212. *Modify:
  213. *************************************************************/
  214. void TemperatuerResult(void)
  215. {
  216.           p = id_buff;
  217.           ReadID();
  218.           Config18b20();
  219.         Init18b20 ();
  220.         WriteByte(0xcc);   //skip rom
  221.         WriteByte(0x44);   //Temperature convert

  222.         Init18b20 ();
  223.         WriteByte(0xcc);   //skip rom
  224.         WriteByte(0xbe);   //read Temperature
  225.         p = temp_buff;
  226.         GemTemp();
  227. }


  228. void GetTemp()
  229. {      
  230.      if(TIM==100) //ÿ¸ô 1000ms ¶ÁȡζÈ
  231.         {  TIM=0;
  232.            TemperatuerResult();
  233.         }

  234. }

  235. /*************************************
  236. [ t1 (10ms)ÖжÏ] ÖжÏ
  237. *************************************/
  238. void T1zd(void) interrupt 3
  239. {
  240.    TH1 = 0xD8;    //10
  241.    TL1 = 0xF0;
  242.    TIM++;

  243. }

  244. void system_Ini()
  245. {
  246.     TMOD|= 0x11;
  247.     TH1 = 0xD8;    //10
  248.     TL1 = 0xF0;        
  249.         IE = 0x8A;        
  250.     TR1  = 1;

  251. }

  252. //ÑÓʱ³ÌÐò
  253. void delay(unsigned int i)
  254. {
  255.     char j;
  256.     for(i; i > 0; i--)
  257.         for(j = 200; j > 0; j--);
  258. }

  259. main()
  260. {
  261.         unsigned char i;
  262.         system_Ini();
  263.         while(1)
  264.                 {
  265.                         GetTemp();
  266.                         LedNumVal=Temperature;      //°Ñʵ¼ÊζÈË͵½LedNumVal±äÁ¿ÖÐ
  267.                         LedOut[0]=Disp_Tab[LedNumVal%10000/1000];
  268.                 LedOut[1]=Disp_Tab[LedNumVal%1000/100];
  269.                 LedOut[2]=Disp_Tab[LedNumVal%100/10];         //ʮλ
  270.                 LedOut[3]=Disp_Tab[LedNumVal%10];    //¸öλ
  271.                         for(i=0; i<4; i++)
  272.                                   {               
  273.                                          P0 = LedOut[i] ;                                            
  274.                                         switch(i)                                          
  275.                                  {                      //138ÒëÂë
  276.                                                 case 0:LS138A=0; LS138B=0; LS138C=0; break;         
  277.                                     case 1:LS138A=1; LS138B=0; LS138C=0; break;                     
  278.                                     case 2:LS138A=0; LS138B=1; LS138C=0; break;
  279.                                     case 3:LS138A=1; LS138B=1; LS138C=0; break;
  280.                                  }
  281.                                         delay(300);
  282.                                   }
  283.                         P0=0;
  284.                 }
  285. }


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
dirtwillfly 发表于 2015-6-11 22:22 | 显示全部楼层
用实物试试吧,有时候PROTEUS比较坑
zhaoyu2005 发表于 2015-6-12 07:47 | 显示全部楼层
编译通过只表示没有语法方面的错误,其他问题编译器可不知道。另外如LS所说,proteus有时比较坑,数码管动态扫描就属于此列。液晶屏效果还可以
 楼主| pyl77434616 发表于 2015-6-12 08:37 | 显示全部楼层
dirtwillfly 发表于 2015-6-11 22:22
用实物试试吧,有时候PROTEUS比较坑

回家使用板子直接下载程序,通过,确实比较坑,谢谢。
dirtwillfly 发表于 2015-6-12 08:41 | 显示全部楼层
pyl77434616 发表于 2015-6-12 08:37
回家使用板子直接下载程序,通过,确实比较坑,谢谢。

客气
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

5

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部