找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1024|回复: 3
打印 上一主题 下一主题
收起左侧

编译错误 怎么样DS18B20的测温与显示(整数加小数)仿真不出来

[复制链接]
跳转到指定楼层
楼主

  1. #include"reg52.h"
  2. sbit DQ=P1^4;
  3. void Delay_OneWire(unsigned int t)
  4. {
  5.         
  6.         unsigned char i;
  7.         while(t--){
  8.                 for(i=0;i<12;i++);
  9.         }
  10. }
  11. void Write_DS18B20(unsigned char dat)
  12. {
  13.         unsigned char i;
  14.         for(i=0;i<8;i++)
  15.         {
  16.                 DQ=0;
  17.                 DQ=dat&0x01;
  18.     Delay_OneWire(5);
  19.     DQ=1;
  20.     dat>>=1;               
  21.   }
  22.         Delay_OneWire(5);
  23. }
  24. unsigned char Read_DS18B20(void)
  25. {
  26.         unsigned char i;
  27.         unsigned char dat;
  28.   for(i=0;i<8;i++)
  29.         {
  30.                 DQ=0;
  31.     dat>>=1;
  32.                 DQ=1;
  33.                 if(DQ)
  34.                 {
  35.                         dat|=0x80;
  36.     }
  37.                 Delay_OneWire(5);
  38.   }
  39.         return dat;
  40. }
  41. //DS18B203õê¼»ˉ
  42. bit int_ds18b20(void)
  43. {
  44.         bit initflag=0;
  45.         DQ=1;
  46.         Delay_OneWire(12);
  47.         DQ=0;
  48.         Delay_OneWire(80);
  49.         DQ=1;
  50.         Delay_OneWire(10)
  51.         initflag=DQ;
  52.         Delay_OneWire(5);
  53.         return initflag;
  54. }
  55. unsigned char rd_temperature(void)
  56. {
  57.         unsigned char low,high;
  58.         char temp;
  59.         init_ds18b20();      
  60.         Write_DS18B20(0xCC);
  61.         Write_DS18B20(0x44);
  62.         Delay_OneWire(200);  
  63.         init_ds18b20();   
  64.         Write_DS18B20(0xCC);
  65.         Write_DS18B20(0xBE);
  66.         low=Read_DS18B20();  
  67.         high=Read_DS18B20();
  68.         temp=high<<4;        
  69.         temp|=(low>>4);      
  70.         return temp;
  71. }

  72. #include"reg52.h"
  73. #include"onewire.h"
  74. #include"absacc.h"
  75. unsigned char dspbuf[8]={10,10,10,10,10,10,0,0}
  76. unsigned char dspcom=0;
  77. unsigned char intr;  
  78. bit temper_flag=0;  
  79. code unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};

  80. void display(void);
  81. void main(void)      
  82. {
  83.         unsigned char temperature;
  84.   TMOD|=0x01;            
  85.   TH0=(65536-2000)/256;
  86.   TL0=(65536-2000)%256;
  87.   EA=1;
  88.   ET0=1;        
  89.   TR0=1;        
  90.   while(1);
  91.         {
  92.                 if(temper_flag)
  93.                 {
  94.                         temper_flag=0;
  95.                         temperature=rd_temperature();
  96.     }
  97.         
  98.                 dspbuf[6]=temperature/10;
  99.                 dspbuf[7]=temperature%10;
  100.   }
  101. }
  102. void_isr_timer_0(void) interrupt 1
  103. {
  104.         TH0=(65536-2000)/256;
  105.   TL0=(65536-2000)%256;
  106.         display();
  107.         if(++intr==100)
  108.         {
  109.                 intr=0;
  110.                 temper_flag=1;
  111.   }
  112. }
  113. void display(void)
  114. {
  115.         P2=((P2&0x1f)|0xE0);
  116.         P0=0Xff;
  117.         P2&=0x1f;
  118.         P2=((P2&0x1f)|0xC0);
  119.         P0=1<<dspcom;
  120.         P2&=0x1f;
  121.         P2=((P2&0x1f)|0XE0);
  122.         P0=tab[dspbuf[dspcom]];
  123.         P2&=0x1f;
  124.         if(++dspcom==8){
  125.                 dspcom=4;
  126.         }
  127. }
  128. unit rd_temperature(void)
  129. {
  130.         uchar low,high;
  131.         unit temp;
  132.         init_ds18b20();
  133.         Write_DS18B20(0xCC);
  134.         Write_DS18B20(0x44);
  135.         Delay_OneWrite(400);
  136.         init_ds18b20();
  137.         Write_DS18B20(0xCC);
  138.         Write_DS18B20(0xBE);
  139.         low=Read_DS18B20();
  140.         high=Read_DS18b20();
  141.         temp=high;
  142.         temp<<=8;
  143.         temp|=low;
  144.         temp=temp*(0.625);
  145.         return temp;
  146. }

  147. void display(void)
  148. {
  149.         P2=((P2&0x1f)|0xE0);
  150.         P0=0xff;
  151.         P2&=0x1f;
  152.         P2=((P2&0x1f)|0xC0);
  153.         P0=1<<dspcom;
  154.         P2&=0x1f;
  155.         P2=((P2&0x1f)|0xE0);
  156.         if(dspcom==6)
  157.         {
  158.                 P0=tab[dspbuf[dspcom]]&0x7f;
  159.   }
  160.         else
  161.                 P0=tab[dspbuf[dspcom]];
  162.           P2&=0x1f;
  163.         if(++dspcom==8){
  164.                 dspcom=5;
  165.         }
  166. }

