找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

帖子
查看: 3576|回復(fù): 7
收起左側(cè)

STC15W408AS+DS18B20+3位數(shù)碼管顯示的溫度報(bào)警器

  [復(fù)制鏈接]
ID:1001745 發(fā)表于 2023-1-7 13:10 | 顯示全部樓層 |閱讀模式
  逛了好久的51黑論壇,感覺51黑就是一個(gè)知識(shí)的海洋。論壇里的大師都很熱情的幫忙回答問題,受益匪淺。
前兩日看論壇內(nèi)某位大師發(fā)的一個(gè)DS18B20的溫度報(bào)警器。正好手里有現(xiàn)成的芯片和數(shù)碼管,于是就DIY了一個(gè)(用的是某創(chuàng)的EDA軟件),硬件部分已經(jīng)打樣了,過兩天有空焊上去測(cè)試一下。軟件部分是根據(jù)論壇內(nèi)的程序稍微修改的IO接口;但是編譯后提示有10個(gè)報(bào)警,但是能正常生成HEX文件,因小弟能力有限,找不到是哪里有問題,如果哪位大師愿意能幫忙看看是哪里問題。小弟在這先行謝過了。
  初次發(fā)作品,希望大師們多提寶貴意見。不慎感激!


原理圖

原理圖




PCB

PCB




3DPCB圖

3DPCB圖




部分代碼:
/*********************************************************************************************/
//2023.01.05編寫        摘自51黑電子的大神分享的程序基礎(chǔ)上修改
//hgh
//硬件:三位共陰數(shù)碼管+stc15單片機(jī)+DS18B20溫度芯片+蜂鳴器//選擇內(nèi)部11.0592M晶振
#include <STC15W.h>
#include <intrins.h>
#include<4LED_YIN.H>//數(shù)碼管驅(qū)動(dòng)顯示程序
#include<DS18B20.H>//DS18B20溫度芯片驅(qū)動(dòng)程序
#include<EEPROM.H>//STC15系列內(nèi)部EEPROM
bit w=0,q;//報(bào)警標(biāo)志位
sbit beep=P2^5;//蜂鳴器負(fù)極連接IO正極接vcc
sbit k1=P1^3;//設(shè)置鍵
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延時(shí)程序
        unsigned int i;
        while( --a != 0){
                for(i = 0; i < 629; i++);//STC15單片機(jī)在外部晶振為12MHz時(shí)i值上限為629  
        }                                                       
}
/*****************************************************************************/
void disp(unsigned int t){//數(shù)碼管顯示
unsigned int i;
i=        t/100;//第一位數(shù)碼管顯示溫度十位
diplay_data (1,disdata);
i=t%100/10;//第二位數(shù)碼管顯示溫度個(gè)位
diplay_data (2,disdata+0x80);//0x80為個(gè)位數(shù)后面的小數(shù)點(diǎn)
i=t%100%10;//第三位數(shù)碼管顯示溫度小數(shù)位
diplay_data (3,disdata);
}
/***********************************************/
void di(){//蜂鳴器驅(qū)動(dòng)程序
        beep=0;
        delay1ms(500);
        beep=1;
        delay1ms(500);
        }
