找回密码
 立即注册

QQ登录

只需一步,快速开始

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

带注释的DS18B20测温单片机程序源码

[复制链接]
跳转到指定楼层
楼主
ID:300102 发表于 2018-6-10 14:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机源程序如下:
  1. #include<reg52.h>  
  2. #include<intrins.h>
  3. #include <math.H>
  4. #define uchar  unsigned char  
  5. #define uint  unsigned int
  6. uchar i,L,M;
  7.   uchar datas[] = {0, 0, 0, 0, 0};
  8. sbit ds=P2^2;
  9. sbit RW = P3^6;
  10. sbit RS = P3^5;  
  11. sbit EN = P3^4;
  12. void delay(uchar us)
  13. {
  14.   while(us--);
  15. }
  16. void delayMs(uint a)
  17. {
  18.     uint i, j;
  19.     for(i = a; i > 0; i--)
  20.         for(j = 100; j > 0; j--);
  21. }
  22. /***LCD1602显示***/
  23. void Read_busy()
  24. {
  25.     uchar busy;
  26.   P0=0xff;
  27.   RS = 0;
  28.     RW=1;
  29.   do
  30.       {
  31.      EN = 1;
  32.     busy=P0;
  33.     EN=0;
  34.    }
  35.    while(P0&0x80);//0x80:10000000,判断状态字的最后一位是0还是1.如果是0,则为不忙。不忙的话,则可以跳出do....while循环
  36. }
  37. //读状态,将液晶的状态发回给单片机
  38. void writeCmd(uchar cmd)//写1602命令一个字节
  39. {
  40.     Read_busy();//判断忙
  41.    RS = 0;
  42.     RW=0;
  43.     P0 = cmd;//发送状态字
  44.     EN = 1;//数据送过去以后,1602把它读走。
  45.     EN=0;
  46. }
  47. //1602显示字符串函数
  48. void Write_data(uchar date)
  49. {
  50.      Read_busy();//判断忙不忙   
  51.     RS = 1;
  52.     RW=0;
  53.      P0 = date;//把数据送到数据线上
  54.      EN = 1;
  55.      EN=0;
  56. }
  57. void init()
  58. {
  59.     RW= 0;
  60.     writeCmd(0x38);
  61.     writeCmd(0x0c);
  62.     writeCmd(0x06);
  63.     writeCmd(0x01);
  64. }
  65. /****18B20函数****/
  66. void Init()//DS18B20初始化
  67. {
  68. //uchar t;
  69. ds=1;
  70. _nop_();//小小的延时
  71. ds=0;
  72. delay(75);//拉低总线499.45us;
  73. ds=1;
  74. //t=ds;//把ds的值赋给i,等待ds响应,如果i为1,则传回主函数中去,及检测到了DS18B20的响应
  75. delay(20);
  76. ds=1;//释放总线
  77. _nop_();
  78. //return(t);
  79. }
  80. uchar read_byte()//读数据
  81. {
  82. uchar i,j,dat;
  83.   for(i=0;i<8;i++)
  84. {
  85.    ds=0;
  86.    _nop_();
  87.    ds=1;//释放总线
  88.   _nop_();
  89.   j=ds;//获取数据
  90.   delay(10);
  91.   ds=1;
  92.   _nop_();
  93.   dat=(j<<7|dat>>1);//j左移7位,dat右移。一个字节便被存进去了
  94.     return(dat);
  95. }
  96. }
  97. void write_byte(uchar dat)//写数据
  98. {
  99. uchar i;
  100. for(i=0;i<8;i++)
  101.   {
  102.     ds=0;
  103.   _nop_();
  104.   ds=dat&0x01;//当dat最低位为1时。与上以后还是1.所以就满足时序图的要求了。
  105.   delay(10);
  106.     ds=1;//释放总线,准备下一次数据输入
  107.   _nop_();//释放总线要保持1us
  108.   dat>>=1;
  109.   }
  110. }
  111. void tempcod(uint t) //温度转化。。。显示温度值函数,t传递的是整形的温度值(t是传过来的温度)
  112. {
  113.     uchar temp;
  114.     datas[0] = (temp / 10)+'0';//十位转ASCLL码
  115.     datas[1] = (temp % 10)+'0';//个位转ASCLL码
  116.    /* datas[2] = '\'';
  117.     datas[3] = 'c';
  118.     datas[4] = '0';//字符串结束符
  119.   Write_data(12,1,datas[]);//表示显示在横坐标为12,纵坐标在第二行的地方。*/
  120. }
  121. void display()
  122. {
  123. writeCmd(0x46|0x80);
  124. Write_data(datas[0]);//显示十位
  125.   Write_data(datas[1]);//显示个位
  126.   Write_data('.');
  127.   Write_data(0xdf);
  128.   Write_data('c');
  129. }
  130. main()
  131. {
  132. writeCmd(0x38);//显示设置16*2显示
  133.   writeCmd(0x0c);//开显示
  134. writeCmd(0x06);//地址指针加一
  135. writeCmd(0x80);//显示的位置(地址)
  136. writeCmd(0x01);//清屏
  137. // Write_data(i);
  138. //while(1);//让程序一直停在这里
  139. while(1)
  140. {
  141. Init();
  142. write_byte(0xcc);//跳过ROM指令
  143. write_byte(0x44);//发送温度转化指令
  144. Init();
  145.   write_byte();//读取暂存器的值
  146.   L=read_byte();//低八位
  147.   M=read_byte();//高八位
  148.   i=M;i<<=8;
  149.   i|=L;
  150.    i=i*0.0625*10+0.5;
  151. display(i);
  152. }
  153. }


复制代码

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

使用道具 举报

沙发
ID:633896 发表于 2019-11-1 15:50 | 只看该作者
楼主  你这里面 display里怎么可以放i变量  我用你的程序 编译程序报错
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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