51单片机救急,18b20的温度报警器
#include <reg52.h>#include <18b20.h>#include <delay.h>sbit KEY1=P1^0;sbit KEY2=P1^1;sbit KEY3=P1^2;sbit KEY4=P1^3;sbit KEY5=P1^4;sbit KEY6=P1^5;sbit KEY7=P1^6;sbit KEY8=P1^7;#define DataPort P0#define KeyPort P1sbit LATCH1=P2^0;sbit LATCH2=P2^1;sbit alert1=P2^4;sbit alert2=P2^5;sbit work1=P2^6;sbit work2=P2^7;bit ReadTempFlag;bit updownFlag;unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unsigned char code dofly_weiMa[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned char TempData[8];int Temp[6]={-55,-10,-9,60,61,125};unsigned long count=0;unsigned int h=0;unsigned char fushu=0,fuxian=0;void Display(unsigned char FirstBit,unsigned char num);void Init_Timer0(void);unsigned char Keyscan(void);void dly(int m,int k);void ReadTemp(void);void main(void){ int num,k; Init_Timer0(); while(1) { if(!updownFlag) ReadTemp(); num=Keyscan(); if(num>=1&&num<=6) { count=0; k=num-1; dly(Temp[k],k); } else if(updownFlag==1&&num==7) { count=0; Temp[k]++; dly(Temp[k],k); } else if(updownFlag==1&&num==8) { count=0; Temp[k]--; dly(Temp[k],k); } }}void Display(unsigned char FirstBit,unsigned char num){ static unsigned char i=0; DataPort=0; LATCH1=1; LATCH1=0; DataPort=dofly_weiMa[i+FirstBit]; LATCH1=1; LATCH2=0; DataPort=dofly_DuanMa[i]; LATCH1=1; LATCH1=0; i++; if(i=num) i=0;}void Init_Timer0(void){ TMOD|=0x01; TH0=0x00; TL0=0x00; EA=1; ET0=1; TR0=1;}void Timer0_isr(void) interrupt 1{ static unsigned int num; TH0=(65536-2000)/256; TL0=(65536-2000)%256; Display(0,8); num++; if(num==300) { num=0; ReadTempFlag=1; } count++; if(count==5000) { count=0; updownFlag=0; } h++; if(h==500) { h=0; alert2=1; }}unsigned char Keyscan(void){ if(!KEY1) { DelayMs(10); if(!KEY1) { while(!KEY1); { return 1; } } } else if(!KEY2) { DelayMs(10); if(!KEY2) { while(!KEY2); { return 2; } } } else if(!KEY3) { DelayMs(10); if(!KEY3) { while(!KEY3); { return 3; } } } else if(!KEY4) { DelayMs(10); if(!KEY4) { while(!KEY4); { return 4; } } } else if(!KEY5) { DelayMs(10); if(!KEY5) { while(!KEY5); { return 5; } } } else if(!KEY6) { DelayMs(10); if(!KEY6) { while(!KEY6); { return 6; } } } else if(!KEY7) { DelayMs(10); if(!KEY7) { while(!KEY7); { return 7; } } } else if(!KEY8) { DelayMs(10); if(!KEY8) { while(!KEY8); { return 8; } } } else return 0;}void dly(int m,int k){ updownFlag=1; if(m&0x8000) { TempData[0]=0x40; m=~m; m+=1; } else TempData[0]=0; if(m/100==0) TempData[1]=0; else TempData[1]=dofly_DuanMa[m/100]; if((m/100==0)&&((m%100)/10==0)) TempData[2]=0; else TempData[2]=dofly_DuanMa[(m%100)/10]; TempData[3]=dofly_DuanMa[(m%100)%10]|0x80; TempData[5]=0x63; TempData[6]=0x39; if(k%2==0) TempData[7]=0x38; else TempData[7]=0x76;}void ReadTemp(void){ unsigned int TempH,TempL,Temp[6],Temp1,Temp2; if(ReadTempFlag==1) { ReadTempFlag=0; Temp[]=ReadTemperature[]; if(Temp2&0x8000) fuxian=1; else fuxian=0; if(Temp&0x8000) { TempData[0]=0x40; Temp=~Temp; Temp+=1; fushu=1; } else { TempData[0]=0; fushu=0; } TempH=Temp>>4; TempL=Temp&0x0f; TempL=TempL*6/10; if(fushu) { if(fuxian) { alert2=1; work2=1; Temp1=~Temp[2]; Temp1+=1; if(TempH>Temp1) { alert1=0; work1=0; } else { alert1=1; work1=1; } } else { alert1=0; work1=0; } } else if(fuxian) { alert1=1; work1=1; } else { Temp2=Temp[2]; if(TempH<Temp2) { alert1=0; work1=0; } else { alert1=1; work1=1; } if(TempH>=Temp[4]) {alert2=0; work2=0; } else { alert2=1; work2=1; } } if(TempH/100==0) TempData[1]=0; else TempData[1]=dofly_DuanMa[TempH/100]; if((TempH/100==0)&&((TempH%100)/10==0)) TempData[2]=0; else TempData[2]=dofly_DuanMa[(TempH%100)/10]; TempData[3]=dofly_DuanMa[(TempH%100)%10]|0x80; TempData[4]=dofly_DuanMa[TempL]; TempData[5]=0x63; TempData[6]=0x39; TempData[7]=0; }}