本帖最后由 111gjk 于 2021-1-8 18:48 編輯
#include"STC15F2K60S2.h"
//#include"reg52.h"
#include"intrins.h"
sbit DQ=P4^2;
// sbit DQ=P3^6;
sbit beep=P3^7;
sbit LED_H=P1^4;
sbit LED_L=P1^5;
unsigned char code Duan_Ma[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};
unsigned char code df_Table[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};
char Alarm_Temp[2]={70,-20};
unsigned long int Current=0;
unsigned char Temp_Value[]={0x00,0x00};
unsigned char Display[]={0,0,0,0};//待顯示的各溫度數位
bit Alarm_H=0,Alarm_L=0;
bit DS18B20_IS_OK=1;
unsigned int Timer0_cout=0;
void delay(unsigned int k)
{
while(--k);
}
void delay15us(unsigned long int i) //誤差 0us
{
while(i--)
{
unsigned char a;
for(a=6;a>0;a--);
}
}
// void dsreset()
// {
// unsigned int i;
// DQ=0;
// i=103;
// while(i>10)
// i--;
// DQ=1;
// i=4;
// while(i>0)
// i--;
// }
unsigned char DS18B20_Init()//18B20初始化
{
unsigned char staues;
DQ=1;
delay(8);
DQ=0;
delay15us(32);
DQ=1;
delay15us(4);
staues=DQ;
delay15us(32);
// while(1)
// {
// if( staues==1)
// {
// P0=0x3f;
// P2=0x00;
// }
// else
// {
// P0=0x06;
// P2=0x00;
// }
//
// }
DQ=1;
delay15us(16);
return staues;
}
unsigned char Red_Byte_1()//讀一個字節
{
unsigned char byte = 0;
unsigned char j=0;
// DQ=1;
// delay(1);
for(j=8; j>0; j--)
{
DQ = 0;
byte >>= 1; //先將總線拉低1us
DQ = 1; //然后釋放總線 //延時6us等待數據穩定
// delay15us(3);
if(DQ)
byte |= 0x80;
delay15us(20);
}
return byte;
}
unsigned Wri_Byte_1(unsigned int dat)//寫入一個字節
{
unsigned char i;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay15us(20);
DQ=1;
dat>>=1;
}
delay15us(20);
// while(1)
// {
// if(dat==0)
// {
// P0=0x3f;
// P2=0x00;
// }
// }
return dat;
}
void Red_Temp_ture()//讀取溫度值
{
// dsreset();
// delay15us(6);
if(DS18B20_Init()==1)
DS18B20_IS_OK=0;
else
{
// delay15us(12);
DS18B20_Init();
Wri_Byte_1(0xCC);//跳過序列號
Wri_Byte_1(0x44);
// delay15us(12);
DS18B20_Init();
// delay15us(3000);
Wri_Byte_1(0xCC);
Wri_Byte_1(0xBE);
Temp_Value[0]=Red_Byte_1();
Temp_Value[1]=Red_Byte_1();
Alarm_Temp[0]=Red_Byte_1();
Alarm_Temp[1]=Red_Byte_1();
DS18B20_IS_OK=1;
}
// DS18B20_IS_OK=1;
}
void Set_Alare_Temp_V()//設置溫度報警值
{
DS18B20_Init();
Wri_Byte_1(0xCC);
Wri_Byte_1(0x4E);
Wri_Byte_1(Alarm_Temp[0]);
Wri_Byte_1(Alarm_Temp[1]);
Wri_Byte_1(0x7F);
DS18B20_Init();
Wri_Byte_1(0xCC);
Wri_Byte_1(0x48);
}
void Display_Temp()//數碼管上顯示溫度
{
unsigned char i;
unsigned char t=150;
unsigned char ng=0,np=0;
char Singed_Currtet_Temp;//如果為負數則取反加一,并設置負號標識及負號顯示位置
if((Temp_Value[1]&0xF8)==0xF8)
{
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[0]=df_Table[Temp_Value[0]&0x0F];
Current=((Temp_Value[0]&0x0F)>>4)|((Temp_Value[1]&0xF0)<<4);
if(Singed_Currtet_Temp==ng)
{
Singed_Currtet_Temp=-Current;
}
else
{
Singed_Currtet_Temp=Current;
}
Alarm_H=Singed_Currtet_Temp>=Alarm_Temp[0]?1:0;
Alarm_L=Singed_Currtet_Temp<=Alarm_Temp[1]?1:0;
Display[3]=Current/100;
Display[2]=Current%100/10;
Display[1]=Current%10;
// Display[3]=0;
// Display[2]=1;
// Display[1]=0;
if(0==Display[3])
{
Display[3]=10;
np=0xFB;
if(0==Display[2])
{
Display[2]=10;
np=0xF7;
}
}
for(i=0;i<30;i++)
{
P0=0x39;
P2=0x7F;
delay(t);
P2=0xFF;
P0=0x63;
P2=0xBF;
delay(t);
P2=0xFF;
P0=Duan_Ma[Display[0]];
P2=0xDF;
delay(t);
P2=0xFF;
P0=(Duan_Ma[Display[1]])|0x80;
P2=0xEF;
delay(t);
P2=0xFF;
P0=Duan_Ma[Display[2]];
P2=0xF7;
delay(t);
P2=0xFF;
P0=Duan_Ma[Display[3]];
P2=0xFB;
delay(t);
P2=0xFF;
if(ng)
{
P0=0x40;
P2=np;
delay(t);
P2=0xFF;
}
}
}
void Timer0_Init ()interrupt 1
{
TH0=(60536)/256;
TL0=(60536)%256;
beep=!beep;
if(++Timer0_cout==400)
{
Timer0_cout=0;
if(Alarm_H)
{
LED_H=~LED_H;
}
else
{
LED_H=1;
}
if(Alarm_L)
{
LED_L=~LED_L;
}
else
{
LED_L=1;
}
}
}
void main()
{
IE=0x82;
TMOD=0x01;
TH0=(60536)/256;
TL0=(60536)%256;
TR0=0;
LED_H=1;
LED_L=1;
Set_Alare_Temp_V();
Red_Temp_ture();
// DS18B20_Init();
delay(50000);
delay(50000);
while(1)
{
Red_Temp_ture();
if(DS18B20_IS_OK)
{
if(Alarm_H==1||Alarm_L==1)
{
TR0=1;
}
else
{
TR0=0;
}
Display_Temp();
}
else
{
P0=P2=0x00;
}
}
}
|