找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3465|回复: 3
收起左侧

基于51单片机ds18b20仿真+详细注释的代码

[复制链接]
ID:267001 发表于 2017-12-26 11:58 | 显示全部楼层 |阅读模式
基于51单片机 18b20仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png 0.png

单片机源程序如下(带有详细的注释):
  1. #include<reg51.h>
  2. #include<lcd1602.h>
  3. #include<18b20.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. bit flag1s = 0;          //1s定时标志
  7. unsigned char T0RH = 0;  //T0重载值的高字节
  8. unsigned char T0RL = 0;  //T0重载值的低字节

  9. void ConfigTimer0(unsigned int ms);
  10. unsigned char IntToString(unsigned char *str, int dat);
  11. extern bit Start18B20();
  12. extern bit Get18B20Temp(int *temp);
  13. extern void InitLcd1602();
  14. extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);

  15. void main()
  16. {
  17.     bit res;
  18.     int temp;        //读取到的当前温度值
  19.     int intT, decT;  //温度值的整数和小数部分
  20.     unsigned char len;
  21.     unsigned char str[12];

  22.     EA = 1;            //开总中断
  23.     ConfigTimer0(10);  //T0定时10ms
  24.     Start18B20();      //启动DS18B20
  25.     InitLcd1602();     //初始化液晶
  26.    
  27.     while (1)
  28.     {
  29.         if (flag1s)  //每秒更新一次温度
  30.         {
  31.             flag1s = 0;
  32.             res = Get18B20Temp(&temp);  //读取当前温度
  33.             if (res)                    //读取成功时,刷新当前温度显示
  34.             {
  35.                 intT = temp >> 4;             //分离出温度值整数部分
  36.                 decT = temp & 0xF;            //分离出温度值小数部分
  37.                 len = IntToString(str, intT); //整数部分转换为字符串
  38.                 str[len++] = '.';             //添加小数点
  39.                 decT = (decT*10) / 16;        //二进制的小数部分转换为1位十进制位
  40.                 str[len++] = decT + '0';      //十进制小数位再转换为ASCII字符
  41.                 while (len < 6)               //用空格补齐到6个字符长度
  42.                 {
  43.                     str[len++] = ' ';
  44.                 }
  45.                 str[len] = '\0';              //添加字符串结束符
  46.                 LcdShowStr(0, 0, str);        //显示到液晶屏上
  47.             }
  48.             else                        //读取失败时,提示错误信息
  49.             {
  50.                 LcdShowStr(0, 0, "error!");
  51.             }
  52.             Start18B20();               //重新启动下一次转换
  53.         }
  54.     }
  55. }
  56. /* 整型数转换为字符串,str-字符串指针,dat-待转换数,返回值-字符串长度 */
  57. unsigned char IntToString(unsigned char *str, int dat)
  58. {
  59.     signed char i = 0;
  60.     unsigned char len = 0;
  61.     unsigned char buf[6];
  62.    
  63.     if (dat < 0)  //如果为负数,首先取绝对值,并在指针上添加负号
  64.     {
  65.         dat = -dat;
  66.         *str++ = '-';
  67.         len++;
  68.     }
  69.     do {          //先转换为低位在前的十进制数组
  70.         buf[i++] = dat % 10;
  71.         dat /= 10;
  72.     } while (dat > 0);
  73.     len += i;     //i最后的值就是有效字符的个数
  74.     while (i-- > 0)   //将数组值转换为ASCII码反向拷贝到接收指针上
  75.     {
  76.         *str++ = buf[i] + '0';
  77.     }
  78.     *str = '\0';  //添加字符串结束符
  79.    
  80.     return len;   //返回字符串长度
  81. }
  82. /* 配置并启动T0,ms-T0定时时间 */
  83. void ConfigTimer0(unsigned int ms)
  84. {
  85.     unsigned long tmp;  //临时变量
  86.    
  87.     tmp = 11059200 / 12;      //定时器计数频率
  88.     tmp = (tmp * ms) / 1000;  //计算所需的计数值
  89.     tmp = 65536 - tmp;        //计算定时器重载值
  90.     tmp = tmp + 2;            //补偿中断响应延时造成的误差
  91.     T0RH = (unsigned char)(tmp>>8);  //定时器重载值拆分为高低字节
  92.     T0RL = (unsigned char)tmp;
  93.     TMOD &= 0xF0;   //清零T0的控制位
  94.     TMOD |= 0x01;   //配置T0为模式1
  95.     TH0 = T0RH;     //加载T0重载值
  96.     TL0 = T0RL;
  97.     ET0 = 1;        //使能T0中断
  98.     TR0 = 1;        //启动T0
  99. }
  100. ……………………

  101. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
16.18b20.zip (99.28 KB, 下载次数: 133)
回复

使用道具 举报

ID:301249 发表于 2018-9-6 00:15 | 显示全部楼层
附件中没有仿真
回复

使用道具 举报

ID:389904 发表于 2018-9-9 17:22 | 显示全部楼层
附件中没有仿真
回复

使用道具 举报

ID:146834 发表于 2018-11-28 21:44 | 显示全部楼层
谢谢。
回复

使用道具 举报

ID:259302 发表于 2018-12-22 12:04
有病毒

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

本版积分规则

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

Powered by 单片机教程网

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