找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7759|回复: 0
收起左侧

STC12 1T单片机DS18B20温度检测仿真+代码+原理图

[复制链接]
ID:430888 发表于 2018-11-21 22:42 | 显示全部楼层 |阅读模式
新人报道。了解学习下
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png 0.png

单片机源程序如下:
  1. /*******************************************************************************************/
  2. //   单片机原理与应用课程设计
  3. //   题目:温度检测系统设计
  4. //   要点:1、用温度传感器18B20测环境温度,用LCD1602显示测量结果
  5. //         2、用PROTEUS仿真
  6. //         3、焊接电路板并调试运行
  7. //   出品:潍坊学院信息与控制工程学院
  8. //   编程:戴曰章
  9. //   日期:2014年12月
  10. //   注意:该程序仅供参考。改程序用于STC12C5A60S2单片机。它是1T的指令周期,与传统的12T的MCU不同
  11. /*******************************************************************************************/

  12. #include<reg52.h>
  13. #include<intrins.h>
  14. #define uchar unsigned char
  15. #define uint unsigned int

  16. #define     LCDIO      P1  //1602数据口
  17. sbit DQ=P3^2;//ds18b20与单片机连接口

  18. sbit rs=P2^0;  //1602数据命令选择引脚
  19. sbit rd=P2^1;        //读写选择
  20. sbit lcden=P2^2;        //1602选通引脚




  21. void DelayXus(uchar n);
  22. void DS18B20_Reset();
  23. void DS18B20_WriteByte(uchar dat);
  24. uchar DS18B20_ReadByte();


  25. float f_temp; //浮点型温度值   
  26. uint tvalue;//温度值
  27. uchar tflag;

  28. uchar code table[]=        {"The temperature "};    //每行显示16个字符
  29. uchar code table1[]=        {"is:  000.0C wfu"};

  30. uchar data disdata[5];


  31. void delay(uint z)        //短延时
  32. {
  33.         uint x,y;
  34.         for(x=z;x>0;x--)
  35.                 for(y=110;y>0;y--);
  36. }

  37. void write_com(uchar com)        //1602写命令子程序
  38. {
  39.         rs=0;                //RS是数据命令选择短,高电平写数据,低电平写命令
  40.         rd=0;                //RD是读写选择短,高电平读,低电平写
  41.         lcden=0;        //1602选通端,高电平选通,低电平禁止
  42.         LCDIO =com;
  43.         delay(5);
  44.         lcden=1;
  45.         delay(5);
  46.         lcden=0;        
  47. }

  48. void write_date(uchar date)        //1602写数据子程序
  49. {
  50.         rs=1;        //RS是数据命令选择短,高电平写数据,低电平写命令
  51.         rd=0;        //RD是读写选择短,高电平读,低电平写
  52.         lcden=0;        //1602选通端,高电平选通,低电平禁止
  53.         LCDIO =date;
  54.         delay(5);
  55.         lcden=1;
  56.         delay(5);
  57.         lcden=0;        
  58. }



  59. void init()                                //1602初始化程序
  60. {
  61.         uchar num;
  62.         lcden=0;

  63.         write_com(0x38);        //0011 1000B,功能模式设置,设置为8为数据口,两行显示,5*7点阵
  64.         write_com(0x0c);        //0000 1011B,显示开及光标设置,关显示,显示光标,光标闪烁
  65.         write_com(0x06);        //0000 0110B,显示光标移动设置,读或写一个字符,地址指针减一且光标减一,写一个字符屏幕显示不移动
  66.         write_com(0x01);        //0000 0001B,显示清屏,数据指针和所有显示清屏
  67.         write_com(0x80);        //1000 000B,关闭显示
  68.         delay(5);
  69.         write_com(0x80);        //1000 000B,设置为2行显示,写入第一行字符的地址,第一行地址是00-2F
  70.         for(num=0;num<16;num++)
  71.                 {
  72.                         write_date(table[num]);        //写入第一行数据
  73.                         delay(5);
  74.                 }
  75.         write_com(0x80+0x40);        //1100 0000B,设置为2行显示,写入第二行字符的地址,第而行地址是40-67
  76.         for(num=0;num<16;num++)        //写入第二行数据
  77.                 {
  78.                         write_date(table1[num]);//写入第二行数据
  79.                         delay(5);
  80.                 }      
  81.         

  82. }










  83. /**************************************
  84. 延时X微秒(STC12C5A60S2@12M)
  85. 不同的工作环境,需要调整此函数
  86. 此延时函数是使用1T的指令周期进行计算,与传统的12T的MCU不同
  87. **************************************/
  88. void DelayXus(uchar n)
  89. {
  90.     while (n--)
  91.     {
  92.         _nop_();
  93.         _nop_();
  94.     }
  95. }

  96. /**************************************
  97. 复位DS18B20,并检测设备是否存在
  98. **************************************/
  99. void DS18B20_Reset()
  100. {
  101.     CY = 1;
  102.     while (CY)
  103.     {
  104.         DQ = 0;                     //送出低电平复位信号
  105.         DelayXus(240);              //延时至少480us
  106.         DelayXus(240);
  107.         DQ = 1;                     //释放数据线
  108.         DelayXus(60);               //等待60us
  109.         CY = DQ;                    //检测存在脉冲
  110.         DelayXus(240);              //等待设备释放数据线
  111.         DelayXus(180);
  112.     }
  113. }

  114. /**************************************
  115. 从DS18B20读1字节数据
  116. **************************************/
  117. uchar DS18B20_ReadByte()
  118. {
  119.     uchar i;
  120.     uchar dat = 0;

  121.     for (i=0; i<8; i++)             //8位计数器
  122.     {
  123.         dat >>= 1;
  124.         DQ = 0;                     //开始时间片
  125.         DelayXus(1);                //延时等待
  126.         DQ = 1;                     //准备接收
  127.         DelayXus(1);                //接收延时
  128.         if (DQ) dat |= 0x80;        //读取数据
  129.         DelayXus(60);               //等待时间片结束
  130.     }

  131.     return dat;
  132. }

  133. /**************************************
  134. 向DS18B20写1字节数据
  135. **************************************/
  136. void DS18B20_WriteByte(uchar dat)
  137. {
  138.     char i;

  139.     for (i=0; i<8; i++)             //8位计数器
  140.     {
  141.         DQ = 0;                     //开始时间片
  142.         DelayXus(1);                //延时等待
  143.         dat >>= 1;                  //送出数据
  144.         DQ = CY;
  145.         DelayXus(60);               //等待时间片结束
  146.         DQ = 1;                     //恢复数据线
  147.         DelayXus(1);                //恢复延时
  148.     }
  149. }







  150. unsigned int ReadTemp(void)
  151. {
  152. unsigned char a=0;
  153. unsigned char b=0;


  154.     DS18B20_Reset();                //设备复位
  155.     DS18B20_WriteByte(0xCC);        //跳过ROM命令
  156.     DS18B20_WriteByte(0x44);        //开始转换命令
  157.     while (!DQ);                    //等待转换完成

  158.     DS18B20_Reset();                //设备复位
  159.     DS18B20_WriteByte(0xCC);        //跳过ROM命令
  160.     DS18B20_WriteByte(0xBE);        //读暂存存储器命令
  161.     a= DS18B20_ReadByte();       //读温度低字节
  162.     b= DS18B20_ReadByte();       //读温度高字节


  163.   tvalue=b;
  164.   tvalue<<=8;
  165.   tvalue=tvalue|a;
  166.     if(tvalue<0x0fff)
  167.    tflag=0;
  168.     else
  169.    {tvalue=~tvalue+1;
  170.          tflag=1;
  171.    }
  172. //tvalue=tvalue*(0.425);//温度值扩大10倍,精确到1位小数
  173. f_temp=tvalue*(0.0625);    // 温度在寄存器中为12位,分辨率为0.0625
  174. tvalue=f_temp*10+0.5;    //乘以10表示小数点后面只取1位,加0.5时四舍五入
  175. //f_temp=f_temp+0.05;
  176. //f_temp=tvalue*(0.0625);
  177. //tvalue=f_temp*100+(tvalue>0?0.5:-0.5);


  178.         return(tvalue);
  179.   }


  180. void ds1820disp()//温度值显示
  181.         { uchar flagdat;
  182.           disdata[0]=tvalue/1000+0x30;//百位数
  183.      disdata[1]=tvalue%1000/100+0x30;//十位数
  184.      disdata[2]=tvalue%100/10+0x30;//个位数
  185.      disdata[3]=tvalue%10+0x30;//小数位
  186.    
  187.      if(tflag==0)
  188.             flagdat=0x20;//正温度不显示符号
  189.      else
  190.        flagdat=0x2d;//负温度显示负号:-

  191.      if(disdata[0]==0x30)
  192.            {disdata[0]=0x20;//如果百位为0,不显示
  193.                  if(disdata[1]==0x30)
  194.                   {disdata[1]=0x20;//如果百位为0,十位为0也不显示
  195.                   }
  196.                 }


  197.            write_com(0x80+0x44);            //1100 0000B,设置为2行显示,写入第二行字符的地址,第而行地址是40-67
  198.            write_date(flagdat);//显示符号位
  199.            write_com(0x80+0x45);
  200.            write_date(disdata[0]);//显示百位
  201.            write_com(0x80+0x46);
  202.            write_date(disdata[1]);//显示十位         
  203.            write_com(0x80+0x47);
  204.            write_date(disdata[2]);//显示个位         
  205.            write_com(0x80+0x48);
  206.            write_date(0x2e);//显示小数点         
  207.            write_com(0x80+0x49);
  208.            write_date(disdata[3]);//显示小数位
  209.            write_com(0x80+0x4a);
  210.            write_date('C');
  211.    }



  212. void main()
  213. {        
  214.         init();

  215.         ReadTemp();//读取温度
  216.         ds1820disp();//显示
  217.         while(1)
  218.         {

  219.          ReadTemp();//读取温度
  220.          ds1820disp();//显示

  221.         }

  222. }
复制代码

所有资料51hei提供下载:
http://www.51hei.com/bbs/dpj-142615-1.html


回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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