#include<reg52.h>
#define uchar unsigned char
sbit DQ=P1^4;
uchar data temp_data[2]={0x00,0x00};
uchar data display[5]={0x00,0x00,0x00,0x00,0x00};
unsigned char code ditab[16] ={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09} ;
//共陰數碼管
uchar code table[11] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};// 0,1,2,3,4,5 ,6,7,8,9,百位或當最高位十位為0時不顯示
uchar code table1[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};// 0.,1.,2.,3.,4.,5.,6.,7.,8.,9.各位帶有小數點的顯示
//以下為水位顯示區域
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define _rrca_() CY = ACC & 0x01 //產生RRC A指令
#define _rlca_() CY = ACC & 0x80 //產生RLC A指令
sbit bADcs=P1^7;
sbit bADcl=P1^6;
sbit bADda=P1^5;
sbit flag=P1^3;
//sbit str=P2^7;
//sbit d=P2^6;
//sbit clk=P2^5;
bit choose=0;
unsigned char data1;
unsigned char count;
unsigned char cycle;
uint ge,xiao1,xiao2;
unsigned long data2;
unsigned char code tablewe[]=
{
0xFE,0xFD,0xFB,0xF7,
0xEF,0xDF,0xBF,0x7F
};//自己寫的
void delay_18b20(unsigned int i)
{
while(i--);
}
//函數區域水位
void Delayus(uchar i)
{
while(--i);
}
void ad(void)
{ uchar i;
//data1=0;
bADcs = 0;//當ADC0832未工作時其CS輸入端應為高電平,此時芯片禁用.
bADcl=0;
bADda=1;
bADcl=1;
bADcl=0;//i down
bADda=1;
bADcl=1;
bADcl=0; // 2 down
bADda=0;
bADcl=1;
bADcl=0; // 3 down
bADda=1;
bADcl=1;
bADcl=0; // 4 down
for(i=8;i>0;i--)
{
data1<<=1;
bADcl=0;
bADcl=1;
if(bADda==1) data1|=0x01;
bADda=1;
}
bADcs=1;
}
void cal()
{
data2=((ulong)data1*493)/252.5;
ge=data2/100;
xiao1=(data2%100)/10;
xiao2=data2%10;
}
display2()
{
P2=tablewe[4]; //P2口低四位位選
P0=0x00; //P0口數碼管段選第五個數碼管不用
delay_18b20(50);
P2=tablewe[5];
P0=table1[ge];
delay_18b20(50);
P2=tablewe[6];
P0=table[xiao1];
delay_18b20(50);
P2=tablewe[7];
P0=table[xiao2];
}
//以上為水位函數
//初始化函數
Init_DS18B20(void)
{
unsigned char x=0;
DQ=1; //DQ復位
delay_18b20(8); //稍做延時
DQ=0; //單片機將DQ拉低
delay_18b20(80); //精確延時 大于 480us
DQ=1; //拉高總線
delay_18b20(14);
x=DQ; //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
delay_18b20(20);
}
ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat=0;
for(i=8;i>0;i--)
{
DQ=0; // 給脈沖信號
dat>>=1;
DQ=1; // 給脈沖信號
if(DQ)
dat|=0x80 ;
delay_18b20(4) ;
}
return (dat) ;
}
WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay_18b20(5);
DQ=1;
dat>>=1;
}
}
Read_Temperature(void)
{
Init_DS18B20() ;
WriteOneChar(0xCC) ; // 跳過讀序號列號的操作
WriteOneChar(0x44) ; // 啟動溫度轉換
Init_DS18B20() ;
WriteOneChar(0xCC) ; //跳過讀序號列號的操作
WriteOneChar(0xBE) ; //讀取溫度寄存器
temp_data[0] = ReadOneChar(); //溫度低8位
temp_data[1] = ReadOneChar(); //溫度高8位
}
Disp_Temperature()
{
display[4]=temp_data[0]&0x0f;
display[0]=ditab[display[4]]; //查表得小數位的值
display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
display[3]=display[4]/100 ;
display[1]=display[4]%100 ;
display[2]=display[1]/10;
display[1]=display[1]%10;
if(display[3]==0) //高位為0,不顯示
{
display[3]=10 ;
if(display[2]==0) //次高位為0,不顯示
display[2]=10 ;
}
}
display1()
{
P2=tablewe[0]; //P2口低四位位選
P0=table[display[3]]; //P0口數碼管段選
delay_18b20(50);
P2=tablewe[1];
P0=table[display[2]];
delay_18b20(50);
P2=tablewe[2];
P0=table1[display[1]];
delay_18b20(50);
P2=tablewe[3];
P0=table[display[0]];
}
void main()
{
while(1)
{ Read_Temperature();
Disp_Temperature();
display1();
ad();
cal();
display2();
}
}
這個程序可以使用,但是就是沒有辦法顯示低溫零度以下的,求修改!