找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9942|回復(fù): 7
收起左側(cè)

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

  [復(fù)制鏈接]
ID:137190 發(fā)表于 2016-9-9 22:53 | 顯示全部樓層 |閱讀模式
51單片機(jī)做的多點溫度采集系統(tǒng)的仿真,帶源碼
0.png
0.png

全部資料下載:
51單片機(jī)-ds18b20多點采集-lcd1602顯示.zip (56.56 KB, 下載次數(shù): 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 執(zhí)行指令
  26. }


  27. void write_dat(uchar dat)
  28. {
  29.         lcdrs=1;                         //rs=1時輸入數(shù)據(jù)
  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位數(shù)據(jù),雙列,5*7字形
  41.         write_com(0x0c);         //開啟顯示屏,關(guān)光標(biāo),光標(biāo)不閃爍
  42.         write_com(0x06);         //顯示地址遞增,即寫一個數(shù)據(jù)后,顯示位置右移一位
  43.         write_com(0x01);

  44. }

  45. void delay_us(uchar t)//微妙延時
  46. {
  47.         while(t--);
  48. }
  49. void init_ds18b20()        //數(shù)據(jù)初始化
  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) //寫數(shù)據(jù)
  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()  //讀數(shù)據(jù)
  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進(jìn)行或運(yùn)算,如果為0,則子語句不執(zhí)行,直接for循環(huán)此時采集的數(shù)據(jù)是0
  80.                         readat=readat|0x80;//此時最高位為1         ,然后再進(jìn)行for循環(huán) 最高位成為第七位,依次往復(fù)
  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);  //啟動讀暫存器。讀內(nèi)部ram中9字節(jié)溫度數(shù)據(jù)
  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. }
復(fù)制代碼

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 執(zhí)行指令
  23. }


  24. void write_dat(uchar dat)
  25. {
  26.         lcdrs=1;                         //rs=1時輸入數(shù)據(jù)
  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位數(shù)據(jù),雙列,5*7字形
  38.         write_com(0x0c);         //開啟顯示屏,關(guān)光標(biāo),光標(biāo)不閃爍
  39.         write_com(0x06);         //顯示地址遞增,即寫一個數(shù)據(jù)后,顯示位置右移一位
  40.         write_com(0x01);

  41. }



  42. void delay_us(uchar t)//微秒延時
  43. {
  44.         while(t--);
  45. }
  46. void init_ds18b20()        //數(shù)據(jù)初始化
  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) //寫數(shù)據(jù)
  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() //讀數(shù)據(jù)
  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進(jìn)行或運(yùn)算,如果為0,則子語句不執(zhí)行,直接for循環(huán)此時采集的數(shù)據(jù)是0
  77.                         readat=readat|0x80;//此時最高位為1         ,然后再進(jìn)行for循環(huán) 最高位成為第七位,依次往復(fù)
  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進(jìn)行溫度轉(zhuǎn)換,結(jié)果存入9字節(jié)ram中

  88.         init_ds18b20();                  //?  缺少不可執(zhí)行
  89.         write_ds18b20(0xcc);
  90.         write_ds18b20(0xbe);  //啟動讀暫存器。讀內(nèi)部ram中9字節(jié)溫度數(shù)據(jù)
  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. }
復(fù)制代碼

相關(guān)帖子

回復(fù)

使用道具 舉報

ID:122547 發(fā)表于 2017-6-26 19:16 | 顯示全部樓層
看起來不錯啊 比我的 高大上
回復(fù)

使用道具 舉報

ID:218630 發(fā)表于 2018-3-5 22:45 | 顯示全部樓層
proteus中的傳感器的序列號只有6個數(shù)字,lz這個長的是要設(shè)置過嗎
回復(fù)

使用道具 舉報

ID:311217 發(fā)表于 2018-4-18 20:57 | 顯示全部樓層
很棒啊
回復(fù)

使用道具 舉報

ID:294657 發(fā)表于 2019-4-28 14:57 | 顯示全部樓層
想請問protues中ds18b20的ROm怎么設(shè)置 實際檢測出來的ROM有16位 而仿真里面只能填寫6位
回復(fù)

使用道具 舉報

ID:703703 發(fā)表于 2020-3-16 11:49 | 顯示全部樓層
為什么我拿過來后顯示不了溫度呢?
回復(fù)

使用道具 舉報

ID:423911 發(fā)表于 2021-9-28 19:48 | 顯示全部樓層
正在找這個資料,感謝
回復(fù)

使用道具 舉報

ID:440028 發(fā)表于 2022-1-6 08:51 | 顯示全部樓層
感謝你,正在學(xué)習(xí)中,多路檢測正發(fā)愁那
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表