找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3675|回复: 3
打印 上一主题 下一主题
收起左侧

温度传感器proteus仿真和单片机源代码

[复制链接]
跳转到指定楼层
楼主
温度传感器的使用,内含proteus仿真和源代码
哪里有错误请大家指教。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

  1. #include<reg51.h>
  2. #include<intrins.h>
  3. unsigned char code Str[]={"Temperature Now"};
  4. unsigned char code Error[]={"Error! No DS18B20"};

  5. unsigned char code Temp[]={"Value:"};
  6. unsigned char code digit[10]={"0123456789"};
  7. unsigned char code Cent[]={0xdf,"C"};

  8. sbit DQ=P3^3;

  9. sbit E=P2^4;
  10. sbit RW=P2^3;
  11. sbit RS=P2^2;
  12. sbit BF=P0^7;

  13. void delay1ms()
  14. {
  15.          unsigned char i,j;
  16.          for(i=0;i<8;i++)
  17.          for(j=0;j<40;j++)
  18.          ;
  19. }

  20. void delaynms(unsigned char n)
  21. {
  22.          unsigned char i;
  23.          for(i=0;i<n;i++)
  24.          delay1ms();
  25. }

  26. bit BusyChek(void)
  27. {
  28.          bit busy;
  29.          RS=0;//RW=P2^3;RS=P2^2;
  30.          RW=1;
  31.          E=1;
  32.          _nop_();_nop()_;_nop_();_nop()_;
  33.     busy=BF;
  34.     E=0;
  35.     return busy;
  36. }

  37. void WriteCommand(unsigned char dictate)
  38. {
  39.         while(BusyChek()==1);
  40.         RS=0;
  41.         RW=0;
  42.         E=0;
  43.         _nop_();_nop()_;
  44.         P0=dictate;
  45.         _nop_();_nop()_;_nop_();_nop()_;
  46.         E=1;
  47.         _nop_();_nop()_;_nop_();_nop()_;
  48.         E=0;
  49. }

  50. void WritePosition(unsigned char x)
  51. {
  52.          WriteCommand(x|0x80);
  53. }

  54. void WriteASCII(unsigned char y)
  55. {
  56.          while(BusyChek()==1);
  57.         RS=1;
  58.         RW=0;
  59.         E=0;
  60.         P0=y;
  61.         _nop_();_nop()_;_nop_();_nop()_;
  62.         E=1;
  63.         _nop_();_nop()_;_nop_();_nop()_;
  64.         E=0;
  65. }

  66. void LcdInit(void)
  67. {
  68.          delaynms(16);
  69.          WriteCommand(0x38);
  70.          delaynms(5);
  71.          WriteCommand(0x38);
  72.          delaynms(5);
  73.          WriteCommand(0x0c);
  74.          
  75.          delaynms(5);
  76.          WriteCommand(0x06);
  77.          
  78.          delaynms(5);
  79.          WriteCommand(0x01);
  80.          delaynms(5);
  81. }

  82. unsigned char time;
  83. bit Init_DS18B20(void)

  84. {
  85.          bit flag;
  86.          
  87.          DQ=1;
  88.          for(time=0;time<2;time++)
  89.          ;
  90.          DQ=0;
  91.          for(time=0;time<200;time++)
  92.          ;
  93.          DQ=1;
  94.          for(time=0;time<10;time++)
  95.          ;
  96.          flag=DQ;
  97.          for(time=0;time<200;time++)
  98.          ;
  99.          return (flag);
  100. }
  101. unsigned char ReadOneByte(void)
  102. {
  103.         unsigned char i=0;
  104.         unsigned char dat;
  105.         for(i=0;i<8;i++)
  106.         {
  107.                 DQ=1;
  108.                 _nop_();
  109.                 DQ=0;
  110.                 dat>>=1;
  111.                 _nop_();
  112.                 DQ=1;
  113.                 for(time=0;time<2;time++)
  114.          ;
  115.          if(DQ==1)
  116.          dat|=0x80;
  117.          else
  118.          dat|=0x00;
  119.          for(time=0;time<8;time++)
  120.          ;
  121.                 }        
  122.                 return (dat);
  123. }

  124. WriteOneChar(unsigned char dat)
  125. {
  126.         unsigned char i=0;
  127.         for(i=0;i<8;i++)
  128.         {
  129.                 DQ=1;
  130.                 _nop_();
  131.                 DQ=0;
  132.                
  133.                 DQ=dat&0x01;
  134.                
  135.                 for(time=0;time<10;time++)
  136.                 ;
  137.                 DQ=1;
  138.                 for(time=0;time<1;time++)
  139.                 ;
  140.                 dat>>=1;
  141.         }
  142.         for(time=0;time<5;time++)
  143.         ;
  144. }

  145. void Display_Error(void)
  146. {
  147.          unsigned char i;
  148.          WritePosition(0x00);
  149.          i=0;
  150.          while(Error[i]!='\0')
  151.          {
  152.                  WriteASCII(Error[i]);
  153.                  i++;
  154.                  delaynms(100);
  155.                  }        
  156.                  while(1)
  157.                  ;
  158. }

  159. void Display_Explain(void)
  160. {
  161.          unsigned char i;
  162.          WritePosition(0x00);
  163.          i=0;
  164.          while(Str[i]!='\0')
  165.          {
  166.                  WriteASCII(Str[i]);
  167.                  i++;
  168.                  delaynms(100);
  169.                  }        
  170. }

  171. void Display_Symbol(void)
  172. {
  173.          unsigned char i;
  174.          WritePosition(0x40);
  175.          i=0;
  176.          while(Temp[i]!='\0')
  177.          {
  178.                  WriteASCII(Temp[i]);
  179.                  i++;
  180.                  delaynms(50);
  181.                  }        
  182. }

  183. void Display_Dot(void)
  184. {
  185.          WritePosition(0x49);
  186.          WriteASCII('.');
  187.          delaynms(50);
  188. }

  189. void Display_Cent(void)
  190. {
  191.          WritePosition(0x4c);
  192. i=0;
  193.          while(Cent[i]!='\0')
  194.          {
  195.                  WriteASCII(Cent[i]);
  196.                  i++;
  197.                  delaynms(50);
  198.                  }        
  199. }

  200. void Display_Decimal(unsigned char x)
  201. {
  202.          WritePosition(0x4a);
  203.          WriteASCII(digit[x]);
  204.          delaynms(50);
  205. }

  206. void Display_Integer(unsigned char x)
  207. {
  208.          unsigned char u,v,w;
  209.          u=x/100;
  210.          v=(x%100)/10;
  211.          w=x%10;
  212.          WritePosition(0x46);
  213.          WriteASCII(digit[u]);
  214.                  WriteASCII(digit[v]);
  215.                          WriteASCII(digit[w]);
  216.                                  delaynms(50);
  217. }

  218. void ReadyReadTemp(void)
  219. {
  220.          Init_DS18B20();
  221.          WriteOneChar(0xCC);
  222.          WriteOneChar(0x44);
  223.          for(time=0;time<100;time++)
  224.          ;
  225.          Init_DS18B20();
  226.          WriteOneChar(0xCC);
  227.          WriteOneChar(0xBE);
  228. }

  229. void main(void)
  230. {
  231.          unsigned char TL;
  232.          unsigned char TH;
  233.          unsigned char TN;
  234.          unsigned char TD;
  235.     LcdInit();
  236.     delaynms(4);
  237.     if(Init_DS18B20()==1)
  238.     Display_Error;
  239.     Display_Explain;
  240.     Display_Symbol;
  241.     Display_Dot();
  242.     Display_Cent();
  243.     while(1)
  244.     {
  245.             ReadyReadTemp;
  246.             TL=ReadOneByte();
  247.             TH=ReadOneByte();
  248.             TN=TH*16+TL/16;
  249.             TD=(TL%16)*10/16;
  250.             Display_Integer(TN);
  251.             Display_Decimal(TD);
  252.             delaynms(10);
  253.         }
  254. }















复制代码

温度传感器.zip (18.55 KB, 下载次数: 38)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:404068 发表于 2018-9-29 15:31 | 只看该作者
感谢楼主
回复

使用道具 举报

板凳
ID:416676 发表于 2018-11-10 16:22 | 只看该作者
想学做一下家庭智能报警系统  但是有些知识点不太懂,请问下这个温度传感器弄出来以后  通过什么方法可以让主机接收到温度传感器的信号呢?
回复

使用道具 举报

地板
ID:552382 发表于 2019-6-2 10:02 | 只看该作者
你的附件里并没有放proteus仿真文件啊?而且这个proteus仿真图明显不对啊,ds18b20都没有连接到单片机上
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表