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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機-ds18b20多點溫度采集proteus仿真-lcd1602顯示 源碼都有還可以讀序列號

  [復制鏈接]
跳轉到指定樓層
樓主
ID:137190 發表于 2016-9-9 22:53 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
51單片機做的多點溫度采集系統的仿真,帶源碼



全部資料下載:
51單片機-ds18b20多點采集-lcd1602顯示.zip (56.56 KB, 下載次數: 290)


lcd1602顯示ds18b20讀溫度程序:
  1. #include<reg51.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char

  4. sbit lcdrs=P3^0;
  5. sbit lcdrw=P3^1;
  6. sbit lcden=P3^2;

  7. sbit DQ=P1^7;
  8. uint value;
  9. uchar code table1[]={0x28,0x30,0xc5,0xb8,0x00,0x00,0x00,0x8e};//rom1       測得的序列號
  10. uchar code table2[]={0x28,0x31,0xc5,0xb8,0x00,0x00,0x00,0xb9};//rom2
  11. uchar code table3[]="Temple";
  12. bit fg=0;
  13. void delay(uint n)
  14. {  uint x,y;
  15.    for(x=n;x>0;x--)
  16.        for(y=110;y>0;y--);
  17. }

  18. void write_com(uchar com)
  19. {
  20.         lcdrs=0;                        //rs=0時輸入指令
  21.         P2=com;
  22.         delay(5);
  23.         lcden=1;                        //en=1時讀取信息
  24.         delay(5);
  25.         lcden=0;                        //1 -> 0 執行指令
  26. }


  27. void write_dat(uchar dat)
  28. {
  29.         lcdrs=1;                         //rs=1時輸入數據
  30.         P2=dat;
  31.         delay(5);
  32.         lcden=1;
  33.         delay(5);
  34.         lcden=0;
  35. }

  36. void init_lcd()
  37. {
  38.         lcden=0;
  39.         lcdrw=0;
  40.         write_com(0x38);          //8位數據,雙列,5*7字形
  41.         write_com(0x0c);         //開啟顯示屏,關光標,光標不閃爍
  42.         write_com(0x06);         //顯示地址遞增,即寫一個數據后,顯示位置右移一位
  43.         write_com(0x01);

  44. }

  45. void delay_us(uchar t)//微妙延時
  46. {
  47.         while(t--);
  48. }
  49. void init_ds18b20()        //數據初始化
  50. {
  51.         DQ=1;
  52.         delay_us(4);
  53.         DQ=0;
  54.         delay_us(80);
  55.         DQ=1;
  56.         delay_us(200);
  57. }
  58. void write_ds18b20(uchar dat) //寫數據
  59. {
  60.         uchar i;
  61.         for(i=0;i<8;i++)
  62.         {
  63.                 DQ=0;               
  64.                 DQ=dat&0x01;
  65.                 delay_us(15);
  66.                 DQ=1;
  67.                 dat=dat>>1;
  68.         }
  69.         delay_us(10);
  70. }
  71. uchar read_ds18b20()  //讀數據
  72. {
  73.         uchar i=0,readat=0;
  74.         for(i=0;i<8;i++)
  75.         {
  76.                 DQ=0;
  77.                 readat=readat>>1;      //八位全部都是0,向右移一位后,仍然全是0
  78.                 DQ=1;
  79.                 if(DQ)                //如果DQ為1,readat進行或運算,如果為0,則子語句不執行,直接for循環此時采集的數據是0
  80.                         readat=readat|0x80;//此時最高位為1         ,然后再進行for循環 最高位成為第七位,依次往復
  81.                 delay_us(10);
  82.         }
  83.         return readat;
  84. }

  85. void check_rom(uchar a)                   //匹配序列號
  86. {
  87.         uchar j;

  88.            write_ds18b20(0x55);
  89.         if(a==1)
  90.         {
  91.                 for(j=0;j<8;j++)
  92.                 {
  93.                         write_ds18b20(table1[j]);
  94.                 }
  95.         }
  96.         if(a==2)
  97.         {
  98.                 for(j=0;j<8;j++)
  99.                 {
  100.                         write_ds18b20(table2[j]);
  101.                 }
  102.         }

  103. }

  104. uchar change_ds18b20(uchar z)
  105. {
  106.         uchar tl,th;
  107.         
  108.         init_ds18b20();              //初始化
  109.         write_ds18b20(0xcc);  //跳過
  110.         init_ds18b20();                  
  111.         if(z==1)
  112.         {
  113.                 check_rom(1);           //         匹配rom1
  114.         }
  115.         if(z==2)
  116.         {
  117.                 check_rom(2);           //          匹配rom2
  118.         }

  119.         write_ds18b20(0x44);
  120.         init_ds18b20();
  121.         write_ds18b20(0xcc);
  122.         init_ds18b20();
  123.         if(z==1)
  124.         {
  125.                 check_rom(1);           //
  126.         }
  127.         if(z==2)
  128.         {
  129.                 check_rom(2);           //
  130.         }

  131.         write_ds18b20(0xbe);  //啟動讀暫存器。讀內部ram中9字節溫度數據
  132.         tl=read_ds18b20();
  133.         th=read_ds18b20();
  134.         value=th;
  135.         value=value<<8;
  136.         value=value|tl;
  137.         if(th < 0x80)
  138.         {        fg=0;  }

  139.         
  140.         if(th>= 0x80)
  141.         {        fg=1;
  142.                  
  143.                 value=~value+1;
  144.         }
  145.                 value=value*(0.0625*10);
  146.             return value;
  147.         
  148. }

  149. void display_lcd1602(uchar z)
  150. {         
  151.          uchar i;
  152.          if(z==1)
  153.          {
  154.                  write_com(0x80);
  155.                  for(i=0;i<6;i++)
  156.                  {
  157.                          write_dat(table3[i]);
  158.                         delay(3);
  159.                  }
  160.                  write_dat(0x2d);
  161.                  write_dat(0x41);
  162.                  write_dat(0x3a);
  163.                  if(fg==1)
  164.                  {
  165.                          write_dat(0xb0);
  166.                  }
  167.                  if(fg==0)
  168.                  {
  169.                          write_dat(0x20);
  170.                  }
  171.                  write_dat(value/100+0x30);
  172.                  write_dat(value%100/10+0x30);
  173.                  write_dat(0x2e);
  174.                  write_dat(value%10+0x30);
  175.                  write_dat(0xdf);
  176.                  write_dat(0x43);
  177.          }

  178.          if(z==2)
  179.          {
  180.                  write_com(0x80+0x40);
  181.                  for(i=0;i<6;i++)
  182.                  {
  183.                          write_dat(table3[i]);
  184.                         delay(3);
  185.                  }
  186.                  write_dat(0x2d);
  187.                  write_dat(0x42);
  188.                  write_dat(0x3a);
  189.                  if(fg==1)
  190.                  {
  191.                          write_dat(0xb0);
  192.                  }
  193.                  if(fg==0)
  194.                  {
  195.                          write_dat(0x20);
  196.                  }  
  197.                  write_dat(value/100+0x30);
  198.                  write_dat(value%100/10+0x30);
  199.                  write_dat(0x2e);
  200.                  write_dat(value%10+0x30);
  201.                  write_dat(0xdf);
  202.                  write_dat(0x43);
  203.          }


  204. }

  205. void main()
  206. {
  207.         init_lcd();

  208.         while(1)
  209.         {
  210.                 change_ds18b20(1);
  211.                 display_lcd1602(1);
  212.                
  213.                 change_ds18b20(2);
  214.                 display_lcd1602(2);
  215.                                        
  216.         }
  217. }
