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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于51單片機、ds18b20溫度計設計源代碼

[復制鏈接]
跳轉到指定樓層
樓主
功能:1.顯示溫度;
2.顯示溫度上下限;
3.上下限可調;
4.顯示溫度傳感器序列碼;
5.溫度異常,分階段報警。            


源程序:
  1. //////////////////////////////////////////////////////////////////// /////////////////////////////////////////
  2. /*

  3. 按鍵控制LCD顯示內容,(id號與當前溫度/上下限以及)
  4. 按鍵可調溫度的上下限。


  5. */
  6. #include<reg52.h>
  7. #include<intrins.h>                         //nop

  8. #define uchar unsigned char
  9. #define uint unsigned int

  10. sbit ds = P2^2;                           //DS18b20-->DS
  11. sbit beep = P2^3;                   //buzz

  12. sbit wela = P2^7;                        //
  13. sbit dula = P2^6;                        //

  14. sbit LCDEN = P3^4;                        // EN
  15. sbit rs = P3^5;                                //數據 命令選擇端
  16. sbit rw = P3^6;                                //讀寫選擇端

  17. uchar datstr[] = "Temperature:";
  18. uchar str[4];                            //uchartostr函數轉換的字符串   同時可以把16進制轉成10進制        存高低溫上下限
  19. uchar str1[5];                                         //uchartostr1函數轉換的字符串   同時可以把16進制轉成10進制        存溫度  
  20. //sbit IDcheck=P2^5;
  21. //sbit IDready=P3^1;

  22.    
  23. int flip=0;                   // 用來讀flip1  用于反轉
  24. int flip1=1;                  //=1 開單鍵&用于雙鍵反轉
  25. bit flag;//ds初始化成功標志
  26. uchar ds_rom[16];         //存序列碼         存入的是字節
  27.           
  28. uchar H=40,L=10,Key_value;              //初始上下限溫度,


  29. uchar code table[]={'0','1','2','3','4',
  30.                                         '5','6','7','8','9',
  31.                                         'A','B','C','D','E','F'                //序列碼字節轉ASCII專用數組               
  32. };


  33. void delay(uint z);                                 //延時函數        1602專用
  34. void write_com(uchar com);                       //寫命令
  35. void write_data(uchar date);                  //寫數據
  36. void init_1602();                                //初始化1602
  37. uchar *uchartostr(uchar num);        //將一個字節的數據轉換為字符串 或10進制         返回數組 上下限顯示用
  38. uchar *uchartostr1(uint num);        //將一個字節的數據轉換為字符串 或10進制         返回數組 溫度顯示用
  39. void lcd_dis(uchar X,uchar Y,uchar *dis);        //顯示數據數組
  40. void lcd_distostr(uchar X,uchar Y);//顯示字符串temperature 數組
  41.                  

  42. void TempDelay(uchar us)                        //delay
  43. {
  44.         while(us--); //6.51us
  45. }
  46. void ds_reset()                                                //ds18b20 init
  47. {
  48.         ds=1;
  49.         _nop_();         //1us
  50.         ds=0;
  51.         TempDelay(80);         //延時略長些
  52.         ds=1;
  53.         TempDelay(6);
  54.         if(ds==0)
  55.                 flag=0;                        //記錄應答電平
  56.         else
  57.                 flag=1;                         //失敗
  58.         TempDelay(20);                 //延時
  59.         ds=1;                                   //置1結束
  60. }

  61. bit ds_read_bit()          //(||)read a bit
  62. {
  63.         bit dat;
  64.         ds=0;                        //DQ已經是1了
  65.         _nop_();           //1us delay
  66.         _nop_();
  67.         ds=1;
  68.         _nop_();
  69.         dat=ds;                        //讀一位
  70.         TempDelay(12);                //延時稍長
  71.         return dat;
  72. }
  73. uchar ds_read_byte()                //read a byte
  74. {
  75.         uchar i,j,value;
  76.         for(i=0;i<8;i++)
  77.         {
  78.                 j=ds_read_bit();          //1 bit上一個函數    @先讀到的位為最低位
  79.                 value=(j<<7)|(value>>1);   //新bit左移7位,舊狀態右移一位空出最高位,組合
  80.         }
  81.         return value;
  82. }
  83. void ds_write_byte(uchar dat)                          //寫一字節
  84. {
  85.         uchar i,onebit;
  86.         for(i=0;i<8;i++)                                          //8bit
  87.         {
  88.                 onebit=dat&0x01;         //取最低位
  89.                 if(onebit)           //最低位為1  寫1
  90.                 {
  91.                         ds=0;
  92.                         TempDelay(1);
  93.                         ds=1;
  94.                         _nop_();
  95.                 }
  96.                 else  //寫0
  97.                 {
  98.                         ds=0;
  99.                         TempDelay(11);   //delay 長一些 因為省去ds=0
  100.                         ds=1;
  101.                         _nop_();
  102.                 }
  103.                 dat>>=1;          //右移一位
  104.         }
  105. }

  106. void ds_change()                        //jump rom  &start temp convert
  107. {       
  108.         ds_reset() ;
  109.         while(flag!=0);                        //        //檢測到設備  成功返回0
  110.         ds_write_byte(0xcc);        //jump ROM
  111.         ds_write_byte(0x44);        //TEMP convert
  112. }


  113. void Read_ROM()                           //序列碼讀入數組        ds_rom[i]
  114. {
  115.         int i;
  116.         uchar a;       //序列碼緩沖
  117.         ds_reset();
  118.         while(flag!=0);
  119.         ds_write_byte(0x33);        //read rom序列碼
  120.         for(i=15;i>0;i--)
  121.         {       
  122.                 a=ds_read_byte();
  123.                 ds_rom[i--]=(0x0f&a);                  //取低四位        15
  124.                 ds_rom[i]=((0xf0&a)>>4);                //取高四位          14
  125.         }
  126.         // ds_rom[16]='\0';
  127. }

  128. uint get_temperature()                 //                  溫度采集
  129. {
  130.         uint temp;
  131.         float ftemp;
  132.         uchar a,b;
  133.         ds_reset();
  134.         while(flag!=0);
  135.         ds_write_byte(0xcc);                         //jump ROM
  136.         ds_write_byte(0xbe);                        //read 標簽存儲器
  137.         a=ds_read_byte();                                //read low8
  138.         b=ds_read_byte();                                //read high8
  139.        
  140.         temp=b;
  141.         temp<<=8;
  142.         temp|=a;                                           //高低8位結合

  143.         ftemp=temp*0.0625;                           //12bit-->0.0625*10 (除以16,2^4,右移4位)
  144.         ftemp=ftemp*10+0.5;                           //取1位小數后四舍五入
  145.         temp=ftemp;                                           //現在為10倍temp的整數  便于顯示

  146.         return temp;
  147. }

  148. void IDshow();                                                //顯示序列碼
  149. void WarningShow();                                         //溫度上下限顯示
  150. void key()                                           // 有問題  按鍵掃描
  151. {
  152.         Key_value = P3;
  153.         Key_value = Key_value & 0x0f;
  154.         if ( Key_value != 0x0f )
  155.         {
  156.                 delay(5);
  157.                 if ( Key_value != 0x0f )        //qu dou
  158.                 {
  159.                         if( Key_value == 0x0c )                  //s2s3同時按下
  160.                                 {  
  161.                                         delay(5);
  162.                                         if( Key_value == 0x0c )        //
  163.                                     {
  164.                                                  flip=flip1;                  //狀態反轉 讀上一次狀態 每同時按一次  反轉一次
  165.                                                 if(flip==1)                  
  166.                                                 {
  167.                                                    IDshow();
  168.                                                    flip1=0;                  //flip1==1  關閉單鍵調節功能
  169.                                                 }
  170.                                                 else if(flip==0)
  171.                                                 {
  172.                                                         WarningShow();         //顯示上下限
  173.                                                         flip1=1;                //flip1==1  時才能監測其他按鍵來調上下限                               
  174.                                                 }
  175.                                         }
  176.                                 }
  177.                        
  178.                         if( (Key_value == 0x0e)&(flip1==1) )
  179.                         {        //*
  180.                        
  181.                                 H++;
  182.                                 if (H==100)
  183.                                         H=40;
  184.                                
  185.                         }

  186.                         if( (Key_value == 0x0d)&(flip1==1) )
  187.                         {
  188.                                 H--;
  189.                                 if (H==0)
  190.                                         H=99;
  191.                                 if (H==L)
  192.                                         H=H+1;
  193.                         }

  194.                         if( (Key_value == 0x0b)&(flip1==1) )
  195.                         {
  196.                                 L++;
  197.                                 if (L==H)
  198.                                         L=0;
  199.                         }

  200.                          if( (Key_value == 0x07)&(flip1==1) )
  201.                         {
  202.                                 L--;
  203.                                 if (L==0)
  204.                                         if(H>10)
  205.                                                  L=10;
  206.                                         else
  207.                                              L=H-1;
  208.                         }                  

  209.                 }
  210.         }
  211.        


  212. }

  213. void IDshow()
  214. {

  215.         uint i;
  216.         Read_ROM();
  217.         write_com( 0x80 + 0 + 0 );
  218.         for(i=0;i<16;i++)
  219.         {
  220.             write_data(table[ds_rom[i]]);           //
  221.         }
  222.                
  223. }

  224. void WarningShow()
  225. {
  226.         write_com( 0x80 + 0 + 0);
  227.         write_data( ' ' );
  228.         write_data( ' ' );
  229.         write_data( ' ' );
  230.         write_com( 0x80 + 0 + 3);
  231.         write_data( 'H' );
  232.         write_data( ':' );
  233.         write_com( 0x80 + 0 + 7);
  234.         write_data( ' ' );
  235.         write_com( 0x80 + 0 + 8);
  236.         write_data( 'L' );
  237.         write_data( ':' );
  238.         write_com( 0x80 + 0 + 12);
  239.         write_data( ' ' );
  240.         write_data( ' ' );
  241.         write_data( ' ' );
  242.         write_data( ' ' );
  243.         lcd_dis( 0,5,uchartostr( H ) );
  244.         lcd_dis( 0,10,uchartostr( L ) );
  245. }




  246. /****************************************************MAIN*************************************************************/
  247. /****************************************************MAIN*************************************************************/
  248. /****************************************************MAIN*************************************************************/
  249. void main()                                               
  250. {

  251.         uint i;
  252. //        rd = 0;
  253.         init_1602();                           //
  254.                                           
  255.         WarningShow();        
  256. //        H = 40;
  257. //        L = 10;
  258.         lcd_dis( 0,5,uchartostr( H ) );
  259.     lcd_dis( 0,10,uchartostr( L ) );
  260.         lcd_distostr(1,0);           //TEMPERATURE

  261.                                                 //init warn
  262.        
  263.         ds_change();
  264.         delay(800);               ////85C
  265.         while(1)
  266.         {
  267.                 ds_change();  
  268.                 i = get_temperature();        //采溫度
  269.        
  270.                 lcd_dis( 1,12,uchartostr1( i ) );                //str1 顯示溫度
  271.                 if(flip1==0);
  272.                 else if(flip1==1)        //啟動單鍵時
  273.                 {
  274.                         lcd_dis( 0,5,uchartostr( H ) );                  //上下限-->str
  275.                     lcd_dis( 0,10,uchartostr( L ) );
  276.                 }
  277.                
  278.                 //報警
  279.                 if ( i >=(10*H) )
  280.                 {
  281.                          P1 = 0x33;
  282.                 }
  283.                 else if (i<=(10*L))
  284.                 {
  285.                          P1 = 0xcc;
  286.                 }
  287.                 else
  288.                 {
  289.                          P1 = 0xff;
  290.                 }
  291.                 key();
  292.         }  
  293. }






  294. //1602輔助小函數
  295. void delay(uint z)                                 //延時函數
  296. {
  297.         uint x,y;
  298.         for(x=z;x>0;x--)
  299.                 for(y=120;y>0;y--);
  300. }
  301. void write_com(uchar com)                  //寫命令
  302. {
  303.         P0=com;                                                 
  304.         rs=0;                                                 //寫命令
  305.         LCDEN=0;
  306.         delay(10);
  307.         LCDEN=1;
  308.         delay(10);
  309.         LCDEN=0;
  310.                
  311. }
  312. void write_data(uchar date)                  //寫數據
  313. {
  314.         P0=date;
  315.         rs=1;                                                 //寫數據
  316.         LCDEN=0;
  317.         delay(10);
  318.         LCDEN=1;
  319.         delay(10);
  320.         LCDEN=0;
  321.                
  322. }
  323. void init_1602()                                //初始化1602
  324. {
  325.     rw=0;
  326.         dula=0;
  327.         wela=0;                                  //防止數碼管亂閃

  328.         write_com(0x38);           //顯示模式設置:16×2顯示,5×7點陣,8位數據接口
  329.         delay(20);
  330.         write_com(0x0c);           //顯示模式設置:開顯示 不顯示光標  也不閃爍
  331.         delay(20);                        
  332.         write_com(0x06);           //顯示模式設置:光標右移,字符不移,不移動屏幕
  333.         delay(20);
  334.         write_com(0x01);           //清屏幕指令,將以前的顯示內容清除
  335.         delay(20);       
  336. }

  337. /////////////////////////////////////////////////////////////////////////////////
  338. ////////////////////////////x數組  準備顯示//////////////////////////////////////
  339. /////////////////////////////////////////////////////////////////////////////////

  340. uchar *uchartostr(uchar num)        //將一個字節的數據轉換為字符串 或10進制         返回數組首地址        (上下限)
  341. {
  342.         uchar x1,x0,i;


  343.         x1=num%100/10;
  344.         x0=num%100%10;
  345.         i=0;                                                          //數組第一元素

  346.         str[i]=x1+48;                                        //變ASCII碼
  347.         i++;
  348.         str[i]=x0+48;
  349.         i++;
  350.         str[i]='\0';                                        //結束符
  351.         return str;
  352. }


  353. uchar *uchartostr1(uint num)        //將一個字節的數據轉換為字符串 或10進制         返回數組(溫度專用)
  354. {
  355.         uchar x2,x1,x0,i;

  356.         x2=num/100;
  357.         x1=num%100/10;
  358.         x0=num%10;
  359.         i=0;                                                          //數組第一元素
  360.         if(x2!=0)
  361.         {
  362.                 str1[i]=x2+48;                                 //變ASCII碼 十位
  363.                 i++;
  364.         }
  365.         if(1)
  366.         {
  367.                 str1[i]=x1+48;                                //個位
  368.                 i++;
  369.                 str1[i]=46;                                           // "." 小數點
  370.                 i++;
  371.         }
  372.         str1[i]=x0+48;                                    //十分位
  373.         i++;
  374.         str1[i]='\0';                                        //結束符
  375.         return str1;                                       
  376. }


  377. /////////////////////////////////////////////////////////////////////////////////
  378. ////////////////////////////x顯示////////////////////////////////////////////////
  379. /////////////////////////////////////////////////////////////////////////////////

  380. void lcd_dis(uchar X,uchar Y,uchar *dis)        //顯示數據數組
  381. {                          
  382.    uchar  pos;                                                                //位置
  383.    switch(X)
  384.    {
  385.                 case 0:X=0x00;                                                // line1
  386.                 break;
  387.                 case 1:X=0x40;                                                //line2
  388.                 break;
  389.                 break;
  390.                 default:break;
  391.    }

  392.    pos =0x80+X+Y;                                                          //
  393.    write_com(pos);                          //寫入顯示地址設置
  394.    while(*dis!='\0')                                                //
  395.    {
  396.         write_data(*dis++);               
  397.    }
  398. }

  399. void lcd_distostr(uchar X,uchar Y)//顯示字符串temperature 數組
  400. {                          
  401.    uchar  pos,i;
  402.    i=0;                                                                         //設定從數組中的第幾個字符串開始顯示
  403.         switch(X)


  404. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

下載:
ds18b20_oo.zip (60.74 KB, 下載次數: 36)

評分

參與人數 3黑幣 +11 收起 理由
XINB + 5 很給力!
luo1429181965 + 5
c51ds18b20 + 1 很給力!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:233546 發表于 2017-12-25 00:56 | 只看該作者
請問按鍵是矩陣是按鍵嗎?
回復

使用道具 舉報

板凳
ID:260785 發表于 2017-12-25 08:11 | 只看該作者
感謝無私奉獻。一起學習一起前進。
回復

使用道具 舉報

地板
ID:264406 發表于 2017-12-25 12:05 | 只看該作者
按鍵改溫度怎么按鍵?
回復

使用道具 舉報

5#
ID:267631 發表于 2017-12-27 12:39 | 只看該作者
太好了這設計
回復

使用道具 舉報

6#
ID:268529 發表于 2017-12-28 19:28 | 只看該作者
我做的數碼管不顯示十位后的溫度,很煩,自己也不知道哪里錯了。
回復

使用道具 舉報

7#
ID:271393 發表于 2018-1-4 14:57 | 只看該作者
謝謝樓主了,我正在學習,看一下
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩精品一区二区三区中文在线 | 九九热久久免费视频 | 日韩在线免费视频 | 亚洲永久 | 一区二区三区四区在线播放 | 国产黑丝av | 美女福利视频一区 | 天天躁日日躁狠狠很躁 | 成人午夜激情 | 精精国产xxxx视频在线播放7 | 国偷自产av一区二区三区 | av无遮挡 | 成人在线观看中文字幕 | 一区二区三区四区在线 | 欧美不卡网站 | 一区影视| 在线观看国产wwwa级羞羞视频 | 久久激情视频 | 国产精品高潮呻吟久久av野狼 | 精品伊人| 嫩草视频入口 | 喷水毛片 | 日韩av在线免费 | 久久国产精品一区二区 | 2019天天操 | 欧美亚洲另类在线 | a免费视频| 欧美一区二区三区在线看 | 欧美日韩久久精品 | 国产精品 亚洲一区 | 久久高清 | 亚洲69p| 免费啪啪 | 99免费在线视频 | 久久久一区二区 | 天堂一区二区三区 | 国产一级免费视频 | 羞羞视频网 | 亚洲在线 | 国产精品色综合 | 国产一区二区三区在线免费 |