采用ds18b20温度传感器,将实时温度与预设温度进行比较,若实时温度低于预设温度,则控制电阻丝进行加热,若实时温度高于预设温度,则停止电阻丝加热,系统温度在50~100摄氏度范围内可调,温度控制精度±0.5摄氏度。
我主程序的最后用if语句将实时温度与预设温度比较,但是用proteus仿真后,P3.1口一直输出低电平,发现if语句好像没有起作用,每次都直接执行else语句。下面是我的程序和proteus电路图。
单片机源程序如下:
- #include"reg51.h"
- #define uint unsigned int
- #define uchar unsigned char
- uchar code smg_duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管段选定义
- uchar code smg_duan1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//数码管段选定义(小数点)
- uchar code smg_wei[]={0xf7,0xfb,0xfd,0xfe};//数码管位选定义
- sbit key1=P1^0;//输入设定温度50度
- sbit key2=P1^1;//输入设定温度75度
- sbit key3=P1^2;//输入设定温度100度
- sbit key4=P1^3;//增加2度
- sbit key5=P1^4;//减少2度
- sbit key6=P1^5;//增加0.5度
- sbit key7=P1^6;//减少0.5度
- sbit key8=P1^7;//确认键
- float setH=0;//预设温度上限
- float setL=0;//预设温度下限
- uint bkey;
- sbit DQ=P3^0;//18b20 I/O口定义
- sbit jiare=P3^1;//加热电阻丝I/O口定义
- /***********1ms延时函数********/
- void delay_1ms(uint i)
- {
- while(i--);
- }
- /***********小延时函数**********/
- void delay_small(uint q)
- {
- while(q--);
- }
- /**********18b20初始化函数*******/
- void Init_18b20()
- {
- bit q;
- DQ=1;//把总线拉高
- delay_small(1);//15us
- DQ=0;//给复位脉冲
- delay_small(80);//750us
- DQ=1;//把总线拉高,等待
- delay_small(10);//110us
- q=DQ;//读取18b20初始化信号
- delay_small(20);//200us
- DQ=1;//把总线拉高,释放总线
- }
- /**********写18b20数据******/
- void write_18b20(uchar dat)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- DQ=0;
- DQ=dat&0x01;//向18b20总线写数据
- delay_small(5);//60us
- DQ=1;//释放总线
- dat>>=1;
- }
- }
- /*********读18b20数据******/
- uchar read_18b20()
- {
- uchar i,r_dat;
- for(i=0;i<8;i++)
- {
- DQ=0;
- r_dat>>=1;//读数据从低位开始
- DQ=1;//释放总线
- if(DQ==1)
- r_dat|=0x80;
- delay_small(5);//60us
- }
- return r_dat;//返回数据
- }
- /**********读取实时温度数值*******/
- uint read_Tem()
- {
- uint r_high;
- uchar r_low;
- Init_18b20();//初始化18b20
- write_18b20(0xcc);//跳过64位ROM
- write_18b20(0x44);//启动一次温度转换命令
- delay_small(50);//500us
- Init_18b20();//初始化18b20
- write_18b20(0xcc);//跳过64位ROM
- write_18b20(0xbe);//发出读取暂存器命令
- EA=0;//关总中断
- r_low=read_18b20();//读温度低字节
- r_high=read_18b20();//读温度高字节
- EA=1;//开总中断
- r_high<<=8;//把温度的高字节左移8位
- r_high|=r_low;//把读出的温度低位放到r_high的低八位中
- r_high*=0.625;//转换到温度值小数
- return r_high;//返回读出的温度
- }
- /**********数码管显示温度函数(实时显示)******/
- void DisplayTem(uint temperature)
- {
- uint a,b;
- P0=0x00;
- P2=smg_wei[0];//位选小数位
- P0=smg_duan[temperature%10];//段选显示小数位
- delay_1ms(2300);
- P0=0x00;
- P2=smg_wei[1];//位选个位
- P0=smg_duan1[temperature/10%10];//段选显示个位
- delay_1ms(2300);
- P0=0x00;
- P2=smg_wei[2];//位选十位
- P0=smg_duan[temperature/100%10];//段选显示十位
- delay_1ms(2300);
- P0=0x00;
- b=temperature/1000%10;
- if(b==0)
- {
- a=0;
- }
- else
- {
- a=1;
- }
- switch(a)
- {
- case(0):break;
- case(1):P2=smg_wei[3];//位选百位
- P0=smg_duan[temperature/1000%10];//段选显示百位
- delay_1ms(2300);
- P0=0x00;
- break;
- }
-
- }
- void keyscan()
- {
- bkey=0;
- if(!key1)
- {
- delay_1ms(3000);
- if(!key1)
- bkey=1;
- }
- if(!key2)
- {
- delay_1ms(3000);
- if(!key2)
- bkey=2;
- }
- if(!key3)
- {
- delay_1ms(3000);
- if(!key3)
- bkey=3;
- }
- if(!key4)
- {
- delay_1ms(8000);
- if(!key4)
- bkey=4;
- }
- if(!key5)
- {
- delay_1ms(8000);
- if(!key5)
- bkey=5;
- }
- if(!key6)
- {
- delay_1ms(8000);
- if(!key6)
- bkey=6;
- }
- if(!key7)
- {
- delay_1ms(8000);
- if(!key7)
- bkey=7;
- }
- if(!key8)
- {
- delay_1ms(8000);
- if(!key8)
- bkey=8;
- }
- }
- /***********数码管显示函数(按键显示)******/
- void displaytem1(float temperature1)
- {
- do
- {
- uint b;
- float c;
- P0=0x00;
- P2=smg_wei[0];//位选小数位
- c=temperature1*10;
- P0=smg_duan[(int)c/1%10];//段选显示小数位
- delay_1ms(1325);
- P0=0x00;
- P2=smg_wei[1];//位选个位
- P0=smg_duan1[(int)temperature1/1%10];//段选显示个位
- delay_1ms(1325);
- P0=0x00;
- P2=smg_wei[2];//位选十位
- P0=smg_duan[(int)temperature1/10%10];//段选显示十位
- delay_1ms(1325);
- P0=0x00;
- b=(int)temperature1/100%10;
- switch(b)
- {
- case(0):break;
- case(1):P2=smg_wei[3];//位选百位
- P0=smg_duan[1];//段选显示百位
- delay_1ms(1325);
- P0=0x00;
- break;
- }
- keyscan();
- }
- while(bkey==0);
- }
- void main()
- {
- uint temperature;
- jiare=0;
- do
- {
- keyscan();
- switch(bkey)
- {
- case(0):break;
- case(1):setH=50.0;
- setL=50.0;
- displaytem1(50.0);
- break;
- case(2):setH=75.0;
- setL=75.0;
- displaytem1(75.0);
- break;
- case(3):setH=100.0;
- setL=100.0;
- displaytem1(100.0);
- break;
- case(4):setH=setH+2.0;
- setL=setL+2.0;
- displaytem1(setH);
- break;
- case(5):setH=setH-2.0;
- setL=setL-2.0;
- displaytem1(setH);
- break;
- case(6):setH=setH+0.5;
- setL=setL+0.5;
- displaytem1(setH);
- break;
- case(7):setH=setH-0.5;
- setL=setL-0.5;
- displaytem1(setH);
- break;
- case(8):P0=0x00;
- break;
- }
- }
- while(bkey<8);
- while(1)
- {
- temperature=read_Tem();//读出温度的值
- DisplayTem(temperature);//显示实时温度
- if(temperature<setH)
- {
- jiare=1;
- }
- else
- {
- jiare=0;
- }
- }
-
- }
复制代码
|