找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机DS18B20温度检测报警系统串口设置阀值-仿真及源程序

[复制链接]
ID:190577 发表于 2023-11-15 14:32 | 显示全部楼层 |阅读模式
一、系统方案
1、本设计采用51单片机作为主控器。
2、DS18B20采集温度值送到数码管显示。
3、按键报警阀值或串口设置阀值。
4、测量温度小于下限或大于上限,蜂鸣器报警。
1.png

二、硬件设计
原理图如下:
2.png
三、单片机软件设计
1、首先是系统初始化
uint z;
        init_eeprom();  //开始初始化保存的数据
        InitTimer();    //初始化定时器
        wendu=ReadTemperature()-5;                          //获取温度值并减去DS18B20的温漂误差
        for(z=0;z<300;z++)
        {
                Disp_init();        
        }
        Uart_init();
2、显示程序
  1. /*****显示报警温度子程序*****/
  2. void Disp_alarm(uchar baojing)
  3. {
  4.         P0 =LEDData[baojing%10];      //
  5.         P2 = 0xBF;
  6.         Delay(100);
  7.         P2=0xff;

  8.         P0 =LEDData[baojing%100/10]; //显示十位
  9.         P2 = 0xEF;
  10.         Delay(100);
  11.         P2=0xff;

  12.         if(set_st==1&&H_ZF==0&&baojing/100!=0)
  13.         P0 =LEDData[baojing/100]; //显示百位
  14.         else if(set_st==1&&H_ZF==0&&baojing/100==0)
  15.         P0=0x00;
  16.         else if(set_st==1&&H_ZF==1)
  17.         P0=0x80;
  18.         else if(set_st==2&&L_ZF==0&&baojing/100!=0)
  19.         P0 =LEDData[baojing/100]; //显示百位
  20.         else if(set_st==2&&L_ZF==0&&baojing/100==0)
  21.         P0=0x00;
  22.         else if(set_st==2&&L_ZF==1)
  23.         P0=0x80;
  24.         P2 = 0xFB;
  25.         Delay(100);
  26.         P2=0xff;

  27.         if(set_st==1)P0 =0xCE;
  28.         else if(set_st==2)P0 =0x1A; //上限H、下限L标示
  29.         P2 = 0xFE;
  30.         Delay(100);
  31.         P2 = 0xff;         //关闭显示
  32. }
复制代码


3、按键程序
  1. /*****外部中断1服务程序*****/
  2. void int1(void) interrupt 2
  3. {
  4.         EX1=0;      //关外部中断1
  5.         if(ADD==0&&set_st==1)
  6.         {
  7.                 BEEP=0;
  8.                 Delay(2000);
  9.                 BEEP=1;
  10.                 do
  11.                 {
  12.                         Disp_alarm(shangxian);
  13.                 }
  14.                 while(ADD==0);
  15.                 if(H_ZF==0)
  16.                 {
  17.                         shangxian++;
  18.                         if(shangxian>=125)shangxian=125;
  19.                 }
  20.                 else if(H_ZF==1)
  21.                 {
  22.                         shangxian--;
  23.                         if(shangxian<=0)
  24.                         {
  25.                                 shangxian=0;
  26.                                 H_ZF=0;
  27.                         }
  28.                 }
  29.         }                        
  30.         else if(ADD==0&&set_st==2)
  31.         {
  32.                 BEEP=0;
  33.                 Delay(2000);
  34.                 BEEP=1;
  35.                 do
  36.                 {
  37.                         Disp_alarm(xiaxian);
  38.                 }
  39.                 while(ADD==0);
  40.                 if(L_ZF==0)
  41.                 {
  42.                         xiaxian++;
  43.                         if(xiaxian>=shangxian-1)
  44.                                 xiaxian=shangxian-1;        
  45.                 }
  46.                 else if(H_ZF==0&&L_ZF==1)
  47.                 {
  48.                         xiaxian--;
  49.                         if(xiaxian<=0)
  50.                         {
  51.                                 if(shangxian==0)
  52.                                 {
  53.                                         xiaxian=1;
  54.                                         L_ZF=1;
  55.                                 }
  56.                                 else
  57.                                 {
  58.                                         xiaxian=0;
  59.                                         L_ZF=0;
  60.                                 }
  61.                         }
  62.                 }
  63.                 else if(H_ZF==1&&L_ZF==1)
  64.                 {
  65.                         xiaxian--;
  66.                         if(xiaxian<=shangxian+1)
  67.                                 xiaxian=shangxian+1;
  68.                 }
  69.         }  
  70. }
