找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2491|回复: 2
收起左侧

我的单片机数字温度实验 含源代码,Proteus仿真原理图

[复制链接]
ID:1008663 发表于 2022-3-7 11:17 | 显示全部楼层 |阅读模式
这是我做的单片机数字温度课实验,
用了两个星期的时间,
附件里面包含数字温度的单片机的源码
和Proteus仿真工程文件
51hei.gif

proteus原理图

proteus原理图

源代码的一部分

源代码的一部分


单片机源程序如下:
  1. #include <reg52.h>
  2. #include "ds18b20.h"
  3. #include "ds1302.h"
  4. #include "lcd1602.h"

  5. //LED引脚定义
  6. sbit LED_LOW=P1^4;                //低温度报警
  7. sbit LED_NORMAL=P1^5; //正常温度
  8. sbit LED_HIGH=P1^6;   //高温报警

  9. //按键引脚定义
  10. sbit k1=P3^4;        //模式切换(按键温度上下限+或温度上下限-)
  11. sbit k2=P3^2;        //设置温度下限
  12. sbit k3=P3^3; //设置温度上限

  13. //DS1302相关
  14. uchar  times[9];//保存时间
  15. uchar  date[11];//保存日期

  16. //温度数据
  17. uchar HT=40;        //温度上限
  18. uchar LT=15;        //温度下限
  19. uchar WenduData[6]; //实时温度
  20. uchar HTem[3],LTem[3];//温度上下限

  21. //全局变量定义
  22. bit flag=0;//模式切换标志位


  23. //主函数
  24. void main()
  25. {
  26.         EA=1;      //开总中断
  27.         TCON=0x05; //外部中断0,1设置为边沿触发
  28.         EX0=1;     //开外部中断0
  29.         EX1=1;                 //开外部中断1
  30.         //init_1302(time_1302);
  31.         ReadTemperature();//预读取温度并延时跳过默认初始温度显示
  32.         Delay(50000);
  33.         Delay(50000);
  34.         LCD_init();//LCD初始化
  35.         while(1)
  36.         {        
  37.                 if(k1==0){ //按下KEY1时,切换温度上下限设置方向
  38.                         Delay(5);
  39.                         while(k1==0);
  40.                         flag=~flag;
  41.                 }
  42.                 Disp_Temperature();//显示温度
  43.                 Delay(500);
  44.                
  45.                 get_1302(time_1302);//获取时间
  46.                 change(); //时间转换
  47.                
  48.                 gotoxy(8,2);
  49.                 LCD_display(times);//显示时间
  50.         }
  51. }

  52. //温度转换显示函数
  53. void Disp_Temperature()     //显示温度
  54. {
  55.         uint a,b,c,d,e,m;  
  56.   e=ReadTemperature();  //获取温度值
  57.   a=e/1000;             //计算得到十位数
  58.   b=e/100-a*10;         //计算得到个位数字  
  59.   d=e%10;               //计算得到小数点后两位
  60.   c=(e%100)/10;         //计算得到小数点后一位
  61.   m=e/100;  
  62.         
  63.         //温度不在范围内报警
  64.         if( m<LT){ //温度超过温度上限
  65.                 LED_LOW=0;
  66.                 LED_HIGH=1;//黄灯亮
  67.                 LED_NORMAL=1;
  68.         }         
  69.         else if(m>HT){ //温度低于温度下限
  70.                 LED_LOW=1;
  71.                 LED_HIGH=0;//红灯亮
  72.                 LED_NORMAL=1;
  73.         }
  74.         else{        //温度处于正常范围
  75.                 LED_LOW=1;
  76.                 LED_HIGH=1;
  77.                 LED_NORMAL=0;//绿灯亮
  78.         }
  79.         //LCD显示温度数据
  80.         WenduData[0] = a+'0';
  81.         WenduData[1] = b+'0';
  82.         WenduData[2] = '.';
  83.         WenduData[3] = c+'0';
  84.         WenduData[4] = d+'0';
  85.         WenduData[5] = '\0';
  86.         LTem[0] = LT/10+'0';
  87.         LTem[1] = LT%10+'0';
  88.         LTem[2] = '\0';
  89.         HTem[0] = HT/10+'0';
  90.         HTem[1] = HT%10+'0';
  91.         HTem[2] = '\0';
  92.         
  93.         gotoxy(1,1);
  94.         LCD_display("LT:");
  95.         gotoxy(4,1);
  96.         LCD_display(LTem);
  97.         gotoxy(1,2);
  98.         LCD_display("HT:");
  99.         gotoxy(4,2);
  100.         LCD_display(HTem);
  101.         gotoxy(8,1);
  102.         LCD_display("T:");
  103.         gotoxy(10,1);
  104.         LCD_display(WenduData);
  105. }

  106. //外部0中断子函数
  107. void int0() interrupt 0
  108. {
  109.         if(k2==0) //按键KEY2按下
  110.         {
  111.                 Delay(5);
  112.                 while(k2==0);
  113.                 if(flag==0)
  114.                         LT++; //温度下限+
  115.                 else
  116.                         LT--;//温度下限-
  117.         }               
  118. }

  119. //外部1中断子函数
  120. void int1() interrupt 2
  121. {
  122.         if(k3==0)
  123.         {
  124.                 Delay(5);
  125.                 while(k3==0);
  126.                 if(flag==0)
  127.                         HT++;//温度上限+
  128.                 else
  129.                         HT--;//温度上限-
  130.         }               
  131. }

  132. //DS1302数值转换
  133. void change()
  134. {
  135. // 时 间 的 转 换
  136.   times[0]=time_1302[2]/10+'0';
  137.   times[1]=time_1302[2]%10+'0';
  138.   times[2]=':';
  139.   times[3]=time_1302[1]/10+'0';
  140.   times[4]=time_1302[1]%10+'0';
  141.   times[5]=':';
  142.   times[6]=time_1302[0]/10+'0';
  143.   times[7]=time_1302[0]%10+'0';
  144.         times[8]='\0';
  145.   // 日 期 的 转 换
  146.         date[0]='2';
  147.         date[1]='0';
  148.   date[2]=time_1302[6]/10+'0';
  149.   date[3]=time_1302[6]%10+'0';
  150.   date[4]='/';
  151.   date[5]=time_1302[4]/10+'0';
  152.   date[6]=time_1302[4]%10+'0';
  153.   date[7]='/';
  154.   date[8]=time_1302[3]/10+'0';
  155.   date[9]=time_1302[3]%10+'0';
  156.         date[10]='\0';
  157. }
复制代码

Keil代码与Proteus仿真下载:
ds18b20数字温度计.7z (112.68 KB, 下载次数: 50)

评分

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

查看全部评分

回复

使用道具 举报

ID:1036340 发表于 2022-6-22 11:44 | 显示全部楼层
keil2能用吗
回复

使用道具 举报

ID:1035505 发表于 2022-6-24 05:12 来自手机 | 显示全部楼层
用protues8.9可以仿得起来吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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