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

標題: 51單片機-ds18b20多點溫度采集proteus仿真-lcd1602顯示 源碼都有還可以讀序列號 [打印本頁]

作者: 51黑ff    時間: 2016-9-9 22:53
標題: 51單片機-ds18b20多點溫度采集proteus仿真-lcd1602顯示 源碼都有還可以讀序列號
51單片機做的多點溫度采集系統(tǒng)的仿真,帶源碼



全部資料下載:
51單片機-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);         //開啟顯示屏,關光標,光標不閃爍
  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進行或運算,如果為0,則子語句不執(zhí)行,直接for循環(huán)此時采集的數(shù)據(jù)是0
  80.                         readat=readat|0x80;//此時最高位為1         ,然后再進行for循環(huán) 最高位成為第七位,依次往復
  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. }
復制代碼

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);         //開啟顯示屏,關光標,光標不閃爍
  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進行或運算,如果為0,則子語句不執(zhí)行,直接for循環(huán)此時采集的數(shù)據(jù)是0
  77.                         readat=readat|0x80;//此時最高位為1         ,然后再進行for循環(huán) 最高位成為第七位,依次往復
  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字節(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. }
復制代碼


作者: 437653720    時間: 2017-6-26 19:16
看起來不錯啊 比我的 高大上
作者: 茶涼尐    時間: 2018-3-5 22:45
proteus中的傳感器的序列號只有6個數(shù)字,lz這個長的是要設置過嗎
作者: 年邁的司機    時間: 2018-4-18 20:57
很棒啊
作者: 超級無敵磊果果    時間: 2019-4-28 14:57
想請問protues中ds18b20的ROm怎么設置 實際檢測出來的ROM有16位 而仿真里面只能填寫6位
作者: 1780392324    時間: 2020-3-16 11:49
為什么我拿過來后顯示不了溫度呢?
作者: zlj20181110    時間: 2021-9-28 19:48
正在找這個資料,感謝
作者: liuyiyi    時間: 2022-1-6 08:51
感謝你,正在學習中,多路檢測正發(fā)愁那




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: www.奇米| 日日干日日 | av成年人网站 | 99精品视频免费观看 | 综合国产| 精品久久久久久久久久 | 九九热在线视频观看这里只有精品 | 国产精品久久久久久久久久妇女 | 韩国欧洲一级毛片 | 国产精品国产成人国产三级 | 精品国产第一区二区三区 | 亚洲高清在线视频 | 欧美视频xxx | 狠狠操天天操 | 国产欧美精品一区二区 | 亚洲黄色av | 国产综合视频 | 日日夜夜狠狠操 | 亚洲一区二区在线视频 | 仙人掌旅馆在线观看 | 亚洲不卡在线观看 | 国产高清视频在线观看 | 狠狠ri | 狠狠干五月天 | 色婷婷综合久久久中字幕精品久久 | 特黄特黄a级毛片免费专区 av网站免费在线观看 | 日一区二区三区 | 91精品国产一区二区三区 | 久久久亚洲一区 | 婷婷丁香激情 | 欧美综合一区 | 亚洲人成一区二区三区性色 | 久久69精品久久久久久久电影好 | 免费观看黄色一级片 | 国产片侵犯亲女视频播放 | 亚洲福利片 | 狠狠狠色丁香婷婷综合久久五月 | 久久狠狠 | 天天操夜夜操 | 日韩电影中文字幕在线观看 | 日韩av一区二区在线观看 |