当前位置:文档之家› 温度PWM控制LED灯及其报警显示

温度PWM控制LED灯及其报警显示

/*************************************基于单片机STC89C52RC实验名称:温度控制及报警系统*************************************/#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit shuma=P2;sbit DQ=P1^5;//18B20信号控制端sbit BEEP=P3^5;//蜂鸣器信号控制端sbit SET=P3^1;//定义为调整按键sbit DEC=P3^2;//定义为减按键sbit ADD=P3^3;//定义为加按键sbit DJ=P1^1;//LED灯PWM输出端uchar PWM1=2;//最小档位uchar PWM2=13;//中等档位uchar PWM3=20;//最高档位uchar shangxian=25;//设置上限为25度uchar xiaxian=5;//设置下限为5度signed int temp,wendu;//定义为全局变量(读取温度)uchar X=0;//定时器计数uchar set_st=0;//状态标志位uchar beep_st=0;//蜂鸣器器报警标志位void Dis_alarm(uchar baojing);//报警头文件声明(为后面调用准备)uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//不带小数点的数字编码uchar code table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//带小数点的数字编码/************************************函数功能:延时函数入口参数:u___待写入参数************************************/void TempDelay (uchar us){while(us--);}void delay(uint count)//延时子函数{uint i;while(count){i=100;while(i>0)i--;count--;}}/*******************************************初始化定时器*******************************************/void init_Time(void){TMOD=0X01;//50ms(12M晶振)TH0=0X3c;TL0=0Xb0;}/*******************************************定时器0中断服务程序*******************************************/void timer0(void) interrupt 1{TMOD=0x01;TH0=0X3c;TL0=0Xb0;X++; ;if(X>=20) X=0;}/****************************************PWM控制灯*****************************************/void PWM(){uchar clock;for(clock=0;clock<=20;clock++){if(wendu/100>=17&&wendu/100<=20){if(clock<=PWM1){ DJ=0;}else{DJ=1;}}elseif(wendu/100>=21&&wendu/100<=22){if(clock<=PWM2) DJ=0;elseDJ=1;}elseif(wendu/100>=23&&wendu/100<=30){if(clock<=PWM3) DJ=0;elseDJ=1;}}}/*****************************************显示报警温度服务程序*****************************************/void Dis_alarm(uchar baojing){P0=table[baojing/10]; //显示十位P2=0X80;delay(8);P0=table[baojing%10]; //显示个位P2=0x40;delay(8);if(set_st==1) P0=0X89;//上线字符Hif(set_st==2) P0=0xC7;//下限字符Lif(set_st==3) P0=0x88;//PWM1字符Aif(set_st==4) P0=0x8C;//PWM2字符Pif(set_st==5) P0=0x83;//PWM3字符BP2=0x10;delay(10);}/********************************************报警服务程序********************************************/void Alarm(){if(X>=10){beep_st=!beep_st;X=0;}if((wendu/100>=shangxian&&beep_st==1)||(wendu/100<xiaxian&&beep_st==1)) {BEEP=0; delay(3);}else{BEEP=1;delay(3); }}/********************************************函数功能:初始化DS18B20出口参数:status---DS18B20是否复位成功的标志********************************************/uchar init_18B20(){uchar status;//存储DS180B20是否存在标志位,status=0表示存在,status=1,表示不存在DQ=1;_nop_();//DQ先置一,等待10us的时间DQ=0;TempDelay (60);//在把数据先从高拉到低,要求保持的时间为(480~960)us;我们延时600usDQ=1;TempDelay (8);//释放数据总线,要求保持时间在(15~16)us;这里延时40us status=DQ;TempDelay (100);//让单片机检查是否存在输出脉冲,DQ=0,表示存在;给足够的输出脉冲DQ=1;//释放数据总线return status;}/********************************************函数功能:读一字节出口参数:dat---读出的数据********************************************/uchar read_18B20(){uchar i,j,dat=0;for(i=0;i<8;i++){DQ=1;_nop_();dat>>=1;DQ=0;_nop_();_nop_();DQ=1;if(DQ) dat|=0x80;else {dat|=0x00;}for(j=30;j>0;j--);}DQ=1;return dat;}/******************************************函数功能:写一个字节入口参数:dat---待写入的数据********************************************/void write_18B20(uchar dat){uchar i,j;for(i=0;i<8;i++){DQ=1;_nop_();_nop_();DQ=0;DQ=dat&0x01;for(j=30;j>0;j--);//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样dat>>=1;//将dat中的各二进制位数据右移1位}DQ=1;}void tem_change(){init_18B20();write_18B20(0xcc); //跳过ROM指令write_18B20(0x44); //启动温度变换}/********************************************函数功能:读取温度值出入口参数:无********************************************/uint wendu_18B20(){uchar a,b;if(init_18B20()==1)BEEP=0;else{write_18B20(0xCC);write_18B20(0xBE);//从暂存器中读取9字节数据a=read_18B20();//读取的是DS18B20的低八位b=read_18B20();//读取的是DS18B20的高八位temp=b;temp<<=8;temp=temp|a;wendu=temp*0.0625*100+0.5;return wendu;}}/********************************************函数功能:数码管显示数据计算入口参数:temp********************************************/ void display(uint temp){uchar qian,bai,shi,ge;qian=temp/1000;bai=temp%1000/100;shi=temp%100/10;ge=temp%100%10;P0=table[qian];_nop_();_nop_();P2=0X80;delay(3);P0=table1[bai];_nop_();_nop_();P2=0x40;delay(3);P0=0xff;P0=table[shi];_nop_();_nop_();P2=0x20;delay(3);P0=table[ge];_nop_();_nop_();P2=0x10;delay(3);P0=0xff;}/********功能处理模块***********/void Dis_gong(){BEEP=1;EA=1;TR0=1;ET0=1;PWM();tem_change();display(wendu_18B20());//数据显示Alarm();//报警检测}/********************************************按键功能函数子程序********************************************/uchar Dis_key(){if(SET==0) //进入调整上限和下限的标志位{TempDelay(250);while(SET==0);set_st++;if(set_st>5) {set_st=0;}}if(set_st==0) //状态零正常显示状态{Dis_gong();}elseif(set_st==1)//状态一显示调整上限的增加与减少(最高为99度,最低为21度) {if(DEC==0&&set_st==1){TempDelay(250);while(DEC==0);shangxian--;if(shangxian<=21) shangxian=21;}elseif(ADD==0&&set_st==1){TempDelay(250);while(ADD==0);shangxian++;if(shangxian>=99) shangxian=99;}Dis_alarm(shangxian);}elseif(set_st==2)//状态二显示调整下限的增加与减少(最高为20度,最低为01度){if(ADD==0&&set_st==2){TempDelay(250);while(ADD==0);xiaxian++;if(xiaxian>=20) xiaxian=20;}elseif(DEC==0&&set_st==2){TempDelay(250);while(DEC==0);xiaxian--;if(xiaxian<=1) xiaxian=1;}Dis_alarm(xiaxian);}if(set_st==3) //PWM1加减{if(ADD==0&&set_st==3){TempDelay(250);while(ADD==0);PWM1++;if(PWM1>=20) PWM1=20;}elseif(DEC==0&&set_st==3){TempDelay(250);while(DEC==0);PWM1--;if(PWM1<=1) PWM1=1;}Dis_alarm(PWM1);}elseif(set_st==4)//PWM2加减{if(ADD==0&&set_st==4){TempDelay(250);while(ADD==0);PWM2++;if(PWM2>=20) PWM2=20;}elseif(DEC==0&&set_st==4){TempDelay(250);while(DEC==0);PWM2--;if(PWM2<=1) PWM2=1;}Dis_alarm(PWM2);}elseif(set_st==5)//PWM3加减{if(ADD==0&&set_st==5){TempDelay(250);while(ADD==0);PWM3++;if(PWM3>=20) PWM3=20;}elseif(DEC==0&&set_st==5){TempDelay(250);while(DEC==0);PWM3--;if(PWM3<=1)PWM3=1;}Dis_alarm(PWM3);}}/***********************************主函数***********************************/ void main(){BEEP=1;init_Time();EA=1;TR0=1;ET0=1;while(1){Dis_key();}}。

相关主题