|
照片 003.jpg (4.08 MB, 下載次數(shù): 192)
下載附件
2016-10-15 18:05 上傳
照片 001.jpg (3.14 MB, 下載次數(shù): 170)
下載附件
2016-10-15 18:05 上傳
1.簡(jiǎn)介:通過(guò)按鍵可以設(shè)定溫度上限和溫度下限的值,當(dāng)溫度低于溫度下限值或者當(dāng)溫度高于上限值時(shí),蜂鳴器發(fā)出聲音提醒。
2.元件:STC15W408AS單片機(jī)+共陰數(shù)碼管+有源蜂鳴器+3個(gè)按鍵+DS18B20
3.設(shè)計(jì)思路:利用單片機(jī)逐點(diǎn)掃描的方式直接驅(qū)動(dòng)三位共陰數(shù)碼管,通過(guò)DS18B20讀取溫度與設(shè)定的溫度進(jìn)行比較,如果溫度異常則蜂鳴器發(fā)出滴滴的聲音提醒,按下K3鍵則清除報(bào)警聲(溫度恢復(fù)正常后再次異常時(shí)自動(dòng)報(bào)警)。
4.使用方法:程序下載后首次使用前需同時(shí)按下K2鍵和K3鍵(對(duì)最初的溫度上下限值寫(xiě)入EEPROM中)以后斷電自動(dòng)保存無(wú)需進(jìn)行此操作
5.按下K1鍵則進(jìn)入溫度上限設(shè)置菜單,可以通過(guò)按K2進(jìn)行加 K3進(jìn)行減,再次按K1鍵則進(jìn)入溫度下限報(bào)警值的設(shè)定界面。設(shè)置后5秒無(wú)操作則自動(dòng)保存設(shè)定的數(shù)據(jù)并返回溫度顯示界面。
所有資料下載:
溫度控制超溫報(bào)警stc15w.rar
(80.31 KB, 下載次數(shù): 407)
2016-10-15 18:29 上傳
點(diǎn)擊文件名下載附件
程序及H文件 下載積分: 黑幣 -5
- //2016.10.15編寫(xiě)
- /*********************************************************************************************/
- //作者:劉海龍
- //硬件:三位共陰數(shù)碼管+stc15單片機(jī)+DS18B20溫度芯片+蜂鳴器//選擇內(nèi)部12M晶振
- #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=P5^4;//蜂鳴器負(fù)極連接IO正極接vcc
- sbit k1=P1^3;//設(shè)置鍵
- sbit k2=P1^4;// 加鍵
- sbit k3=P1^5;// 減鍵
- //sbit led1=P1^6;//
- //sbit led2=P1^7;//
- 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; //中斷總開(kāi)關(guān)
- TH0 = 0x3c; //16位計(jì)數(shù)寄存器T0高8位(寫(xiě)入初值)
- TL0 = 0xb0; //16位計(jì)數(shù)寄存器T0低8位
- ET0 = 1; //T/C1中斷開(kāi)關(guān)
- TR0 = 0; //T/C1關(guān)閉開(kāi)關(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位寫(xiě)入 EEPROM
- IapProgramByte(0x01, HL);//將 新的溫度上限值低8位寫(xiě)入 EEPROM
- IapProgramByte(0x02,LH );//將 新的溫度下限值高8位寫(xiě)入 EEPROM
- IapProgramByte(0x03, LL);//將 新的溫度下限值低8位寫(xiě)入 EEPROM
- TR0 = 0; //T/C1停止計(jì)數(shù)
- menu=0;//返回 主菜單的溫度顯示界面
- }
- TH0 = 0x3c; //16位計(jì)數(shù)寄存器T0高8位(重新寫(xiě)入初值)
- 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í)器初始化
-
- ReadTemperature(); //讀取溫度
- HH = IapReadByte(0x00);//開(kāi)機(jī)時(shí)從EEPROM中讀取H高8位參數(shù)
- HL = IapReadByte(0x01);//開(kāi)機(jī)時(shí)從EEPROM中讀取H的低8位參數(shù)
- H=HH*256+HL;//讀出溫度上限值
- LH = IapReadByte(0x02);//開(kāi)機(jī)時(shí)從EEPROM中讀取L高8位參數(shù)
- LL = IapReadByte(0x03);//開(kāi)機(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;
- }
-
- 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=380;//溫度上限38度
- L=370;//溫度下限37度
- LL=L;
- LH=(L>>8);
- HL=H;
- HH=(H>>8);
- IapEraseSector(0x00); //擦除整個(gè)扇區(qū)
- IapProgramByte(0x00,HH );//將 新的溫度上限值高8位寫(xiě)入 EEPROM
- IapProgramByte(0x01, HL);//將 新的溫度上限值低8位寫(xiě)入 EEPROM
- IapProgramByte(0x02,LH );//將 新的溫度下限值高8位寫(xiě)入 EEPROM
- IapProgramByte(0x03, LL);//將 新的溫度下限值低8位寫(xiě)入 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)開(kāi)關(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)開(kāi)關(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)開(kāi)關(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)開(kāi)關(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)開(kāi)關(guān)
- menu++; //按下K1鍵則菜單加一
- if(menu>2){menu=0;}
- while(!k1);
- }
- }
- }
- }
- /*****************************************************************************/
復(fù)制代碼 |
評(píng)分
-
查看全部評(píng)分
|