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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

大佬們,我寫了個程序不知道為什么小數部分不根據18b20改變其他位數都沒問題,大佬...

[復制鏈接]
跳轉到指定樓層
樓主
  1. #include<reg52.h>                                                
  2. #include<math.h>                                       
  3. #define uint unsigned int                                
  4. #define uchar unsigned char                                
  5. sbit lcden=P2^0;                                       
  6. sbit lcdrw=P2^1;
  7. sbit lcdrs=P2^2;                                       
  8. sbit DQ = P2^3;                        
  9. sbit s1=P1^0;                                                
  10. sbit s2=P1^1;                                                        
  11. sbit s3=P1^2;                                                        
  12. sbit D1=P3^4;            
  13. sbit D2=P3^5;            
  14. uchar num,fig,s1num,figh,figl,t,temp_value;
  15. char h,l;                                                        
  16. void delay(uint z);                                       
  17. void init();                                                
  18. void write_com(uchar com);                        
  19. void write_data(uchar date);                        
  20. void keyscan();                                                  
  21. void write_hl(uchar add,char date);           
  22. void write_temp_value(uchar add,char date);        
  23. void delay_18B20(unsigned int i);        
  24. void Init_DS18B20(void);                        
  25. unsigned char ReadOneChar(void);        
  26. void WriteOneChar(uchar dat);               
  27. void ReadTemp(void);                                
  28. void comp();
  29. void string(uchar ad,uchar *s);
  30. void main()
  31. {
  32.         init();                                                        
  33.         Init_DS18B20();                                       
  34.         while(1)                                                
  35.         { if(s1==0||s1num>=1)
  36.                 {        keyscan();                                
  37.                 }
  38.         else{        ReadTemp();                                
  39.                         write_temp_value(0,temp_value);
  40.                 }
  41.                 comp();               
  42.         }
  43. }

  44. void delay(uint z)                                       
  45. {
  46.         uint x,y;
  47.         for(x=z;x>0;x--)
  48.         for(y=110;y>0;y--);
  49. }
  50. void string(uchar ad,uchar *s)
  51. {
  52.    write_com(ad);
  53.    while(*s>0)
  54.    {
  55.              write_data(*s++);
  56.           delay(100);
  57.    }
  58. }


  59. void init()                                                //LCD初始化程序
  60. {   lcden=0;
  61.           lcdrw=0;
  62.         write_com(0x38);                         //設置16x2 顯示5x7 點陣,8 位數據接口
  63.         write_com(0x0c);                 //設置開始顯示不顯示光標
  64.         write_com(0x06);                         //寫一個字符后地址指針加1
  65.         write_com(0x01);                         //顯示清零數據指針清零
  66.         write_com(0x80);                         //將數據指針第一行第一個字處,
  67.         
  68.         write_com(0x89);                         //定義當前指針位置
  69.         string(0x89,"H:+28.6");                                 
  70.         write_com(0x80+9+0x40);                  //定義當前指針位置
  71.         string(0x80+9+0x40,"L:+15.3");                                
  72.         h=28.6;                  //h=+20
  73.         l=15.3;                                                     //l=+10
  74.         D1=1;
  75.         D2=1;
  76.         figh=0;                                                         //給正確初始值,便于上電比較
  77.         figl=1;                                                         //給正確初始值,便于上電比較
  78. }
  79. void write_com(uchar com)                //寫命令程序
  80. {        lcdrs=0;                                         
  81.         P0=com;                                         
  82.         delay(5);                                         
  83.         lcden=1;                                         
  84.         delay(5);                                       
  85.         lcden=0;                                 
  86. }
  87. void write_data(uchar date)                //寫數據程序
  88. {        lcdrs=1;                                         //設置為寫入數據
  89.         P0=date;                                         //將數據賦給P0 口
  90.         delay(5);                                         //延時
  91.         lcden=1;                                         //打開LCD使能,輸入一個高脈沖
  92.         delay(5);                                         //延時
  93.         lcden=0;                                         //置低完成高脈沖
  94. }

  95. void write_temp_value(uchar add,char date)         //讀取的溫度值在LCD上顯示程序
  96. {        uchar bai,shi,ge,min;
  97.         bai=date*10/1000;
  98.         shi=date*10/100%10;                                 
  99.         ge=date*10/10%10;
  100.         min=date*10%10;                                                 //分離出百,十,個位數
  101.         if((bai|shi|ge)==0)                                 //如果百十都等于0
  102.         shi=0x70;                                                 //十賦值0x70,以便十位寫入空字符,write_data(0x30+shi),參考1602字符圖形碼
  103.         if(bai==0)
  104.         bai=0x70;
  105.         write_com(0x80+add);                     //設置當前光標位置,準備寫數據
  106.         
  107.         if(fig==0&&shi!=0x70)                         //如果溫度為負且十位不等于0(如果十位等于0,shi=0x70)
  108.         { write_data('-');                                 //在百位寫入負號
  109.           write_data(0x40+shi);                        //寫入十位數據
  110.         }
  111.         if(fig==0&&shi==0x70)                         //如果溫度為負且百十位都等于0
  112.         { write_data(0x30+0x70);                 //在百位寫入一個空字符
  113.           write_data('-');                                 //在十位寫入負號
  114.         }
  115.         if(fig==1)write_data(0x30+bai);  //溫度正,寫入百位數據
  116.         if(fig==1)write_data(0x30+shi);         //溫度正,寫入十位數據
  117.         if(fig==1)write_data(0x30+ge);         //寫入個位數據
  118.         write_data('.');
  119.         write_data(0x30+min);                                  //寫小數點        
  120.         write_data(0xdf);                                 //寫入°
  121.         write_data('C');                                 //寫入C
  122.         
  123. }
  124. void write_hl(uchar add,char date)         //設置的高低溫度值在LCD上顯示程序
  125. {        uchar bai,shi,ge,min;
  126.         bai=date/1000;
  127.         shi=date/100%10;                                 
  128.         ge=date/10%10;
  129.         min=date%10;                                                 //分離出百,十,個位數
  130.         write_com(0x80+add);                     //設置當前光標位置,準備寫數據
  131.         
  132.         if(t==1&&shi!=0)                             //如果溫度為負且十位不等于0(如果十位等于0,shi=0x70)            負數:百位第1種情況,寫-
  133.                 { write_data('-');}                         //在百位寫入負號
  134.         if(t==1&&shi==0)                             //如果溫度為負且百十位都等于0                                                    負數:百位第2種情況,寫空
  135.                 { write_data(0x30+0x70);         //在百位寫入一個空字符
  136.                     write_data('-');                         //在十位寫入負號                                                                            負數:十位第1種情況,寫-
  137.                 }
  138.         if(t==1&&shi!=0)                             //如果溫度為負且十不等于0                                                                負數:十位第2種情況,寫數                                                
  139.             {write_data(0x30+shi);}                 //在十位寫入數據
  140.         if(t==0&&bai==0&&shi!=0)                 //否則溫度為正,如果bai=0且shi!=0                                                  正數:百位第1種情況,寫+
  141.                 {write_data('+');}                         //在百位寫入+
  142.         if(t==0&&bai==0&&shi==0)                 //否則溫度為正,如果bai=0且shi=0                                                           正數:百位第2種情況,寫空
  143.                 {write_data(0x30+0x70);}         //在百位寫入一個空字符
  144.         if(t==0&&bai!=0)        
  145.                 {write_data(0x30+bai);}      //否則百位為正不等于0,寫入百位數                                                           正數:百位第3種情況,寫數
  146.         if(t==0&&bai==0&&shi==0&&ge!=0)         //如果百十等于0,個不等于0                                                                           正數:十位第1種情況,寫+
  147.                 {write_data('+');}                         //在十位寫入+
  148.         if(t==0&&bai==0&&shi==0&&ge==0)         //如果百十個都等于0
  149.             {write_data(' ');}                     //在十位寫入空字符                                                                                           正數:十位第2種情況,寫空
  150.         if(t==0&&shi!=0)        
  151.                 {write_data(0x30+shi);}        
  152.                 write_data(0x30+min);     //在十位寫入數                                                                                                   正數:十位第3種情況,寫數                    
  153.         write_data(0x30+ge);                         //寫入個位數據
  154. }

  155. /***********ds18b20子程序*************************/

  156. /***********ds18b20延遲子函數(晶振12MHz )*******/

  157. void delay_18B20(unsigned int i)
  158. {
  159.         while(i--);
  160. }



  161. void Init_DS18B20(void)                          //ds18b20初始化函數
  162. {
  163.          unsigned char x=0;
  164.          DQ = 1;         
  165.          delay_18B20(8);  
  166.          DQ = 0;         
  167.          delay_18B20(80);
  168.          DQ = 1;         
  169.          delay_18B20(14);
  170.          x=DQ;            
  171.          delay_18B20(20);
  172. }



  173. unsigned char ReadOneChar(void)                  // ds18b20讀一個字節
  174. {
  175.         uchar i=0;
  176.         uchar dat = 0;
  177.         for (i=8;i>0;i--)
  178.          {
  179.                   DQ = 0; // 給脈沖信號
  180.                   dat>>=1;
  181.                   DQ = 1; // 給脈沖信號
  182.                   if(DQ)
  183.                   dat|=0x80;
  184.                   delay_18B20(4);
  185.          }
  186.          return(dat);
  187. }



  188. void WriteOneChar(uchar dat)                          //ds18b20寫一個字節  
  189. {                                                                          
  190.          unsigned char i=0;
  191.          for (i=8; i>0; i--)
  192.          {
  193.                   DQ = 0;
  194.                  DQ = dat&0x01;
  195.             delay_18B20(5);
  196.                  DQ = 1;
  197.             dat>>=1;
  198. }
  199. }



  200. void ReadTemp(void)                                                         //讀取ds18b20當前溫度
  201. {
  202.         unsigned char a=0;
  203.         unsigned char b=0;
  204.         unsigned char t=0;

  205.         Init_DS18B20();
  206.         WriteOneChar(0xCC);            
  207.         WriteOneChar(0x44);

  208.         delay_18B20(100);      

  209.         Init_DS18B20();
  210.         WriteOneChar(0xCC);         
  211.         WriteOneChar(0xBE);

  212.         delay_18B20(100);

  213.         a=ReadOneChar();   
  214.         b=ReadOneChar();           
  215. //        a=0xff;                                
  216. //        b=0xfe;
  217.         temp_value=b<<4;                  
  218.         temp_value+=(a&0xf0)>>4;
  219.         fig=0x01;                                 
  220.         if(temp_value>0x7f)                 
  221.         {fig=0;                                       
  222.          a=~a+1;                                 
  223.          b=~b;
  224.          temp_value=b<<4;                 
  225.          temp_value+=(a&0xf0)>>4;
  226.          temp_value*=0.625;
  227.         }            
  228. }

  229. void keyscan()                                                 //按鍵掃描
  230. {        if(s1==0)                                                 //如果s1按下,執行下面程序
  231.         {   delay(5);                                         //        延時一會
  232.                 if(s1==0)                                         //如果s1確實按下,執行下面程序
  233.                 {        s1num++;                                 //s1num自加1
  234.                         while(!s1);                                 //如果s1松開,執行下面程序,否則一直停在這
  235.                         if(s1num==1)                         //如果s1只按一次,執行下面
  236.                         {
  237.                                 write_com(0x80+13);       //設置當前指針位置
  238.                                 write_com(0x0f);                  //寫入光標閃爍命令
  239.                         }
  240.                         if(s1num==2)                                  //如果s1按2次,執行下面
  241.                         {
  242.                                 write_com(0x80+0x40+13);  //設置當前指針位置,光標閃
  243.                         }
  244.                         if(s1num==3)                                  //如果s1按3次,執行下面
  245.                         {        s1num=0;                                  //s1num清0
  246.                                 write_com(0x0c);              //寫入光標不閃爍命令
  247.                         }
  248.                 }
  249.         }
  250.         
  251.         if(s2==0)                                                          //如果s2按下,執行下面程序
  252.         {        delay(5);                                                  //延時
  253.                 if(s2==0);                                                  //如果s2按下,執行下面程序
  254.                 {               
  255.                                 while(!s2);                                  //如果s2松開,執行下面程序,否則一直停在這
  256.                                 if(s1num==1)                          //如果光標在h的位置閃爍,執行下面程序
  257.                                 {        h++;                                  //h加1
  258.                                         if(h==127)                            //=127清0
  259.                                         h=0;                                 
  260.                                         figh=0;                                  //設置figh=0,符號為正
  261.                                         t=figh;                                  //賦值給t,以便液晶顯示
  262.                                         if(h<=-1)                          //如果h為負數
  263.                                         {figh=1;                          //設置figh=0
  264.                                          t=figh;                          //賦值給t,以便液晶顯示
  265.                                          h=abs(h);                          //h取絕對值
  266.                                          write_hl(11,h);          //h寫入LCD
  267.                                          h=0-h;                                  //把h變回原來的負數
  268.                                         }
  269.                                         else{write_hl(11,h);} //否則h寫入LCD
  270.                                         write_com(0x80+13);          //光標在溫度值位置閃爍
  271.                                 }
  272.                                 if(s1num==2)                          //如果光標在l的位置閃爍,執行下面程序
  273.                                 {        l++;                                 
  274.                                         if(l==127)                           
  275.                                         l=0;
  276.                                         figl=0;
  277.                                         t=figl;
  278.                                         if(l<=-1)
  279.                                         {figl=1;
  280.                                          t=figl;
  281.                                          l=abs(l);
  282.                                          write_hl(0x40+11,l);         
  283.                                          l=0-l;
  284.                                         }
  285.                                         else{write_hl(0x40+11,l);}         
  286.                                         write_com(0x80+0x40+13);        
  287.                                 }
  288.                 }
  289.         }
  290.         if(s3==0)                                                          //如果s3按下,執行下面程序
  291.         {        delay(5);                                                  //延時
  292.                 if(s3==0);
  293.                 {
  294.                                 while(!s3);                                  //s3松開后,執行下面程序
  295.                                 if(s1num==1)                          //如果光標在h的位置閃爍,執行下面程序
  296.                                 {        h--;                                  //h自減1
  297.                                         if(h==-55)                          //如果h=-55清0
  298.                                         h=0;
  299.                                         figh=0;                                  //設置figh=0,溫度值為正
  300.                                         t=figh;                                  //賦值給t,以便液晶顯示
  301.                                         if(h<=-1)                          //如果h溫度值為負數
  302.                                         {figh=1;                          //設置figh=1
  303.                                          t=figh;                          //賦值給t,以便液晶顯示
  304.                                          h=abs(h);                          //h取絕對值
  305.                                          write_hl(11,h);          //h寫入LCD
  306.                                          h=0-h;                                  //把h變回原來的負數
  307.                                         }
  308.                                         else{write_hl(11,h);} //否則h寫入LCD         
  309.                                         write_com(0x80+13);          //光標在溫度值位置閃爍
  310.                                 }                 
  311.                                 if(s1num==2)
  312.                                 {        l--;
  313.                                         if(l==-55)
  314.                                         h=0;
  315.                                         figl=0;
  316.                                         t=figl;
  317.                                         if(l<=-1)
  318.                                         {figl=1;
  319.                                          t=figl;
  320.                                          l=abs(l);
  321.                                          write_hl(0x40+11,l);         
  322.                                          l=0-l;
  323.                                         }
  324.                                         else{write_hl(0x40+11,l);}         
  325.                                         write_com(0x80+0x40+13);
  326.                                 }
  327.                 }
  328.         }               
  329. }        
  330. void comp()                                                                //溫度值報警程序
  331. {if(fig==1&&temp_value>=h)                                
  332. D1=0;
  333. if(fig==1&&temp_value<=h)                        
  334. D1=1;
  335.          if(fig==0)                                                        //如果讀取溫度值為負
  336.          {  if(figh==0)                                                //如果設置最高值溫度值為正
  337.                  D1=1;  
  338.                  if(figh==1)                                                //如果設置最高值溫度值為負
  339.                   {h=abs(h);
  340.                    if(temp_value<=h)
  341.                    D1=0;
  342.                    if(temp_value>=h)
  343.                    D1=1;
  344.                    h=-h;         
  345.                   }
  346.          }
  347. if(fig==1&&temp_value<=l)
  348. D2=0;
  349. if(fig==1&&temp_value>=l)
  350. D2=1;            
  351. if(fig==0)
  352.                 {         if(figl==0)
  353.                          D2=0;
  354.                          if(figl==1)
  355.                          {l=abs(l);
  356.                           if(temp_value>=l)
  357.                           D2=0;
  358.                           if(temp_value<=l)
  359.                           D2=1;
  360.                           l=-l;
  361.                          }
  362.                 }               
  363. }                     
