找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1569|回复: 1
收起左侧

这个单片机温度控制系统为什么不行?只能显示-0.1c,数值都不变

[复制链接]
ID:478396 发表于 2019-3-11 15:06 | 显示全部楼层 |阅读模式
我用下面的程序去proteus仿真,只能显示-0.1c,然后怎么动它数值都不变。这是哪里错了?


  1. /***************   writer:shopping.w   ******************/
  2. #include <reg52.h>
  3. #include <intrins.h>
  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. #define delayNOP() {_nop_();_nop_();_nop_();_nop_();}

  7. sbit DQ = P3^0;
  8. sbit LCD_RS = P2^0;
  9. sbit LCD_RW = P2^1;
  10. sbit LCD_EN = P2^2;

  11. uchar code Temp_Disp_Title[]={"Current Temp : "};
  12. uchar Current_Temp_Display_Buffer[]={" TEMP:   "};

  13. uchar code Temperature_Char[8] =
  14. {
  15.          0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00
  16. };

  17. uchar code df_Table[]=
  18. {
  19.          0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9
  20. };

  21. uchar CurrentT = 0;
  22. uchar Temp_Value[]={0x00,0x00};
  23. uchar Display_Digit[]={0,0,0,0};
  24. bit DS18B20_IS_OK = 1;

  25. void DelayXus(uint x)
  26. {
  27.          uchar i;
  28.         while(x--)
  29.         {
  30.                  for(i=0;i<200;i++);
  31.         }
  32. }

  33. bit LCD_Busy_Check()
  34. {
  35.          bit result;
  36.         LCD_RS = 0;
  37.         LCD_RW = 1;
  38.         LCD_EN = 1;
  39.         delayNOP();
  40.         result = (bit)(P0&0x80);
  41.         LCD_EN=0;
  42.         return result;
  43. }

  44. void Write_LCD_Command(uchar cmd)
  45. {
  46.         while(LCD_Busy_Check());
  47.         LCD_RS = 0;
  48.         LCD_RW = 0;
  49.         LCD_EN = 0;
  50.         _nop_();
  51.         _nop_();
  52.         P0 = cmd;
  53.         delayNOP();
  54.         LCD_EN = 1;
  55.         delayNOP();
  56.         LCD_EN = 0;
  57. }

  58. void Write_LCD_Data(uchar dat)
  59. {
  60.         while(LCD_Busy_Check());
  61.         LCD_RS = 1;
  62.         LCD_RW = 0;
  63.         LCD_EN = 0;
  64.         P0 = dat;
  65.         delayNOP();
  66.         LCD_EN = 1;
  67.         delayNOP();
  68.         LCD_EN = 0;
  69. }

  70. void LCD_Initialise()
  71. {
  72.          Write_LCD_Command(0x01);
  73.         DelayXus(5);
  74.         Write_LCD_Command(0x38);
  75.         DelayXus(5);
  76.         Write_LCD_Command(0x0c);
  77.         DelayXus(5);
  78.         Write_LCD_Command(0x06);
  79.         DelayXus(5);        
  80. }

  81. void Set_LCD_POS(uchar pos)
  82. {
  83.          Write_LCD_Command(pos|0x80);        
  84. }

  85. void Delay(uint x)
  86. {
  87.          while(--x);
  88. }

  89. uchar Init_DS18B20()
  90. {
  91.          uchar status;
  92.         DQ = 1;
  93.         Delay(8);
  94.         DQ = 0;
  95.         Delay(90);
  96.         DQ = 1;
  97.         Delay(8);
  98.         DQ = 1;
  99.         return status;
  100. }

  101. uchar ReadOneByte()
  102. {
  103.          uchar i,dat=0;
  104.         DQ = 1;
  105.         _nop_();
  106.         for(i=0;i<8;i++)
  107.         {
  108.                  DQ = 0;
  109.                 dat >>= 1;
  110.                 DQ = 1;
  111.                 _nop_();
  112.                 _nop_();
  113.                 if(DQ)
  114.                         dat |= 0X80;
  115.                 Delay(30);
  116.                 DQ = 1;
  117.         }
  118.         return dat;
  119. }

  120. void WriteOneByte(uchar dat)
  121. {
  122.          uchar i;
  123.         for(i=0;i<8;i++)
  124.         {
  125.                  DQ = 0;
  126.                 DQ = dat& 0x01;
  127.                 Delay(5);
  128.                 DQ = 1;
  129.                 dat >>= 1;
  130.         }
  131. }

  132. void Read_Temperature()
  133. {
  134.          if(Init_DS18B20()==1)
  135.                 DS18B20_IS_OK=0;
  136.         else
  137.         {
  138.                 WriteOneByte(0xcc);
  139.                 WriteOneByte(0x44);
  140.                 Init_DS18B20();
  141.                 WriteOneByte(0xcc);
  142.                 WriteOneByte(0xbe);
  143.                 Temp_Value[0] = ReadOneByte();
  144.                 Temp_Value[1] = ReadOneByte();
  145.                 DS18B20_IS_OK=1;        
  146.         }        
  147. }

  148. void Display_Temperature()
  149. {
  150.          uchar i;
  151.         uchar t = 150, ng = 0;
  152.         if((Temp_Value[1]&0xf8)==0xf8)
  153.         {
  154.                  Temp_Value[1] = ~Temp_Value[1];
  155.                 Temp_Value[0] = ~Temp_Value[0]+1;
  156.                 if(Temp_Value[0]==0x00)
  157.                         Temp_Value[1]++;
  158.                 ng = 1;        
  159.         }
  160.         Display_Digit[0] = df_Table[Temp_Value[0]&0x0f];
  161.         CurrentT = ((Temp_Value[0]&0xf0)>>4) | ((Temp_Value[1]&0x07)<<4);
  162.         Display_Digit[3] = CurrentT/100;
  163.         Display_Digit[2] = CurrentT%100/10;
  164.         Display_Digit[1] = CurrentT%10;
  165.         Current_Temp_Display_Buffer[11] = Display_Digit[0] + '0';
  166.         Current_Temp_Display_Buffer[10] = '.';
  167.         Current_Temp_Display_Buffer[9]  = Display_Digit[1] + '0';
  168.         Current_Temp_Display_Buffer[8]  = Display_Digit[2] + '0';
  169.         Current_Temp_Display_Buffer[7]  = Display_Digit[3] + '0';
  170.         if(Display_Digit[3] == 0)
  171.                 Current_Temp_Display_Buffer[7]  = ' ';
  172.         if(Display_Digit[2] == 0&&Display_Digit[3]==0)
  173.                 Current_Temp_Display_Buffer[8]  = ' ';
  174.         if(ng)
  175.         {
  176.                  if(Current_Temp_Display_Buffer[8]  == ' ')
  177.                         Current_Temp_Display_Buffer[8]  = '-';
  178.                 else if(Current_Temp_Display_Buffer[7]  == ' ')
  179.                         Current_Temp_Display_Buffer[7]  = '-';
  180.                 else
  181.                         Current_Temp_Display_Buffer[6]  = '-';
  182.         }
  183.         Set_LCD_POS(0x00);
  184.         for(i=0;i<16;i++)
  185.         {
  186.                 Write_LCD_Data(Temp_Disp_Title[i]);         
  187.         }
  188.         Set_LCD_POS(0x40);
  189.         for(i=0;i<16;i++)
  190.         {
  191.                 Write_LCD_Data(Current_Temp_Display_Buffer[i]);         
  192.         }               
  193.         Set_LCD_POS(0x4d);
  194.         Write_LCD_Data(0x00);
  195.         Set_LCD_POS(0x4e);
  196.         Write_LCD_Data('C');
  197. }

  198. void main()
  199. {
  200.          LCD_Initialise();
  201.         Read_Temperature();
  202.         Delay(50000);
  203.         Delay(50000);
  204.         while(1)
  205.         {
  206.                  Read_Temperature();
  207.                 if(DS18B20_IS_OK)
  208.                         Display_Temperature();
  209.                 DelayXus(100);               
  210.         }

  211. }
复制代码





回复

使用道具 举报

ID:1 发表于 2019-3-11 23:07 | 显示全部楼层
您这个问题给的信息不全,估计是没人能回答得了的,先转移到冷门区了,自行点击编辑按钮补充一下吧,审核员会帮你重新转到热门问答区的
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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