復制代碼

lcd1602顯示ds18b20溫度采集讀序列號程序
  1. #include<reg51.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char

  4. sbit lcdrs=P3^0;
  5. sbit lcdrw=P3^1;
  6. sbit lcden=P3^2;

  7. sbit DQ=P1^7;
  8. uint value;
  9. uchar save_number[8];

  10. void delay(uint n)
  11. {  uint x,y;
  12.    for(x=n;x>0;x--)
  13.        for(y=110;y>0;y--);
  14. }

  15. void write_com(uchar com)
  16. {
  17.         lcdrs=0;                        //rs=0時輸入指令
  18.         P2=com;
  19.         delay(5);
  20.         lcden=1;                        //en=1時讀取信息
  21.         delay(5);
  22.         lcden=0;                        //1 -> 0 執行指令
  23. }


  24. void write_dat(uchar dat)
  25. {
  26.         lcdrs=1;                         //rs=1時輸入數據
  27.         P2=dat;
  28.         delay(5);
  29.         lcden=1;
  30.         delay(5);
  31.         lcden=0;
  32. }

  33. void init_lcd()
  34. {
  35.         lcden=0;
  36.         lcdrw=0;
  37.         write_com(0x38);          //8位數據,雙列,5*7字形
  38.         write_com(0x0c);         //開啟顯示屏,關光標,光標不閃爍
  39.         write_com(0x06);         //顯示地址遞增,即寫一個數據后,顯示位置右移一位
  40.         write_com(0x01);

  41. }



  42. void delay_us(uchar t)//微秒延時
  43. {
  44.         while(t--);
  45. }
  46. void init_ds18b20()        //數據初始化
  47. {
  48.         DQ=1;
  49.         delay_us(4);
  50.         DQ=0;
  51.         delay_us(80);
  52.         DQ=1;
  53.         delay_us(200);
  54. }
  55. void write_ds18b20(uchar dat) //寫數據
  56. {
  57.         uchar i;
  58.         for(i=0;i<8;i++)
  59.         {
  60.                 DQ=0;               
  61.                 DQ=dat&0x01;
  62.                 delay_us(15);
  63.                 DQ=1;
  64.                 dat=dat>>1;
  65.         }
  66.         delay_us(10);
  67. }
  68. uchar read_ds18b20() //讀數據
  69. {
  70.         uchar i=0,readat=0;
  71.         for(i=0;i<8;i++)
  72.         {
  73.                 DQ=0;
  74.                 readat=readat>>1;   //八位全部都是0,向右移一位后,仍然全是0
  75.                 DQ=1;
  76.                 if(DQ)             //如果DQ為1,readat進行或運算,如果為0,則子語句不執行,直接for循環此時采集的數據是0
  77.                         readat=readat|0x80;//此時最高位為1         ,然后再進行for循環 最高位成為第七位,依次往復
  78.                 delay_us(10);
  79.         }
  80.         return readat;
  81. }

  82. uchar change_ds18b20()
  83. {
  84.         uchar tl,th;
  85.         init_ds18b20();              //初始化
  86.         write_ds18b20(0xcc);  //跳過rom
  87.         write_ds18b20(0x44);  //啟動ds18b20進行溫度轉換,結果存入9字節ram中

  88.         init_ds18b20();                  //?  缺少不可執行
  89.         write_ds18b20(0xcc);
  90.         write_ds18b20(0xbe);  //啟動讀暫存器。讀內部ram中9字節溫度數據
  91.         tl=read_ds18b20();
  92.         th=read_ds18b20();
  93.         value=th;
  94.         value=value<<8;
  95.         value=value|tl;
  96.         value=value*(0.0625*10)+0.5;
  97.         return value;
  98. }


  99. void dis_readnumber()                                         
  100. {
  101.         uchar i,temp;

  102.         init_ds18b20();

  103.         write_ds18b20(0x33);                     //讀rom   即rom中的編碼
  104.         for(i=0;i<8;i++)
  105.         {
  106.                 save_number[i]=read_ds18b20();  //保存序列號
  107.         }

  108.     write_com(0x80);                                    
  109.         for(i=0;i<8;i++)
  110.         {
  111.                 temp=save_number[i]>>4;
  112.                 if(temp<10)
  113.                 {
  114.                         write_dat(0x30+temp);
  115.                 }
  116.                 else
  117.                 {
  118.                          write_dat(0x37+temp);
  119.                 }

  120.                 temp=save_number[i]&0x0f;
  121.                 if(temp<10)
  122.                 {
  123.                         write_dat(0x30+temp);
  124.                 }
  125.                 else
  126.                 {
  127.                          write_dat(0x37+temp);
  128.                 }
  129.         }

  130. }
  131. void main()
  132. {
  133.         init_lcd();
  134.         while(1)
  135.         {
  136.            dis_readnumber();    //顯示序列號
  137.         }
  138. }
