找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC15W408AS+DS18B20+3位数码管显示的温度报警器

  [复制链接]
跳转到指定楼层
楼主
  逛了好久的51黑论坛,感觉51黑就是一个知识的海洋。论坛里的大师都很热情的帮忙回答问题,受益匪浅。
前两日看论坛内某位大师发的一个DS18B20的温度报警器。正好手里有现成的芯片和数码管,于是就DIY了一个(用的是某创的EDA软件),硬件部分已经打样了,过两天有空焊上去测试一下。软件部分是根据论坛内的程序稍微修改的IO接口;但是编译后提示有10个报警,但是能正常生成HEX文件,因小弟能力有限,找不到是哪里有问题,如果哪位大师愿意能帮忙看看是哪里问题。小弟在这先行谢过了。
  初次发作品,希望大师们多提宝贵意见。不慎感激!














部分代码:
/*********************************************************************************************/
//2023.01.05编写        摘自51黑电子的大神分享的程序基础上修改
//hgh
//硬件:三位共阴数码管+stc15单片机+DS18B20温度芯片+蜂鸣器//选择内部11.0592M晶振
#include <STC15W.h>
#include <intrins.h>
#include<4LED_YIN.H>//数码管驱动显示程序
#include<DS18B20.H>//DS18B20温度芯片驱动程序
#include<EEPROM.H>//STC15系列内部EEPROM
bit w=0,q;//报警标志位
sbit beep=P2^5;//蜂鸣器负极连接IO正极接vcc
sbit k1=P1^3;//设置键
sbit k2=P1^4;//        加键
sbit k3=P1^5;//         减键
sbit led =P2^6;

unsigned char menu=0,cou,HH,HL,LH,LL;//HH为温度上限高8位HL为温度上限低8位
//LH为温度下限高8位LL为温度下限低8位
unsigned int L,H;//H为温度上限,L为温度下限
/************************************************************************/
void delay1ms (unsigned int a){ // 1ms延时程序
        unsigned int i;
        while( --a != 0){
                for(i = 0; i < 629; i++);//STC15单片机在外部晶振为12MHz时i值上限为629  
        }                                                       
}
/*****************************************************************************/
void disp(unsigned int t){//数码管显示
unsigned int i;
i=        t/100;//第一位数码管显示温度十位
diplay_data (1,disdata);
i=t%100/10;//第二位数码管显示温度个位
diplay_data (2,disdata+0x80);//0x80为个位数后面的小数点
i=t%100%10;//第三位数码管显示温度小数位
diplay_data (3,disdata);
}
/***********************************************/
void di(){//蜂鸣器驱动程序
        beep=0;
        delay1ms(500);
        beep=1;
        delay1ms(500);
        }