复制代码


4、核心算法程序
  1. /*****初始化DS18B20*****/
  2. void Init_DS18B20(void)
  3. {
  4.   unsigned char x=0;
  5.   DQ = 1;         //DQ复位
  6.   Delay_DS18B20(8);    //稍做延时
  7.   DQ = 0;         //单片机将DQ拉低
  8.   Delay_DS18B20(80);   //精确延时,大于480us
  9.   DQ = 1;         //拉高总线
  10.   Delay_DS18B20(34);
  11. }
  12. /*****读一个字节*****/
  13. unsigned char ReadOneChar(void)
  14. {
  15.   unsigned char i=0;
  16.   unsigned char dat = 0;
  17.   for (i=8;i>0;i--)
  18.   {
  19.     DQ = 0;     // 给脉冲信号
  20.     dat>>=1;
  21.     DQ = 1;     // 给脉冲信号
  22.     if(DQ)
  23.     dat|=0x80;
  24.     Delay_DS18B20(4);
  25.   }
  26.   return(dat);
  27. }
  28. /*****写一个字节*****/
  29. void WriteOneChar(unsigned char dat)
  30. {
  31.   unsigned char i=0;
  32.   for (i=8; i>0; i--)
  33.   {
  34.     DQ = 0;
  35.     DQ = dat&0x01;
  36.     Delay_DS18B20(5);
  37.     DQ = 1;
  38.     dat>>=1;
  39.   }
  40. }
  41. /*****读取温度*****/
  42. unsigned int ReadTemperature(void)
  43. {
  44.   unsigned char a=0;
  45.   unsigned char b=0;
  46.   unsigned int t=0;
  47.   float tt=0;
  48.   Init_DS18B20();
  49.   WriteOneChar(0xCC);  //跳过读序号列号的操作
  50.   WriteOneChar(0x44);  //启动温度转换
  51.   Init_DS18B20();
  52.   WriteOneChar(0xCC);  //跳过读序号列号的操作
  53.   WriteOneChar(0xBE);  //读取温度寄存器
  54.   a=ReadOneChar();     //读低8位
  55.   b=ReadOneChar();    //读高8位
  56.   t=b;
  57.   t<<=8;
  58.   t=t|a;
  59.   if(t&0xf800)
  60.   {
  61.         t=~t+1;
  62.         fuhao=1;
  63.   }
  64.   else
  65.   fuhao=0;
  66.   tt=t*0.0625;
  67.   t= tt*10+0.5;     //放大10倍输出并四舍五入
  68.   return(t);
  69. }
复制代码


四、 proteus仿真设计
Proteus软件是一款应用比较广泛的工具,它可以在没有硬件平台的基础上通过自身的软件仿真出硬件平台的运行情况,这样就可以通过软件仿真来验证我们设计的方案有没有问题,如果有问题,可以重新选择器件,连接器件,直到达到我们设定的目的,避免我们搭建实物的时候,如果当初选择的方案有问题,我们器件都已经焊接好了,再去卸载下去,再去焊接新的方案的器件,测试,这样会浪费人力和物力,也给开发者带来一定困惑,Proteus仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。


评分

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

查看全部评分

回复

使用道具 举报

ID:226658 发表于 2023-11-16 09:46 | 显示全部楼层
好东西值得拥有,楼主,提供源代码下载吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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