/*********************************************************************************************
函數(shù)名:定時(shí)/計(jì)數(shù)器初始化函數(shù)
調(diào)  用: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;        //中斷總開關(guān)
        TH0 = 0x3c; //16位計(jì)數(shù)寄存器T0高8位(寫入初值)
        TL0 = 0xb0; //16位計(jì)數(shù)寄存器T0低8位
        ET0 = 1; //T/C1中斷開關(guān)
        TR0 = 0; //T/C1關(guān)閉開關(guān)       
}
/*********************************************************************************************
函數(shù)名:定時(shí)/計(jì)數(shù)器1中斷處理函數(shù)
調(diào)  用:[T/C1溢出后中斷處理]
/*****************************/
void T_C0 (void) interrupt 1  using 1{ //切換寄存器組到1
    cou++;                      // 軟計(jì)數(shù)器加1   
    if(cou > 99){// 計(jì)數(shù)值到(5s)
        cou = 0;// 軟計(jì)數(shù)器清零
        IapEraseSector(0x00); //擦除整個(gè)扇區(qū)
        IapProgramByte(0x00,HH );//將 新的溫度上限值高8位寫入 EEPROM
        IapProgramByte(0x01, HL);//將 新的溫度上限值低8位寫入 EEPROM
        IapProgramByte(0x02,LH );//將 新的溫度下限值高8位寫入 EEPROM
        IapProgramByte(0x03, LL);//將 新的溫度下限值低8位寫入 EEPROM         
        TR0 = 0; //T/C1停止計(jì)數(shù)
        menu=0;//返回 主菜單的溫度顯示界面                 
    }               
        TH0 = 0x3c; //16位計(jì)數(shù)寄存器T0高8位(重新寫入初值)
        TL0 = 0xb0; //16位計(jì)數(shù)寄存器T0低8位
}
/**********************************************************************************************/
/**********************************************************************************************/
void main (void){
        unsigned char i;
        delay1ms(300); //延時(shí)待系統(tǒng)穩(wěn)定
        init();//IO工作方式初始化
        T_C_init();//定時(shí)器初始化
        led=1;
       
        ReadTemperature(); //讀取溫度
        HH = IapReadByte(0x00);//開機(jī)時(shí)從EEPROM中讀取H高8位參數(shù)
        HL = IapReadByte(0x01);//開機(jī)時(shí)從EEPROM中讀取H的低8位參數(shù)
        H=HH*256+HL;//讀出溫度上限值
        LH = IapReadByte(0x02);//開機(jī)時(shí)從EEPROM中讀取L高8位參數(shù)
        LL = IapReadByte(0x03);//開機(jī)時(shí)從EEPROM中讀取L的低8位參數(shù)
        L=LH*256+LL;//讀出溫度下限值
        while(1){//主循環(huán)
                         
/**********************顯示溫度界面******************************/
                  if(menu==0){
                           for(i=15;i>0;i--){
                           disp(ReadTemperature());}
                          if(tem>=H&&w==0||tem<=L&&w==0){
                            di();//超溫或者低溫報(bào)警
                          q=1;
                          led=0;
                            }
                  
                          if(k3==0&&q==1){w=1;}//如果報(bào)警時(shí)按下K1則關(guān)閉報(bào)警聲
                          if(tem<=H&&tem>=L){w=0;}//如果溫度恢復(fù)正常把報(bào)警標(biāo)志清除
                        if(k2==0&&k3==0){//k2k3同時(shí)按下溫度上限下限值恢復(fù)出廠設(shè)置
                                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); //擦除整個(gè)扇區(qū)
                                        IapProgramByte(0x00,HH );//將 新的溫度上限值高8位寫入 EEPROM
                                        IapProgramByte(0x01, HL);//將 新的溫度上限值低8位寫入 EEPROM
                                        IapProgramByte(0x02,LH );//將 新的溫度下限值高8位寫入 EEPROM
                                        IapProgramByte(0x03, LL);//將 新的溫度下限值低8位寫入 EEPROM         
                                        di();
                                }
                        }       
                   }
/*********************進(jìn)入調(diào)溫度上限界面*******************************/
                  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鍵則溫度上限加零點(diǎn)一度
                                 cou=0;//重新計(jì)數(shù)
                                 TR0 = 1; //T/C1啟動(dòng)開關(guān)
                                   
                                 while(!k2);
                                HL=H;
                                HH=(H>>8);
                                }
                          }
                         if(k3==0){
                                delay1ms(10);
                                 if(k3==0){
                                H--; //按下K1鍵則溫度上限減零點(diǎn)一度
                                 cou=0;//重新計(jì)數(shù)
                                 TR0 = 1; //T/C1啟動(dòng)開關(guān)
                                   
                                 while(!k3);
                                HL=H;
                                HH=(H>>8);
                                }
                          }
                       
                  }