/*********************************************************************************************
函数名:定时/计数器初始化函数
调  用:T_C_init();
/**********************************************************************************************/
void T_C_init (void){
        TMOD = 0x11; //高4位控制T/C1 [ GATE,C/T,M1,M0,GATE,C/T,M1,M0 ]
        EA = 1;        //中断总开关
        TH0 = 0x3c; //16位计数寄存器T0高8位(写入初值)
        TL0 = 0xb0; //16位计数寄存器T0低8位
        ET0 = 1; //T/C1中断开关
        TR0 = 0; //T/C1关闭开关       
}
/*********************************************************************************************
函数名:定时/计数器1中断处理函数
调  用:[T/C1溢出后中断处理]
/*****************************/
void T_C0 (void) interrupt 1  using 1{ //切换寄存器组到1
    cou++;                      // 软计数器加1   
    if(cou > 99){// 计数值到(5s)
        cou = 0;// 软计数器清零
        IapEraseSector(0x00); //擦除整个扇区
        IapProgramByte(0x00,HH );//将 新的温度上限值高8位写入 EEPROM
        IapProgramByte(0x01, HL);//将 新的温度上限值低8位写入 EEPROM
        IapProgramByte(0x02,LH );//将 新的温度下限值高8位写入 EEPROM
        IapProgramByte(0x03, LL);//将 新的温度下限值低8位写入 EEPROM         
        TR0 = 0; //T/C1停止计数
        menu=0;//返回 主菜单的温度显示界面                 
    }               
        TH0 = 0x3c; //16位计数寄存器T0高8位(重新写入初值)
        TL0 = 0xb0; //16位计数寄存器T0低8位
}
/**********************************************************************************************/
/**********************************************************************************************/
void main (void){
        unsigned char i;
        delay1ms(300); //延时待系统稳定
        init();//IO工作方式初始化
        T_C_init();//定时器初始化
        led=1;
       
        ReadTemperature(); //读取温度
        HH = IapReadByte(0x00);//开机时从EEPROM中读取H高8位参数
        HL = IapReadByte(0x01);//开机时从EEPROM中读取H的低8位参数
        H=HH*256+HL;//读出温度上限值
        LH = IapReadByte(0x02);//开机时从EEPROM中读取L高8位参数
        LL = IapReadByte(0x03);//开机时从EEPROM中读取L的低8位参数
        L=LH*256+LL;//读出温度下限值
        while(1){//主循环
                         
/**********************显示温度界面******************************/
                  if(menu==0){
                           for(i=15;i>0;i--){
                           disp(ReadTemperature());}
                          if(tem>=H&&w==0||tem<=L&&w==0){
                            di();//超温或者低温报警
                          q=1;
                          led=0;
                            }
                  
                          if(k3==0&&q==1){w=1;}//如果报警时按下K1则关闭报警声
                          if(tem<=H&&tem>=L){w=0;}//如果温度恢复正常把报警标志清除
                        if(k2==0&&k3==0){//k2k3同时按下温度上限下限值恢复出厂设置
                                delay1ms(10);
                                if(k2==0&&k3==0){
                                        H=280;//温度上限28度
                                        L=220;//温度下限22度
                                        LL=L;
                                        LH=(L>>8);
                                        HL=H;
                                        HH=(H>>8);
                                        IapEraseSector(0x00); //擦除整个扇区
                                        IapProgramByte(0x00,HH );//将 新的温度上限值高8位写入 EEPROM
                                        IapProgramByte(0x01, HL);//将 新的温度上限值低8位写入 EEPROM
                                        IapProgramByte(0x02,LH );//将 新的温度下限值高8位写入 EEPROM
                                        IapProgramByte(0x03, LL);//将 新的温度下限值低8位写入 EEPROM         
                                        di();
                                }
                        }       
                   }
/*********************进入调温度上限界面*******************************/
                  if(menu==1){
                         diplay_data (1,disdata[H/100]);
                         diplay_data (2,disdata[H%100/10]+0x80);
                         diplay_data (3,disdata[H%10]);
                         if(k2==0){
                                delay1ms(10);
                                 if(k2==0){
                                H++; //按下K1键则温度上限加零点一度
                                 cou=0;//重新计数
                                 TR0 = 1; //T/C1启动开关
                                   
                                 while(!k2);
                                HL=H;
                                HH=(H>>8);
                                }
                          }
                         if(k3==0){
                                delay1ms(10);
                                 if(k3==0){
                                H--; //按下K1键则温度上限减零点一度
                                 cou=0;//重新计数
                                 TR0 = 1; //T/C1启动开关
                                   
                                 while(!k3);
                                HL=H;
                                HH=(H>>8);
                                }
                          }
                       
                  }
/*******************进入调温度下限界面****************************/
                   if(menu==2){
                         diplay_data (1,disdata[L/100]);
                         diplay_data (2,disdata[L%100/10]+0x80);
                         diplay_data (3,disdata[L%10]);
                         if(k2==0){
                                delay1ms(10);
                                 if(k2==0){
                                 cou=0;//重新计数
                                 TR0 = 1; //T/C1启动开关
                                    L++; //按下K1键则温度下限加零点一度
                                 while(!k2);
                                LL=L;
                                LH=(L>>8);
                                }
                         }

                         if(k3==0){
                                delay1ms(10);
                                 if(k3==0){
                                cou=0;//重新计数
                                 TR0 = 1; //T/C1启动开关
                                    L--; //按下K1键则温度下限减零点一度
                                 while(!k3);
                                LL=L;
                                LH=(L>>8);                               
                             }
                        }
                  }
/*************************按下K1键进入菜单设置界面***************************/
                  if(k1==0){
                         delay1ms(10);
                         if(k1==0){
                         cou=0;//重新计数
                         TR0 = 1; //T/C1启动开关
                            menu++; //按下K1键则菜单加一
                           if(menu>2){menu=0;}
                         while(!k1);
                        }
                   }                               
        }       
}
/*****************************************************************************/

温度报警器.rar (2.55 MB, 下载次数: 71)






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

使用道具 举报

沙发
ID:1057978 发表于 2023-1-27 15:17 | 只看该作者
你应该把编译结果截图出来,大家可以看到具体报什么警告帮你分析一下,
回复

使用道具 举报

板凳
ID:1001745 发表于 2023-2-6 12:24 | 只看该作者
这是编译的结果截图。
回复

使用道具 举报

地板
ID:427868 发表于 2023-2-10 11:33 | 只看该作者
    问题出在开始处:#include <STC15W.h>。找不到这个头文件吧。我改为#include <STC15.h>就去掉了前几条错误,因为我的keil内有stc15.h头文件。
     后3条DS18B20.H文件内的错误系第21行在函数内定义了局部变量i、j、k,但在函数内并没有使用,所以报错,删去或者不用即可。
回复

使用道具 举报

5#
ID:1001745 发表于 2023-2-10 19:50 | 只看该作者
刘佑红 发表于 2023-2-10 11:33
问题出在开始处:#include 。找不到这个头文件吧。我改为#include 就去掉了前几条错误,因为我的keil内 ...

谢谢大神,果然厉害啊。我这个程序会导致数码管动态显示的时候出来笔画暗淡的问题,请问如何修改?看另一个贴的链接http://www.51hei.com/bbs/dpj-226686-1.html
回复

使用道具 举报

6#
ID:483407 发表于 2023-2-11 19:49 | 只看该作者
显示笔画暗淡,应该是PR1、PR2取值过大吧,与程序无关。
回复

使用道具 举报

7#
ID:1001745 发表于 2023-2-13 12:08 | 只看该作者
wangwing 发表于 2023-2-11 19:49
显示笔画暗淡,应该是PR1、PR2取值过大吧,与程序无关。

不是的,全显的时候是正常的相同亮度。就动态显示就有部分笔画显示暗淡。
回复

使用道具 举报

8#
ID:89072 发表于 2023-3-9 11:01 | 只看该作者
mcuhui 发表于 2023-2-13 12:08
不是的,全显的时候是正常的相同亮度。就动态显示就有部分笔画显示暗淡。

刷新时间有点短,显示就暗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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