/******************************************************************************
程序是本坛下的。想控制温度,就加了一个LED1, 温度下限时led1=0; 温度上限时
led1=1;超温停止,但没改成功,希望大家指导一下,非常感谢。
***************/
//2016.10.15编写
//作者:刘海龙
//硬件:三位共阴数码管+stc15单片机+DS18B20温度芯片+蜂鸣器//选择内部12M晶振
#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=P5^5;//蜂鸣器负极连接IO正极接vcc
sbit k1=P5^4;//设置键
sbit k2=P1^2;// 加键
sbit k3=P1^3;// 减键
sbit led1=P1^4;//
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]);
i=t%100/10;//第二位数码管显示温度个位
diplay_data (2,disdata[i]+0x80);//0x80为个位数后面的小数点
i=t%100%10;//第三位数码管显示温度小数位
diplay_data (3,disdata[i]);
}
/***********************************************/
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关闭开关
beep=1;
led1=0; //后加的
}
/*********************************************************************************************
函数名:定时/计数器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();//定时器初始化
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(tem<L){
led1=0;/低温加热
}
if(tem>=H){
led1=1;//超温停止
}//不论低温加热,还是超温停止。led1都没有变化。
if(menu==0){
for(i=15;i>0;i--){
disp(ReadTemperature());}
if(tem>=H&&w==0||tem<=L&&w==0){
di();//超温或者低温报警
q=1;
}
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=380;//温度上限38度
L=370;//温度下限37度
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);
}
}
}
}
/*****************************************************************************/
|