找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于单片机的温度传感器DS18B20显示温度 仿真图,流程图,源程序,文档

[复制链接]
跳转到指定楼层
楼主
这是我几周前做的单片机实验,用LCD液晶显示温度传感器的温度
其中包含仿真,源程序,流程图等

单片机源程序如下:
  1. uint temp;
  2. float f_temp;
  3. uchar code table1[] = {"DATA:2014-7-10"};
  4. uchar code table2[] = {"Temperature:xx c"};
  5. uchar code table3[] = {"0123456789"};

  6. void delay(uint xms)
  7. {                           // 延时函数
  8.         uint i,j;
  9.         for(i = xms;i > 0;i--)
  10.                 for(j = 110;j > 0;j--);
  11. }
  12. /*******************************************************************/      
  13. /*                                                                                                                                 
  14. /*                  DS18B20温度传感器模块                                    
  15. /*                                                                        
  16. /*******************************************************************/
  17. void dsreset(void)    //18B20复位,初始化函数
  18. {
  19.   uint i;
  20.   ds=0;
  21.   i=103;
  22.   while(i>0)i--;
  23.   ds=1;
  24.   i=4;
  25.   while(i>0)i--;
  26. }

  27. bit tempreadbit()   //读1位数据函数
  28. {
  29.    uint i;
  30.    bit dat;
  31.    ds=0;i++;          //i++ 起延时作用
  32.    ds=1;i++;i++;
  33.    dat=ds;
  34.    i=8;while(i>0)i--;
  35.    return dat;
  36. }

  37. uchar tempread()   //读1个字节
  38. {
  39.   uchar i,j,dat;
  40.   dat=0;
  41.   for(i=1;i<=8;i++)
  42.   {
  43.     j=tempreadbit();
  44.     dat=(j<<7)|(dat>>1);   //读出的数据最低位在最前面,这样刚好一个字节在DAT里
  45.   }
  46.   return dat;
  47. }

  48. void tempwritebyte(uchar dat)   //向DS18B20写一个字节数据函数
  49. {
  50.   uint i;
  51.   uchar j;
  52.   bit testb;
  53.   for(j=1;j<=8;j++)
  54.   {
  55.     testb=dat&0x01;
  56.     dat=dat>>1;
  57.     if(testb)     //写 1
  58.     {
  59.       ds=0;
  60.       i++;i++;
  61.       ds=1;
  62.       i=8;while(i>0)i--;
  63.     }
  64.     else
  65.     {
  66.       ds=0;       //写 0
  67.       i=8;while(i>0)i--;
  68.       ds=1;
  69.       i++;i++;
  70.     }

  71.   }
  72. }
  73. void tempchange(void)   //DS18B20 开始获取温度并转换
  74. {
  75.   dsreset();
  76.   delay(1);
  77.   tempwritebyte(0xcc);  // 写跳过读ROM指令
  78.   tempwritebyte(0x44);  // 写温度转换指令
  79. }
  80. uint get_temp()         //读取寄存器中存储的温度数据函数
  81. {
  82.   uchar a,b;

  83.   dsreset();
  84.   delay(1);
  85.   tempwritebyte(0xcc);
  86.   tempwritebyte(0xbe);
  87.   a=tempread();         //读低8位
  88.   b=tempread();         //读高8位
  89.   temp=b;
  90.   temp<<=8;            //两个字节组合为1个字
  91.   temp=temp|a;
  92.   f_temp=temp*0.0625;      //温度在寄存器中为12位 分辨率位0.0625°
  93.   temp=f_temp*10+0.5; //乘以10表示小数点后面只取1位,加0.5是四舍五入
  94.   f_temp=f_temp+0.05;
  95.   return temp;         //temp是整型
  96. }
  97. /*******************************************************************/      
  98. /*                                                                                                                                 
  99. /*                      1602液晶模块                                    
  100. /*                                                                        
  101. /*******************************************************************/                                                                                                        
  102. void lcd_wcmd(uchar cmd)   // 写入指令数据到LCD
  103. {                          //RS=L,RW=L,E=高脉冲,D0-D7=指令码。
  104.         LCD_RS = 0;
  105.         LCD_RW = 0;
  106.         LCD_EP = 0;
  107.         P0 = cmd;
  108.         delay(1);
  109.         LCD_EP = 1;
  110.         delay(1);
  111.         LCD_EP = 0;  
  112. }  
  113. void lcd_wdata(uchar dat)  //写入字符显示数据到LCD
  114. {                          //RS=H,RW=L,E=高脉冲,D0-D7=数据
  115.         LCD_RS = 1;
  116.         LCD_RW = 0;
  117.         LCD_EP = 0;
  118.         P0 = dat;
  119.         delay(1);
  120.         LCD_EP = 1;
  121.         delay(1);
  122.         LCD_EP = 0;
  123. }
  124. void lcd_init()                          //LCD初始化设定初始化函数
  125. {                        
  126.         lcd_wcmd(0x38);       //16*2显示,5*7点阵,8位数据
  127.         delay(1);                        
  128.         lcd_wcmd(0x0c);       //设置开显示,不显示光标
  129.         delay(1);
  130.         lcd_wcmd(0x06);       //写一个字符后地址指针加1
  131.         delay(1);
  132.         lcd_wcmd(0x01);       //显示清0,数据指针清0
  133.         delay(1);
  134. }
  135. /*******************************************************************/      
  136. /*                                                                                                                                 
  137. /*                         主函数                                    
  138. /*                                                                        
  139. /*******************************************************************/
  140. void main()
  141. {
  142.         uchar i;
  143.           beep = 0;                                 //蜂鸣器默认处于开启状态,所以关闭它
  144.         lcd_init();                                 //LCD初始化
  145.         delay(10);
  146.         i = 0;
  147.         lcd_wcmd(0x80);                 //第1行第1列
  148.         while(table1[i] != '\0') //按键1对应的字样
  149.            {                                 
  150.                lcd_wdata(table1[i]);
  151.                i++;           
  152.     }
  153.         i = 0;
  154.         lcd_wcmd(0x80+0x40);         //第2行第1列
  155.         while(table2[i] != '\0') //按键1对应的字样
  156.            {                                 
  157.                lcd_wdata(table2[i]);
  158.                i++;           
  159.     }
  160.         lcd_wcmd(0x80+0x4e);         // 设置显示位置为第二行第13个字符
  161.         lcd_wdata(0xdf);             // 显示字符°        
  162.     while(1)
  163.          {   
  164.             tempchange();
  165.                 lcd_wcmd(0x80+0x4c);
  166.                 lcd_wdata(table3[get_temp()/100]);           //温度的十位
  167.                 lcd_wdata(table3[get_temp()%100/10]);  //温度的个位                           
  168.          }
  169. }
复制代码

基于单片机液晶显示温度.docx (394.6 KB, 下载次数: 210)

image1.jpg (93 KB, 下载次数: 40)

仿真图

仿真图

image2.jpeg (67.95 KB, 下载次数: 37)

image2.jpeg

image3.jpg (208.56 KB, 下载次数: 39)

拆分程序

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

使用道具 举报

沙发
ID:764811 发表于 2020-5-30 10:05 | 只看该作者
能发一下剩下的程序吗?
回复

使用道具 举报

板凳
ID:742391 发表于 2020-5-31 10:32 | 只看该作者
我下载了没仿真啊能发一下仿真么?
回复

使用道具 举报

地板
ID:682190 发表于 2020-6-16 08:53 | 只看该作者
怎么没有整套的仿真图
回复

使用道具 举报

5#
ID:1081907 发表于 2023-6-4 14:28 | 只看该作者
能发一下整套程序吗  谢谢
回复

使用道具 举报

6#
ID:915969 发表于 2023-6-5 14:51 | 只看该作者
1731362105@qq.c 发表于 2020-5-30 10:05
能发一下剩下的程序吗?

加一
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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