该系统为基于51单片机的智能温控器,采用了DS18b20温度传感器和4位数码管显示。
单片机源程序如下:
- #include "reg52.h"
- #include "absacc.h"
- unsigned char code tab[]={0X3F,0X24,0X5D,0X75,0X66,0X73,0X7B,0X25,0X7F,0X77,0X40}; //共阴 (cc)
- sbit DQ=0xb7; //c51与DS18B20通信口
- sbit P07=0x87; //小数点
- sbit RED=0x97; //高温报警灯
- sbit GREEN=0x96; //低温报警灯
- sbit SET=0x90; //以下按钮设置
- sbit NEXT=0x91;
- sbit REDUCE=0x92;
- sbit ADD=0x93;
- unsigned char tempL=0; //温度低八位
- unsigned char tempH=0; //温度高八位
- float temperature; //显示温度值
- float temperatureH=30,temperatureL=10; //报警温度
- int tH=0,tL=0;//报警状态,1为关闭
- int m,k=1,l,keyon,keytype,out=0;//设置报警温度时使用的中间变量
- void delay(unsigned int time)
- {
- while(time--);
-
- }
- void display(float k) //显示温度
- {
- if(k>=0) //正温度显示
- {
- P2=0xfe;
- P0=tab[(int)(k/100)];
- delay(260);
- P0=0x00;
- }
- else //负温度显示负号
- {
- k=-k;
- P2=0xfe;
- P0=0x40;
- delay(260);
- P0=0x00;
- }
- P2=0xfd; //温度十位显示
- P0=tab[(((int)k)%100)/10];
- delay(260);
- P0=0x00;
- P2=0xfb; //温度个位显示
- P0=tab[((int)k)%10];
- P07=1;
- delay(260);
- P0=0x00;
- P2=0xf7; //温度一位小数显示
- P0=tab[((int)(k*10))%10];
- delay(260);
- P0=0x00;
- }
- Init_DS18B20(void)
- {
- unsigned char x=0;
- DQ=1;
- delay(8);
- DQ=0;
- delay(85);
- DQ=1;
- delay(14);
- x=DQ;
- delay(20);
- }
- ReadOneChar(void)
- {
- /* unsigned char i=0;
- unsigned char dat=0;
- for (i=8;i>0;i--)
- {
- DQ=1;
- delay(1);
- DQ=0;
- dat>>=1;
- DQ=1;
- if(DQ) dat|=0x80;
- delay(4);
- }
- return(dat);*/
-
- unsigned char i,dat=0;
- DQ = 1;
- //_nop_();
- delay(1);
- for(i=0;i<8;i++)
- {
- DQ = 0;
- delay(1);
- dat >>= 1;
- DQ = 1;
- delay(1);
- if(DQ)
- dat |= 0X80;
- delay(30);
- DQ = 1;
- }
- return dat;
-
-
- }
- WriteOneChar(unsigned char dat)
- {
- unsigned char i=0;
- for (i=8;i>0;i--)
- {
- DQ=0;
- DQ=dat&0x01;
- delay(5);
- DQ=1;
- dat>>=1;
-
- }
- delay(4);
- }
- ConversionTemperature()
- {
- Init_DS18B20();
- WriteOneChar(0xcc);
- WriteOneChar(0x44);
- delay(20);
- }
- ReadTemperature(void)
- {
- char ctempL,ctempH;
-
- Init_DS18B20();
- WriteOneChar(0xcc);
- WriteOneChar(0xbe);
- tempL=ReadOneChar();
- tempH=ReadOneChar();
- if(tempH<0xf8) //温度是否小于零
- temperature=((tempH*256)+tempL)* 0.0625;//大于零
- if (temperature>temperatureH,tH=-1);
- if (temperature<temperatureL,tL=-1);
- else
- {
- ctempL=tempL;
- ctempH=tempH;
- temperature=(((~ctempH)*256)+(~ctempL)+1)* 0.0625;
- temperature=-temperature;
- }
- delay(200);
- return(temperature);
- }
- ///////////////////////////报警设置显示/////////////////////////
- void Display2()
- { ///////////////////高温报警显示////////////////////
- if(m==0||m==1)
- {
- P2=0xfe;
- P0=0x6e;
- delay(70);
- P0=0x00;
- if(m==0&&k==-1) delay(70);
- else
- {
- if(tH==1)
- {
- P2=0xfd;
- P0=0x4b;
- delay(70);
- P0=0x00;
- }
- else
- {
- P2=0xfd;
- P0=0x3f;
- delay(70);
- P0=0x00;
- }
- }
- if(m==1&&k==-1) delay(100);
- else
- {
- if(temperatureH>=0)
- {
- P2=0xfb;
- P0=tab[(int)(temperatureH/10)];
- delay(70);
- P0=0x00;
- P2=0xf7;
- P0=tab[(int)(temperatureH)%10];
- delay(70);
- P0=0x00;
- }
- else
- {
- P2=0xfb;
- P0=0x40; //////显示负号
- delay(70);
- P0=0x00;
- P2=0xf7;
- P0=tab[(int)(-temperatureH)%10];
- delay(70);
- P0=0x00;
- }
- }
- }
- //////////////////////////////////////////////////
- ///////////////////低温报警显示//////////////////
- else if(m==2||m==3)
- {
- P2=0xfe;
- P0=0x1a;
- delay(70);
- P0=0x00;
- if(m==2&&k==-1) delay(70);
- else
- {
- if(tL==1)
- {
- P2=0xfd;
- P0=0x4b;
- delay(70);
- P0=0x00;
- }
- else
- {
- P2=0xfd;
- P0=0x3f;
- delay(70);
- P0=0x00;
- }
- }
- if(m==3&&k==-1) delay(100);
- else
- {
- if(temperatureL>=0)
- {
- P2=0xfb;
- P0=tab[(int)(temperatureL/10)];
- delay(70);
- P0=0x00;
- P2=0xf7;
- P0=tab[(int)(temperatureL)%10];
- delay(70);
- P0=0x00;
- }
- else
- {
- P2=0xfb;
- P0=0x40; ////显示负号
- delay(70);
- P0=0x00;
- P2=0xf7;
- P0=tab[(int)(-temperatureL)%10];
- delay(70);
- P0=0x00;
- }
-
- }
- }
- ///////////////////////////////////////////////////////
- if(l==200){k=-k;l=0;}
- l++;
- }
- /////////////////////////////报警设置显示结束///////////////////////////////////
- ////////////////////////////////报警设置/////////////////////////////////////////
- void seting()
- {
- if(SET==1&&NEXT==1&&REDUCE==1&&ADD==1); //无键盘按下
- else /////有键盘按下时
- {
- keyon=1;
- if(SET==0)keytype=0;
- if(NEXT==0)keytype=1;
- if(REDUCE==0)keytype=2;
- if(ADD==0)keytype=3;
- }
- if(keyon==1&&SET==1&&NEXT==1&&REDUCE==1&&ADD==1) //键盘松开后判断键盘状态
- {
- if(keytype==1)////////////////菜单下翻
- {
- if(m>=3)m=0;
- else m++;
- }
- if(keytype==2) ////////////////加操作
- {
- if(m==0)tH=-tH;
- if(m==1)
- {
- if(temperatureH>(temperatureL+1)) temperatureH--;
- else temperatureH=99;
- }
- if(m==2)tL=-tL;
- if(m==3)
- {
- if(temperatureL>-9) temperatureL--;
- else temperatureL=(temperatureH-1);
- }
- }
- if(keytype==3) ////////////////减操作
- {
- if(m==0)tH=-tH;
- if(m==1)
- {
- if(temperatureH<99) temperatureH++;
- else temperatureH=(temperatureL+1);
- }
- if(m==2)tL=-tL;
- if(m==3)
- {
- if(temperatureL<(temperatureH-1)) temperatureL++;
- else temperatureL=-9;
- }
- }
- if(keytype==0) ///////////跳出温度设置
- {
- keyon=0;
- keytype=4;
- out=1;
- }
- keyon=0;
- keytype=4;
- }
- }
- /////////////////////////////报警设置结束/////////////////////////////////////////
- void main()
- {
- P1=0XFF;
- while(1)
- {
- ConversionTemperature();//开始温度转换
- ReadTemperature( );
-
- display(temperature);//显示温度
- if(SET==0) /////////////////////////进入报警温度设定
- {
- out=0;
- delay(300);
- while(SET==0);
- m=0;
- l=0;
- keyon=0;
- keytype=4;
- while(1)
- {
- Display2();
- seting();
- if (out==1)break;
- }
- delay(200);
- while(SET==0);
- }
- if(tH==1)RED=1;
- else if(tH==-1&&temperature>=temperatureH) RED=0; //////满足条件是开启高温报警
- else if(temperature<(temperatureH-0.9))RED=1;
- if(tL==1)GREEN=1;
- if(tL==-1&&temperature<=temperatureL) GREEN=0;//////满足条件时开启低温报警
- else if(temperature>(temperatureL+1)) GREEN=1;
- ReadTemperature();//读取温度
- display(temperature);//显示温度
-
- }
- }
复制代码
所有资料51hei提供下载:
仿真图.zip
(31.78 KB, 下载次数: 41)
完整程序.zip
(5.3 KB, 下载次数: 38)
|