逛了好久的51黑論壇,感覺51黑就是一個知識的海洋。論壇里的大師都很熱情的幫忙回答問題,受益匪淺。
前兩日看論壇內某位大師發的一個DS18B20的溫度報警器。正好手里有現成的芯片和數碼管,于是就DIY了一個(用的是某創的EDA軟件),硬件部分已經打樣了,過兩天有空焊上去測試一下。軟件部分是根據論壇內的程序稍微修改的IO接口;但是編譯后提示有10個報警,但是能正常生成HEX文件,因小弟能力有限,找不到是哪里有問題,如果哪位大師愿意能幫忙看看是哪里問題。小弟在這先行謝過了。
初次發作品,希望大師們多提寶貴意見。不慎感激!
原理圖
PCB
3DPCB圖
部分代碼:
/*********************************************************************************************/
//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, 下載次數: 80)
2023-1-7 13:06 上傳
點擊文件名下載附件
|