找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1935|回复: 1
收起左侧

基于单片机的温度计仿真程序设计 达到门限温度亮灯

[复制链接]
ID:805923 发表于 2020-7-20 20:51 | 显示全部楼层 |阅读模式
本帖是关于单片机的温度计显示
传感器用的是ds18b20,
采用数码管动态显示,可显示3位数的温度,第二位带小数点
本实验还包括蜂鸣器报警,温度高于某值,蜂鸣器报警
附件包括仿真原理图,proteus工程文件夹,txt格式的代码

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
  • 实验目的
熟练掌握C语言的设计和调试方法,了解与掌握数字温度传感器DS18B20的工作原理。
  • 实验内容
利用数字温度传感器DS18B20与单片机结合来测量温度控制器使用单片机AT89C51,测温传感器使用DS18B20,用3位LED数码管以串口传送数据,实现温度显示。且设置一个门限温度,当传感器温度达到门限温度后,发出提醒。
  • 实验要求
要求完成实验内容,LED数码管成功显示示数。设置报警门限,若温度超限蜂鸣器报警。
  • 实验硬件电路

图1 硬件电路图





  • 实验结果及分析

图 1未达门限温度截过图

图 2达到门限温度结果图

  • 实验总结及建议

实验总结:通过这次实验,我了解了DS13B20的基本原理和编程方法,更加熟悉了多位数码管的动态显示,自己的编写代码的能力也增强了许多。但这次实验也反映了自己的一些问题,编写基本的代码还可以,稍微有些难度的代码就编写不出来了,以后会多加练习,克服这个问题。


单片机源程序如下:


  1. /* Main.c file generated by New Project wizard
  2. *
  3. * Created:   周一 7月 6 2020
  4. * Processor: AT89C52
  5. * Compiler:  Keil for 8051
  6. */

  7. #include <reg51.h>
  8. #include <stdio.h>
  9. #define uint unsigned int
  10. #define uchar unsigned char
  11. sbit X=P2^6;
  12. sbit Y=P2^7;
  13. sbit Z=P2^3;
  14. sbit DQ=P2^2;
  15. uchar code Data[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  16. void delay(uint count)      //delay        延时
  17. {
  18.   uint i;
  19.   while(count)
  20.   {
  21.     i=200;
  22.     while(i>0)
  23.     i--;
  24.     count--;
  25.   }
  26. }
  27. void dsreset(void)       //重置、初始化命令
  28. {
  29.   uint i;
  30.   DQ=0;                 //赋值
  31.   i=103;              //延时480us-960us
  32.   while(i>0)i--;
  33.   DQ=1;                  //赋值
  34.   i=4;
  35.   while(i>0)i--;         //延时15-60us
  36. }

  37. bit tmpreadbit(void)       //读一位
  38. {
  39.    uint i;
  40.    bit dat;
  41.    DQ=0;
  42.    i++;          //i++ for delay 延时1us-15us
  43.    DQ=1;
  44.    i++;i++;      //释放总线延时
  45.    dat=DQ;            //读数赋值
  46.    i=8;
  47.    while(i>0)i--;
  48.    return (dat);//返回所获得读数
  49. }

  50. uchar tmpread(void)   //读一个字节 8Bit
  51. {
  52.   uchar i,j,dat;
  53.   dat=0;
  54.   for(i=1;i<=8;i++)//连续读取8位,1字节
  55.   {
  56.     j=tmpreadbit();       //调用读1位的函数
  57.     dat=(j<<7|(dat>>1));   //读出的数据最低位在最前面,动脑想如何设计
  58.   }
  59.   return(dat);//返回1字节的读数
  60. }

  61. void tmpwritebyte(uchar dat)   //写一个字节
  62. {
  63.   uint i;
  64.   uchar j;
  65.   bit testb;//写入的数
  66.   for(j=1;j<=8;j++)//连续写8位
  67.   {
  68.     testb=dat&0x01;//思考如何设计每次读到的1bit
  69.      dat=dat>>1;
  70.     if(testb)     //write 1
  71.     {
  72.       DQ=0;//赋值
  73.       i++;i++;
  74.      DQ=1;//赋值
  75.       i=8;while(i>0)i--;
  76.     }
  77.     else              //write 0
  78.     {
  79.       DQ=0;//赋值      
  80.       i=8;while(i>0)i--;
  81.       DQ=1;//赋值
  82.       i++;i++;
  83.     }
  84.   }
  85. }

  86. void tmpchange(void)  //DS18B20 转换温度
  87. {
  88.   dsreset();//初始化
  89.   delay(1);
  90.   tmpwritebyte(0xcc);//跳过ROM
  91.   tmpwritebyte(0x44);//转换温度
  92. }
  93. void tempread(void)
  94. {
  95.   dsreset();  //写入相关指令,思考要写什么指令
  96.   delay(1);
  97.   tmpwritebyte(0xcc);//跳过RON
  98.   tmpwritebyte(0xbe);//读取暂存器
  99.    }

  100. uint tmp()               //获得温度
  101. {
  102.   float tt;
  103.   uchar a,b;
  104.   uint temp;
  105.   tmpchange();
  106.   tempread();
  107.   a=tmpread();
  108.   b=tmpread();
  109.   temp=b;
  110.   temp<<=8;             //two byte  compose a int variable
  111.   temp=temp|a;
  112.   tt=temp*0.0625;
  113.   temp=tt*10+0.5;
  114.   return temp;
  115. }

  116. void display(uint temp)                        //显示程序
  117. {
  118.    Y=0;
  119.    P0=0xfe;
  120.    Y=1;
  121.    Y=0;
  122.    X=0;
  123.    P0=Data[temp/100];
  124.    X=1;
  125.    X=0;
  126.    delay(1);

  127.    Y=0;
  128.    P0=0xfd;
  129.    Y=1;
  130.    Y=0;
  131.    X=0;
  132.    P0=Data[(temp%100)/10]+0x80;
  133.    X=1;
  134.    X=0;
  135.    delay(1);
  136.    
  137.    Y=0;
  138.    P0=0xfb;
  139.    Y=1;
  140.    Y=0;
  141.    X=0;
  142.    P0=Data[(temp%100)%10];
  143.    X=1;
  144.    X=0;
  145.    delay(1);
  146.    if(temp>=400)         
  147.      {
  148.        Z=0;
  149.           }  
  150.    else Z=1;
  151. }


  152. void main()
  153. {
  154.   uchar a,temp;
  155.   do
  156.   {
  157.     tmpchange();//温度转换
  158.     for(a=10;a>0;a--)  //避免闪烁
  159.     {   
  160.           display(tmp());//调用显示函数
  161.       }

  162.   } while(1);
  163. }
复制代码

所有资料51hei提供下载:

温度计设计.zip (247.08 KB, 下载次数: 36)

评分

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

查看全部评分

回复

使用道具 举报

ID:940398 发表于 2021-6-19 14:40 | 显示全部楼层
仿真工程是Proteus8.8版本的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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