程序如下,芯片頻率是12M
#include<90s8515.h>
#include<delay.h>
unsigned int temp;
unsigned char dis[4]={0,0,0,0};
unsigned char led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0xff,0xbf};//共陽極數顯管顯示0,1,2,3,4,5,6,7,8,9,不顯示,負號
unsigned char led1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//帶小數點顯示
unsigned char init(void) //ds18b20初始化
{
unsigned char flag;
DDRD=1;//端口設為輸出,發送低電平
delay_us(550);//延時550us
DDRD=0;//端口設為輸入,釋放總線,等待ds18b20響應
delay_us(68);//延時68us
while(PIND);
while(!PIND);
if(PIND)
{flag=0;}
else
{flag=1;}
delay_us(500);
return flag;
}
void write(unsigned char dat) //寫字節
{
unsigned char i=0;
for(i=8;i>0;i--)
{
DDRD=1;//拉低總線
delay_us(2);
if(dat&1)
{DDRD=1;}
else
{DDRD=0;}
dat>>=1;
delay_us(60);//主機延時60us,等待ds18b20進行采樣
DDRD=0;//釋放總線
//delay_us(2);
}
}
unsigned char read(void) //讀字節
{
unsigned char i=0;
unsigned char dat=0;
for(i=8;i>0;i--)
{ DDRD=1; //定義為輸出,拉低總線
delay_us(1);
DDRD=0;//定義為輸入,釋放總線
delay_us(9);
dat>>=1;
if(PIND)
dat|=0x80; //按位或然后賦值給dat,讀取數據最高位為1
delay_us(65);
}
return(dat);
}
void Display(unsigned int temp) //顯示函數
{
if(temp<=0x0800)//進行溫度轉換
{
temp>>=4;//二進制轉換成十進制
temp*=10;
dis[0]=temp/1000;
dis[1]=temp%1000/100;
dis[2]=temp%1000%100/10;
dis[3]=temp%1000%100%10;
}
else
{
temp=~temp;
temp+=1;
temp>>=4;
dis[0]=0x0c;
dis[1]=temp%100/10;
dis[2]=temp%100%10;
dis[3]=0;
}
DDRC=0X0F;
DDRA=0XFF;
PORTC=0x01;
PORTA=led[dis[0]];
delay_us(400);
PORTC=0x02;
PORTA=led1[dis[1]];
delay_us(400);
PORTC=0x04;
PORTA=led[dis[2]];
delay_us(400);
PORTC=0x08;
PORTA=led[dis[3]];
delay_us(400);
}
void main()
{
unsigned char th,tl;
while(1)
{
init();
write(0xcc);//跳過ROM的操作
write(0x44);//進行溫度變換
delay_ms(10);
init();
write(0xcc);//跳過ROM的操作
write(0xbe);//發出讀取RAM的命令
th=read();
tl=read();
temp=th<<8;
temp|=tl;
Display(temp);
}
}
|