復制代碼

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

使用道具 舉報

沙發
ID:122547 發表于 2017-6-26 19:16 | 只看該作者
看起來不錯啊 比我的 高大上
回復

使用道具 舉報

板凳
ID:218630 發表于 2018-3-5 22:45 | 只看該作者
proteus中的傳感器的序列號只有6個數字,lz這個長的是要設置過嗎
回復

使用道具 舉報

地板
ID:311217 發表于 2018-4-18 20:57 | 只看該作者
很棒啊
回復

使用道具 舉報

5#
ID:294657 發表于 2019-4-28 14:57 | 只看該作者
想請問protues中ds18b20的ROm怎么設置 實際檢測出來的ROM有16位 而仿真里面只能填寫6位
回復

使用道具 舉報

6#
ID:703703 發表于 2020-3-16 11:49 | 只看該作者
為什么我拿過來后顯示不了溫度呢?
回復

使用道具 舉報

7#
ID:423911 發表于 2021-9-28 19:48 | 只看該作者
正在找這個資料,感謝
回復

使用道具 舉報

8#
ID:440028 發表于 2022-1-6 08:51 | 只看該作者
感謝你,正在學習中,多路檢測正發愁那
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线观看国产视频 | 精品国产乱码久久久久久丨区2区 | 成人一区二区三区 | 亚洲精品久久久久久国产精华液 | 三级黄色片在线观看 | 四虎影院免费在线播放 | 久久99国产精品 | 日日久 | 欧美成人在线影院 | 91麻豆精品国产91久久久更新资源速度超快 | 欧美一区成人 | 999国产视频 | 黄视频国产 | 免费在线观看一级毛片 | 欧美乱大交xxxxx另类电影 | 国产 欧美 日韩 一区 | 精品一区二区在线视频 | 久久在线 | 欧美日韩国产精品 | 亚洲久草视频 | 国产免费一区 | 国产精品久久久久久吹潮 | 精品久久久网站 | 国产麻豆一区二区三区 | 一区二区三区视频在线 | 成人一级毛片 | 亚洲成人午夜电影 | 午夜精品久久久久久久久久久久久 | 国产在线观看一区二区 | 成人高清在线视频 | 丝袜美腿一区二区三区 | 韩日三级| 91玖玖| 日本免费一区二区三区四区 | aaaaaaa片毛片免费观看 | 亚洲第一av| 国产精品一区二区电影 | 91看片网| 亚洲人在线 | 欧美va大片 | 在线不卡视频 |