欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

這是個關于DS18B20的單片機測溫程序 但是顯示的溫度為什么一直在15度啊 求大神

查看數: 3980 | 評論數: 2 | 收藏 0
關燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發布時間: 2019-4-28 20:06

正文摘要:

單片機源程序如下: #include<reg51.h>                               #include<intrins.h ...

回復

ID:539433 發表于 2019-6-4 10:28
wulin 發表于 2019-4-29 09:14
你的程序主要有兩處錯誤:
1.DS18B20讀取時序錯誤,Delay_us(480);uchar最大只能255,其它小延時也做了調 ...

這個帖子對我太有用了,最近也在研究lcd顯示
ID:213173 發表于 2019-4-29 09:14
你的程序主要有兩處錯誤:
1.DS18B20讀取時序錯誤,Delay_us(480);uchar最大只能255,其它小延時也做了調整。
2.需要顯示的數據分解方法錯誤,temp是uchar型數據,怎么能str3[temp%1000/100])、str3[temp%100/10]);
修改后的程序如下:




  1. #include<reg51.h>                              
  2. #include<intrins.h>
  3. #include <absacc.h>
  4. #define uchar unsigned char
  5. #define uint  unsigned int
  6. #define BUSY  0x80
  7. void Delay(uint);
  8. void init_LCD();
  9. void LCD_Com(uchar,uchar);
  10. void LCD_Data(uchar);
  11. void ReadyLCD();
  12. void Display_char(uchar X,uchar Y,uchar Data);
  13. void Display_str(uchar,uchar,uchar code *Data);
  14. void LCDDisplay();
  15. void init_18B20();
  16. uchar Read_18B20();
  17. void Write_18B20(uchar dat);
  18. void Read_temp1();
  19. void Delay_us(uchar i);
  20. void Key_scan( );
  21. void Key_set( );
  22. void Key_inc( );
  23. void Key_dec( );
  24. void Alarm( );
  25. sbit relay=P3^3;
  26. sbit triac1=P3^0;
  27. sbit triac2=P3^1;
  28. sbit triac3=P3^2;
  29. sbit LCD_RS=P2^0;
  30. sbit LCD_RW=P2^1;
  31. sbit LCD_EN=P2^2;
  32. sbit DQ=P1^7;
  33. sbit Normal=P2^4;
  34. sbit Alarm_B=P2^5;
  35. sbit Alarm_R=P2^6;
  36. sbit Alarm_BEEP=P2^7;

  37. uchar Set_flag=0;
  38. uchar Temp_set1,Temp_set2;        //用于存放讀到的值
  39. uchar temp,temp1,temp2;
  40. extern uchar code str0[]={"C   :    D :    "};                        //顯示設置1
  41. extern uchar code str1[]={"Mode:    DC:    "};                        //顯示設置2
  42. extern uchar code str2[]={"    Hellow!!    "};
  43. extern uchar code str3[]={"0123456789"};
  44. extern uchar code mode[]={"NCD"};
  45. bit ON_OFF=0;   
  46. bit outflag;   
  47. bit write=0;  

  48. void main()                        //主程序
  49. {
  50.         P1=0xff;
  51.         P2|=0x70;
  52.         P2&=0x7f;
  53.         Temp_set1=40;          //設置溫度40
  54.         Temp_set2=1;          //設置檔位1
  55.         Delay(500);             //延時500ms
  56.         init_LCD();              //LCD初始化
  57.         init_18B20();            //DS18B20初始化
  58.         Display_str(0,0,str2);     //開機界面
  59.         Display_str(0,1,str2);     //開機界面
  60.         Delay(2000);                           //延遲
  61.         Display_str(0,0,str0);           //顯示設置str0
  62.         Display_str(0,1,str1);           //顯示設置str1
  63.         while(1)
  64.         {
  65.                 Key_scan();       //掃描鍵盤
  66.                 Read_temp1();     //讀取溫度               
  67.                 LCDDisplay();        //顯示
  68.                 Alarm();         //指示燈與報警程序
  69.                 Delay(1000);                 //延遲
  70.         }
  71. }

  72. /********延時kms********/
  73. void Delay(uint k)
  74. {
  75.         uint i,j;
  76.         for(i=0;i<k;i++)
  77.                 for(j=0;j<60;j++);
  78. }
  79. /********精確延時********/
  80. void Delay_us(uchar i)
  81. {
  82.   while(--i);
  83. }

  84. /********顯示模塊********/
  85. /********LCD初始化********/
  86. void init_LCD()
  87. {
  88.         P0=0;
  89.         Delay(15);
  90.         LCD_Com(0x38,0);
  91.         Delay(5);
  92.         LCD_Com(0x38,0);
  93.         Delay(5);
  94.         LCD_Com(0x38,0);
  95.         Delay(5);
  96.         LCD_Com(0x38,1);  //8位數據傳送,2行顯示,5*7字形
  97.         LCD_Com(0x08,1);  //關閉顯示
  98.         LCD_Com(0x01,1);  //清屏
  99.         LCD_Com(0x06,1);  //顯示光標右移設置
  100.         LCD_Com(0x0c,1);  //顯示屏打開,光標不顯示不閃爍
  101. }

  102. /********寫指令數據到LCD********/
  103. void LCD_Com(uchar LC,uchar BC)
  104. {
  105.         if(BC) ReadyLCD();
  106.         P0=LC;
  107.         LCD_RS=0;      //選中指令寄存器
  108.         LCD_RW=0;      //寫模式
  109.         LCD_EN=1;
  110.         _nop_();
  111.         _nop_();
  112.         _nop_();
  113.         LCD_EN=0;
  114. }

  115. /********寫顯示數據到LCD********/
  116. void LCD_Data(uchar LD)
  117. {
  118.         ReadyLCD();
  119.         P0=LD;
  120.         LCD_RS=1;      //選中數據寄存器
  121.         LCD_RW=0;      //寫模式
  122.         LCD_EN=1;
  123.         _nop_();
  124.         _nop_();
  125.         _nop_();
  126.         LCD_EN=0;
  127. }

  128. /********檢測LCD忙狀態********/
  129. void ReadyLCD()
  130. {
  131.         P0=0xff;
  132.         LCD_RS=0;
  133.         LCD_RW=1;
  134.         LCD_EN=1;
  135.         _nop_();
  136.         while(P0&BUSY)
  137.         {
  138.                 LCD_EN=0;
  139.                 _nop_();
  140.           _nop_();
  141.                 LCD_EN=1;
  142.                 _nop_();
  143.           _nop_();
  144.         }
  145.   LCD_EN=0;
  146. }

  147. /********顯示一個字符********/
  148. void Display_char(uchar X,uchar Y,uchar Data)
  149. {
  150.         Y&=1;
  151.         X&=15;
  152.         if(Y) X|=0x40;
  153.         X|=0x80;
  154.         LCD_Com(X,0);
  155.         LCD_Data(Data);
  156. }

  157. /********顯示一串字符********/
  158. void Display_str(uchar X,uchar Y,uchar code *Data)
  159. {
  160.         uchar List=0;
  161.         Y&=0x01;
  162.         X&=0x0f;
  163.         while(X<16)
  164.         {
  165.                 Display_char(X,Y,Data[List]);
  166.                 List++;
  167.                 X++;
  168.         }               
  169. }




  170. /********溫度測量模塊********/
  171. /********DS18B20初始化********/
  172. void init_18B20()
  173. {
  174.         uchar x=0;
  175.         DQ=1;            //DQ復位
  176.         Delay_us(5);       //延時
  177.         DQ=0;            //將DQ拉低
  178.         Delay_us(200);     //精確延時大于480us
  179.         Delay_us(200);
  180.         DQ=1;            //拉高總線
  181.         Delay_us(50);
  182.         x=DQ;
  183.         Delay_us(25);
  184. }

  185. /********從DS18B20讀取一個字節數據********/
  186. uchar Read_18B20()
  187. {
  188.         uchar i=0;
  189.         uchar dat=0;
  190.         for(i=8;i>0;i--)
  191.         {
  192.                 DQ=0;
  193.                 dat>>=1;
  194.                 DQ=1;
  195. //                Delay_us(1);
  196.                 if(DQ)
  197.                 dat|=0x80;
  198.                 Delay_us(25);
  199.         }
  200.         return(dat);
  201. }


  202. /********向DS18B20寫入一個字節數據********/
  203. void Write_18B20(uchar dat)
  204. {
  205.         uchar i=0;
  206.         for(i=8;i>0;i--)
  207.         {
  208.                 DQ=0;
  209.                 _nop_();
  210.                 DQ=dat&0x01;
  211.                 Delay_us(25);
  212.                 DQ=1;
  213.                 dat>>=1;
  214.                 Delay_us(25);
  215.         }
  216. }

  217. /********從DS18B20讀取溫度********/
  218. void Read_temp1()
  219. {
  220.         uchar a=0;
  221.         uint b=0;
  222.         uint t=0;
  223. //        float tt;
  224.         init_18B20();
  225.         Write_18B20(0xcc);                //寫跳過讀ROM指令
  226.         Write_18B20(0x44);                //寫跳過讀ROM指令
  227.         Delay(20);
  228.         init_18B20();
  229.         Write_18B20(0xcc);
  230.         Write_18B20(0xbe);
  231.         a=Read_18B20();
  232.         b=Read_18B20();
  233.         b<<=8;
  234.         t=a+b;
  235.         temp=t>>4;
  236. }

  237. /********顯示子程序********/
  238. void LCDDisplay()
  239. {
  240.         LCD_Com(0x0c,1);                        
  241.         Display_str(0,0,str0);     
  242.         Display_str(0,1,str1);   
  243.         Display_char(5,0,str3[Temp_set1/10]);
  244.         Display_char(6,0,str3[Temp_set1%10]);
  245.         Display_char(13,0,str3[Temp_set2/10]);
  246.         Display_char(14,0,str3[Temp_set2%10]);
  247.         Display_char(5,1,mode[Set_flag]);
  248.         Display_char(13,1,str3[temp/10%10]);
  249.         Display_char(14,1,str3[temp%10]);
  250. }
  251. /********鍵盤掃描程序********/
  252. void Key_scan( )
  253. {

  254.         P1=0xff;
  255.         if(P1!=0xff)
  256.         {
  257.                 Delay(20);  //延時消抖
  258.                 if(P1!=0xff)
  259.                 {
  260.                        
  261.                         switch(P1)
  262.                         {
  263.                                 case 0xfe:Key_set();break; //P1.0按下,功能選擇
  264.                                 case 0xfd:Key_inc();break; //P1.1按下,數字加一
  265.                                 case 0xfb:Key_dec();break; //P1.2按下,數字減一
  266.                                 default:break;
  267.                         }
  268.                 }
  269.         }
  270. }

  271. /********工作模式子程序********/
  272. void Key_set( )
  273. {
  274.         Set_flag++;
  275.         if(Set_flag>=3)  //設定溫度值
  276.                 Set_flag=0;    //設定檔位值
  277. }

  278. /********按鍵加一子程序********/
  279. void Key_inc( )
  280. {
  281.         switch(Set_flag)
  282.         {
  283.                 case 1:Temp_set1++;
  284.                        if(Temp_set1>=99) Temp_set1=99;break;
  285.                 case 2:Temp_set2++;
  286.                        if(Temp_set2>=Temp_set1) Temp_set2=Temp_set1;break;
  287.                 default:break;
  288.         }
  289. }

  290. /********按鍵減一子程序********/
  291. void Key_dec( )
  292. {
  293.       
  294.         switch(Set_flag)
  295.         {
  296.                 case 1:Temp_set1--;
  297.                        if(Temp_set1<=Temp_set2) Temp_set1=Temp_set2;break;
  298.                 case 2:Temp_set2--;
  299.                        if(Temp_set2<=1) Temp_set2=1;break;
  300.                 default:break;
  301.         }
  302. }

  303. /********報警和指示程序********/
  304. void Alarm( )
  305. {
  306.         uchar C;

  307.         C=Temp_set1+5;
  308.       
  309.         if(temp>C)
  310.         {
  311.                 Normal=1;
  312.                 Alarm_B=0;
  313.                 Alarm_R=1;
  314.                 Alarm_BEEP=1;
  315.   }
  316.          else
  317.          {
  318.             Normal=1;
  319.                 Alarm_B=1;
  320.                 Alarm_R=0;
  321.                 Alarm_BEEP=0;
  322.          }
  323. }

復制代碼



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

Powered by 單片機教程網

快速回復 返回頂部 返回列表