/*******************進(jìn)入調(diào)溫度下限界面****************************/
                   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;//重新計(jì)數(shù)
                                 TR0 = 1; //T/C1啟動(dòng)開關(guān)
                                    L++; //按下K1鍵則溫度下限加零點(diǎn)一度
                                 while(!k2);
                                LL=L;
                                LH=(L>>8);
                                }
                         }

                         if(k3==0){
                                delay1ms(10);
                                 if(k3==0){
                                cou=0;//重新計(jì)數(shù)
                                 TR0 = 1; //T/C1啟動(dòng)開關(guān)
                                    L--; //按下K1鍵則溫度下限減零點(diǎn)一度
                                 while(!k3);
                                LL=L;
                                LH=(L>>8);                               
                             }
                        }
                  }
/*************************按下K1鍵進(jìn)入菜單設(shè)置界面***************************/
                  if(k1==0){
                         delay1ms(10);
                         if(k1==0){
                         cou=0;//重新計(jì)數(shù)
                         TR0 = 1; //T/C1啟動(dòng)開關(guān)
                            menu++; //按下K1鍵則菜單加一
                           if(menu>2){menu=0;}
                         while(!k1);
                        }
                   }                               
        }       
}
/*****************************************************************************/

溫度報(bào)警器.rar (2.55 MB, 下載次數(shù): 80)






回復(fù)

使用道具 舉報(bào)

ID:1057978 發(fā)表于 2023-1-27 15:17 | 顯示全部樓層
你應(yīng)該把編譯結(jié)果截圖出來,大家可以看到具體報(bào)什么警告幫你分析一下,
回復(fù)

使用道具 舉報(bào)

ID:1001745 發(fā)表于 2023-2-6 12:24 | 顯示全部樓層
屏幕截圖 2023-02-06 122322.png 這是編譯的結(jié)果截圖。
回復(fù)

使用道具 舉報(bào)

ID:427868 發(fā)表于 2023-2-10 11:33 | 顯示全部樓層
    問題出在開始處:#include <STC15W.h>。找不到這個(gè)頭文件吧。我改為#include <STC15.h>就去掉了前幾條錯(cuò)誤,因?yàn)槲业膋eil內(nèi)有stc15.h頭文件。
     后3條DS18B20.H文件內(nèi)的錯(cuò)誤系第21行在函數(shù)內(nèi)定義了局部變量i、j、k,但在函數(shù)內(nèi)并沒有使用,所以報(bào)錯(cuò),刪去或者不用即可。
回復(fù)

使用道具 舉報(bào)

ID:1001745 發(fā)表于 2023-2-10 19:50 | 顯示全部樓層
劉佑紅 發(fā)表于 2023-2-10 11:33
問題出在開始處:#include 。找不到這個(gè)頭文件吧。我改為#include 就去掉了前幾條錯(cuò)誤,因?yàn)槲业膋eil內(nèi) ...

謝謝大神,果然厲害啊。我這個(gè)程序會(huì)導(dǎo)致數(shù)碼管動(dòng)態(tài)顯示的時(shí)候出來筆畫暗淡的問題,請(qǐng)問如何修改?看另一個(gè)貼的鏈接http://www.torrancerestoration.com/bbs/dpj-226686-1.html
回復(fù)

使用道具 舉報(bào)

ID:483407 發(fā)表于 2023-2-11 19:49 | 顯示全部樓層
顯示筆畫暗淡,應(yīng)該是PR1、PR2取值過大吧,與程序無關(guān)。
回復(fù)

使用道具 舉報(bào)

ID:1001745 發(fā)表于 2023-2-13 12:08 | 顯示全部樓層
wangwing 發(fā)表于 2023-2-11 19:49
顯示筆畫暗淡,應(yīng)該是PR1、PR2取值過大吧,與程序無關(guān)。

不是的,全顯的時(shí)候是正常的相同亮度。就動(dòng)態(tài)顯示就有部分筆畫顯示暗淡。
回復(fù)

使用道具 舉報(bào)

ID:89072 發(fā)表于 2023-3-9 11:01 | 顯示全部樓層
mcuhui 發(fā)表于 2023-2-13 12:08
不是的,全顯的時(shí)候是正常的相同亮度。就動(dòng)態(tài)顯示就有部分筆畫顯示暗淡。

刷新時(shí)間有點(diǎn)短,顯示就暗
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表