复制代码





分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2021-11-27 06:59 | 只看该作者
DS18B20对时序要求比较苛刻,随意套用别人的代码不易成功。更不能随意增减“;”号和改变数据类型。

  1. #include"reg52.h"
  2. //#include"onewire.h"
  3. //#include"absacc.h"
  4. sbit DQ=P1^4;
  5. code unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
  6. unsigned char dspbuf[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
  7. unsigned char dspcom=0;
  8. unsigned char intr;  
  9. bit temper_flag=0;  

  10. bit init_ds18b20();
  11. void Write_DS18B20(unsigned char dat);
  12. unsigned char Read_DS18B20(void);
  13. unsigned int rd_temperature(void);
  14. void display(void);
  15. void Delay_OneWire(unsigned int t);

  16. void Delay_OneWire(unsigned int t)
  17. {      
  18.         while(t--);
  19. }

  20. void Write_DS18B20(unsigned char dat)
  21. {
  22.         unsigned char i;
  23.         for(i=0;i<8;i++)
  24.         {
  25.                 DQ=0;
  26.                 DQ=dat&0x01;
  27.                 Delay_OneWire(5);
  28.                 DQ=1;
  29.                 dat>>=1;               
  30.         }
  31.         Delay_OneWire(4);
  32. }
  33. unsigned char Read_DS18B20(void)
  34. {
  35.         unsigned char i;
  36.         unsigned char dat;
  37.         for(i=0;i<8;i++)
  38.         {
  39.                 DQ=0;
  40.                 dat>>=1;
  41.                 DQ=1;
  42.                 if(DQ)
  43.                 {
  44.                         dat|=0x80;
  45.                 }
  46.                 Delay_OneWire(4);
  47.         }
  48.         return dat;
  49. }

  50. bit init_ds18b20()
  51. {
  52.         bit initflag=0;
  53.         DQ=1;
  54.         Delay_OneWire(8);
  55.         DQ=0;
  56.         Delay_OneWire(80);
  57.         DQ=1;
  58.         Delay_OneWire(10);
  59.         initflag=DQ;
  60.         Delay_OneWire(20);
  61.         return initflag;
  62. }

  63. unsigned int rd_temperature(void)
  64. {
  65.         unsigned char low,high;
  66.         unsigned int temp;
  67.         init_ds18b20();      
  68.         Write_DS18B20(0xCC);
  69.         Write_DS18B20(0x44);
  70.         Delay_OneWire(2000);  
  71.         init_ds18b20();   
  72.         Write_DS18B20(0xCC);
  73.         Write_DS18B20(0xBE);
  74.         low=Read_DS18B20();  
  75.         high=Read_DS18B20();
  76.         temp=high<<8;        
  77.         temp|=low;      
  78.         return temp;
  79. }

  80. void main(void)      
  81. {
  82.         unsigned int temperature;
  83.         unsigned char tempH,tempL;
  84.         TMOD|=0x01;            
  85.         TH0=(65536-2000)/256;
  86.         TL0=(65536-2000)%256;
  87.         EA=1;
  88.         ET0=1;               
  89.         rd_temperature();
  90.         Delay_OneWire(0xffff);
  91.         TR0=1;
  92.         while(1)
  93.         {
  94.                 if(temper_flag)
  95.                 {
  96.                         temper_flag=0;
  97.                         temperature=rd_temperature();
  98.                         tempH=temperature>>4;
  99.                         tempL=(temperature&0x0f)*0.625;
  100.                         dspbuf[5]=tab[tempH/10];
  101.                         dspbuf[6]=tab[tempH%10]&0x7f;
  102.                         dspbuf[7]=tab[tempL];
  103.                 }
  104.         }
  105. }

  106. void _isr_timer_0(void) interrupt 1
  107. {
  108.         TH0=(65536-2000)/256;
  109.         TL0=(65536-2000)%256;
  110.         display();
  111.         if(++intr==100)
  112.         {
  113.                 intr=0;
  114.                 temper_flag=1;
  115.         }
  116. }

  117. void display(void)
  118. {
  119.         P0=0xff;
  120.         P2=0x01<<dspcom;
  121.         P0=dspbuf[dspcom];
  122.         dspcom=++dspcom%8;
  123. }
  124. /*
  125. unsigned char rd_temperature(void)
  126. {
  127.         uchar low,high;
  128.         unit temp;
  129.         init_ds18b20();
  130.         Write_DS18B20(0xCC);
  131.         Write_DS18B20(0x44);
  132.         Delay_OneWrite(400);
  133.         init_ds18b20();
  134.         Write_DS18B20(0xCC);
  135.         Write_DS18B20(0xBE);
  136.         low=Read_DS18B20();
  137.         high=Read_DS18b20();
  138.         temp=high;
  139.         temp<<=8;
  140.         temp|=low;
  141.         temp=temp*(0.625);
  142.         return temp;
  143. }

  144. void display(void)
  145. {
  146.         P2=((P2&0x1f)|0xE0);
  147.         P0=0xff;
  148.         P2&=0x1f;
  149.         P2=((P2&0x1f)|0xC0);
  150.         P0=1<<dspcom;
  151.         P2&=0x1f;
  152.         P2=((P2&0x1f)|0xE0);
  153.         if(dspcom==6)
  154.         {
  155.                 P0=tab[dspbuf[dspcom]]&0x7f;
  156.         }
  157.         else
  158.                 P0=tab[dspbuf[dspcom]];
  159.         P2&=0x1f;
  160.         if(++dspcom==8)
  161.         {
  162.                 dspcom=5;
  163.         }
  164. }*/

复制代码







回复

使用道具 举报

板凳
ID:985176 发表于 2021-11-27 09:26 | 只看该作者
wulin 发表于 2021-11-27 06:59
DS18B20对时序要求比较苛刻,随意套用别人的代码不易成功。更不能随意增减“;”号和改变数据类型。

原来是这样 谢谢呀
回复

使用道具 举报

地板
ID:397211 发表于 2021-11-27 16:24 | 只看该作者
temp=temp*(0.625);要加几位小数就扩大多少倍就行了,扩大10倍就是1位小数。。。。。。。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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