哪位大侠帮帮忙吧,用键盘设定的上下限温度值没用 为什么啊 这是代码
#include <reg52.h> #include <stdio.h> #define uchar unsigned char #define uint unsigned int sbit ds=P2^2; //温度传感器信号线 sbit dula=P2^6; //数码管段选线 sbit wela=P2^7; //数码管位选线 sbit beep=P2^3; //蜂鸣器 sbit key1=P3^4; sbit key2=P3^5; sbit key3=P3^6;
uint temp; float f_temp; uchar shi,ge,shu,t0,flag,num1;
sbit led0=P1^0; sbit led1=P1^1; sbit led2=P1^2; sbit led3=P1^3;
unsigned char code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0xbf,0x86, 0xdb,0xcf,0xe6,0xed, 0xfd,0x87,0xff,0xef}; //不带小数点的编码
void delay(uint z)//延时函数 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); }
void dsreset(void) //18B20复位,初始化函数 { uint i; ds=0; i=103; while(i>0)i--; ds=1; i=4; while(i>0)i--; }
bit tempreadbit(void) //读1位函数 { uint i; bit dat; ds=0;i++; //i++ 起延时作用 ds=1;i++;i++; dat=ds; i=8;while(i>0)i--; return (dat); }
uchar tempread(void) //读1个字节 { uchar i,j,dat; dat=0; for(i=1;i<=8;i++) { j=tempreadbit(); dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里 } return(dat); }
void tempwritebyte(uchar dat) //向18B20写一个字节数据 { uint i; uchar j; bit testb; for(j=1;j<=8;j++) { testb=dat&0x01; dat=dat>>1; if(testb) //写 1 { ds=0; i++;i++; ds=1; i=8;while(i>0)i--; } else { ds=0; //写 0 i=8;while(i>0)i--; ds=1; i++;i++; }
} }
void tempchange(void) //DS18B20 开始获取温度并转换 { dsreset(); delay(1); tempwritebyte(0xcc); // 写跳过读ROM指令 tempwritebyte(0x44); // 写温度转换指令 }
uint get_temp() //读取寄存器中存储的温度数据 { uchar a,b;
dsreset(); delay(1); tempwritebyte(0xcc); tempwritebyte(0xbe); a=tempread(); //读低8位 b=tempread(); //读高8位 temp=b; temp<<=8; //两个字节组合为1个字 temp=temp|a; f_temp=temp*0.0625; //温度在寄存器中为12位 分辨率位0.0625° temp=f_temp*10+0.5; //乘以10表示小数点后面只取1位,加0.5是四舍五入 f_temp=f_temp+0.05; return temp; //temp是整型 }
////////////////////显示程序////////////////////////// void display(uchar num,uchar dat,uchar shi,uchar ge) { uchar i; dula=0; P0=table[dat]; dula=1; dula=0;
wela=0; i=0XFF; i=i&(~((0X01)<<(num))); P0=i; wela=1; wela=0; delay(1);
dula=1; P0=table[shi]; dula=0; P0=0xff; wela=1; P0=0xf7; wela=0; delay(1);
dula=1; P0=table[ge]; dula=0; P0=0xff; wela=1; P0=0xef; wela=0; delay(1);
}
void dis_temp(uint t) { uchar i; shi=wx/10; ge=wx%10; i=t/100; display(0,i,shi,ge); i=t%100/10; display(1,i+10,shi,ge); i=t%100%10; display(2,i,shi,ge); } //报警设置
void deal(uint t) { uchar i; if(t>num1) { P1=0Xfe;
dis_temp(get_temp());
} else { i=40; while(i--) { dis_temp(get_temp()); } } } //定时器键盘扫描 void timer0() interrupt 1 { TH0=0xb8; TL0=0x00; t0++; if(t0==5) { t0=0; if(key1==0) { delay(5); if(key1==0) { shu++; if(shu==100) shu=0; } while(!key1) ; delay(5); while(!key1); } if(key2==0) { delay(5); if(key2==0) { shu--; if(shu==-1) shu=99; } while(!key2) ; delay(5); while(!key2); } if(key3==0) { delay(5); if(key3==0) { flag=1; } } } }
void init()//定时器初始化函数 { TMOD=0x01;//设置定时器0为工作方式1 TH0=0xb8; TL0=0x00; EA=1;//开总中断 ET0=1;//开定时器0中断 TR0=1;//启动定时器0 }
void main() { uchar buff[4],i; dula=0; wela=0; init(); while(1) { tempchange();
if(flag==1) { num1=shu; deal(temp); } else { for(i=10;i>0;i--) { dis_temp(get_temp());} sprintf(buff,"%f",f_temp);
for(i=10;i>0;i--) { dis_temp(get_temp());}
for(i=10;i>0;i--) { dis_temp(get_temp());} } } }
[此贴子已经被作者于2012-3-24 18:45:40编辑过]
|