復制代碼

G3%`Q)A{U3V1P49J1}ZVMW8.png (20.93 KB, 下載次數: 52)

G3%`Q)A{U3V1P49J1}ZVMW8.png
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:657149 發表于 2019-12-11 00:09 | 只看該作者
小數位始終是0不跟隨18b20的改變而改變
回復

使用道具 舉報

板凳
ID:396245 發表于 2019-12-11 11:16 | 只看該作者
  • void write_temp_value(uchar add,char date)//讀取的溫度值在LCD上顯示程序
  • {uchar bai,shi,ge,min;
  •         bai =日期* 10/1000;
  •         shi =日期* 10/100%10;
  •         ge = date * 10/10%10;
  •         min = 2; //分離出百,十,個位數            這里,你把一個常量賦值給了min,當然不會變咯
  •         if((bai | shi | ge)== 0)//如果百十都等于0

回復

使用道具 舉報

地板
ID:470332 發表于 2019-12-11 11:29 | 只看該作者
你的temp_value是uchar類型,你說temp_value*=0.625是多少
回復

使用道具 舉報

5#
ID:213173 發表于 2019-12-11 17:53 | 只看該作者
sunxuu 發表于 2019-12-11 00:09
小數位始終是0不跟隨18b20的改變而改變

temp_value的數據類型定義和使用不恰當
uchar num,fig,s1num,figh,figl,t,temp_value;
void write_temp_value(uchar add,char date);
write_temp_value(0,temp_value);
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩精品 电影一区 亚洲 | 欧美精品一区二区三区在线播放 | 最新国产精品视频 | 亚洲最色网站 | 成人在线精品 | 在线一区二区观看 | 成人a免费| 成人性视频免费网站 | 欧美视频精品 | www精品美女久久久tv | 亚洲精品一区二区三区在线 | 日韩精品在线一区 | 中文字幕精品一区久久久久 | 美国a级毛片免费视频 | 先锋资源在线 | 亚洲精品福利视频 | 一级美国黄色片 | 久久久爽爽爽美女图片 | 成人在线视频一区 | 国产91久久久久蜜臀青青天草二 | www操操 | 日本黄色短片 | 日本又色又爽又黄又高潮 | 中文字幕在线国产 | 亚洲 中文 欧美 日韩 在线观看 | 国产欧美在线一区 | 久久激情五月丁香伊人 | 亚洲精品色 | 国产精品欧美一区喷水 | 国产欧美精品一区二区 | 久久av资源网 | 午夜小视频免费观看 | 视频在线观看亚洲 | av片在线观看网站 | 国产精品不卡视频 | 日韩视频精品在线 | 国产成人jvid在线播放 | 色视频网站在线观看 | 99亚洲精品 | 国产ts人妖系列高潮 | 日本不卡一区二区 |