|
2222.jpg (148.22 KB, 下載次數(shù): 13)
下載附件
2018-12-3 14:13 上傳
- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit DQ=P3^6;
- sbit BEEP=P3^7;
- sbit HI_LED=P1^4;
- sbit LO_LED=P1^5;
- bit HI_Alarm=0,LO_Alarm=0;
- bit DS18B20_IS_OK=1;
- uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
- uchar code df_Table[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};
- uchar CurrentT=0;
- uchar Display_Digit[]={0,0,0,0};
- uchar Temp_Value[]={0x00,0x00};
- uint Time0_Count=0;
- char Alarm_Temp_HL[2]={70,-20};
- /***********延時(shí)程序*************/
- void Delay(uint x)
- {
-
- while(--x);
-
- }
- /**********DS18B20初始化********/
- uchar Init_DS18B20()
- {
-
- uchar status;
-
- DQ=1;Delay(8);
-
- DQ=0;Delay(90);
-
- DQ=1;Delay(8);
-
- status=DQ;
-
- Delay(100);
-
- DQ=1;
-
- return status;
-
- }
- /**********DS18B20讀字節(jié)********/
- uchar ReadOneByte()
- {
-
- uchar i,dat=0;
-
- DQ=1;_nop_();
-
- for(i=0;i<8;i++)
-
- { DQ=0;dat >>=1;DQ=1;_nop_();_nop_();
-
- if (DQ) dat |=0x80; Delay(30); DQ=1;
-
- }
-
- return dat;
-
- }
- /**********DS18B20寫字節(jié)********/
- void WriteOneByte(uchar dat)
- {
-
- uchar i;
-
- for(i=0;i<8;i++)
-
- {
-
- DQ=0;DQ=dat & 0x01;Delay(5); DQ=1; dat>>=1;
-
- }
-
- }
- /**********從DS18B20讀取溫度********/
- void Read_Temperature()
- {
-
- if( Init_DS18B20()==1)
-
- DS18B20_IS_OK=0;
-
- else
-
- {
-
- WriteOneByte(0xCC);
-
- WriteOneByte(0x44);
-
- Init_DS18B20();
-
- WriteOneByte(0xCC);
-
- WriteOneByte(0xBE);
-
- Temp_Value[0]=ReadOneByte();
-
- Temp_Value[1]=ReadOneByte();
-
- DS18B20_IS_OK=1;
-
- }
-
- }
- /**********給DS18B20設(shè)置報(bào)警值********/
- void Set_Alarm_Temp_Value()
- {
-
- Init_DS18B20();
-
- WriteOneByte(0xcc);
-
- WriteOneByte(0x4e);
-
- WriteOneByte(Alarm_Temp_HL[0]); //寫TH
-
- WriteOneByte(Alarm_Temp_HL[1]); //寫TL
-
- WriteOneByte(0x7f); //12位精度
-
- Init_DS18B20();
-
- WriteOneByte(0xcc); //跳過序列號
-
- WriteOneByte(0x48); //將溫度報(bào)警值存入DS18B20
-
- } /**********溫度值顯示******************/
- void Display_Temperature() //顯示溫度
- {
-
- uchar i;
-
- uchar t=150; //延時(shí)值
-
- uchar ng=0,np=0; //負(fù)數(shù)標(biāo)示及負(fù)號顯示位置
-
- char Signed_Current_Temp;
-
- if((Temp_Value[1]&0xf8)==0xf8) //如果為負(fù)數(shù)取反加1設(shè)置負(fù)數(shù)標(biāo)示及負(fù)號顯示位置
-
- {
-
- Temp_Value[1]=~Temp_Value[1];
-
- Temp_Value[0]=~Temp_Value[0]+1;
-
- if(Temp_Value[0]==0x00)Temp_Value[1]++;
-
- ng=1;np=0xfd;
-
- }
-
- Display_Digit[0]=df_Table[Temp_Value[0]&0x0f];
-
- CurrentT=((Temp_Value[0]&0xf0)>>4)|((Temp_Value[1]&0x07)<<4);
-
- Signed_Current_Temp=ng? -CurrentT : CurrentT;
-
- HI_Alarm= Signed_Current_Temp >= Alarm_Temp_HL[0] ? 1:0;
-
- LO_Alarm= Signed_Current_Temp <= Alarm_Temp_HL[1] ? 1:0;
-
- Display_Digit[3]=CurrentT/100;
-
- Display_Digit[2]=CurrentT%100/10;
-
- Display_Digit[1]=CurrentT%10;
-
- if(Display_Digit[3]==0)
-
- { Display_Digit[3]=10;
-
- np=0xfb;
-
- if(Display_Digit[2]==0)
-
- {
-
- Display_Digit[2]=10;
-
- np=0xf7;
-
- }
-
- }
-
- for(i=0;i<30;i++) //刷新數(shù)碼管顯示溫度值
-
- {
-
- P0=0X39;P2=0X7F;Delay(t);P2=0XFF;
-
- P0=0X63;P2=0XBF;Delay(t);P2=0XFF;
-
- P0=DSY_CODE[Display_Digit[0]];
-
- P2=0XDF;Delay(t);P2=0XFF;
-
- P0=(DSY_CODE[Display_Digit[1]])|0X80;
-
- P2=0XEF;Delay(t);P2=0XFF;
-
- P0=DSY_CODE[Display_Digit[2]];
-
- P2=0XF7;Delay(t);P2=0XFF;
-
- P0=DSY_CODE[Display_Digit[3]];
-
- P2=0XFB;Delay(t);P2=0XFF;
-
- if(ng) {P0=0X40;P2=np;Delay(t);P2=0XFF;}
-
- }
-
- }
- /**********定時(shí)器0中斷控制報(bào)警聲音********/
- void T0_INT()interrupt 1
- {
-
- TH0=-1000/256;
-
- TL0=-1000%256;
-
- BEEP=!BEEP;
-
- if(++Time0_Count==400)
-
- {
-
- Time0_Count=0;
-
- if(HI_Alarm)HI_LED=~HI_LED;
-
- else HI_LED=1;
-
- if(LO_Alarm)LO_LED=~LO_LED;
-
- else LO_LED=1;
-
- }
-
- }
- void main()
- {
-
- IE=0X82;
-
- TMOD=0X01; //方式1計(jì)數(shù)
-
- TH0=-1000/256;
-
- TL0=-1000%256;
-
- TR0=0;
-
- HI_LED=1;
-
- LO_LED=1;
-
- Set_Alarm_Temp_Value();
-
- Read_Temperature();
-
- Delay(50000); Delay(50000);
-
- while(1)
-
- {
-
- Read_Temperature();
-
- if(DS18B20_IS_OK)
-
- {
-
- if(HI_Alarm==1||LO_Alarm==1)TR0=1;
-
- else TR0=0;
-
- Display_Temperature();
-
- }
-
- else{P0=P2=0X00;}
-
- }
-
- }
復(fù)制代碼
|
評分
-
查看全部評分
|