程序如下,芯片频率是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);
}
}
|