你好,我想问你要下AT89S52、DS18B20和四位共阴极LED数码管设计数字温度计的电路图和程序,你之前发过的

2024-11-26 16:36:08
推荐回答(3个)
回答1:

#include
#include
#define uchar unsigned char
#define uint unsigned int
#define upzero 1
#define downzero 0
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar code seg[]={0xfe,0xfd,0xfb}; //加了PNP的情况下的段选
sbit DQ=P3^3;
sbit led=P1^1;
sbit DIN=P0^7;//小数点
//sbit LE=P3^0;
uint temperature;
uint wendu,flag=0;

void delay(uchar k)
{
while(--k);
}

void delay1(uint k)
{
uint i,j;
for(i=0;i for(j=0;j<121;j++);
}

void time0_init()
{
TMOD=0x01;
EA=1;
ET0=1;
TR0=1;
TH0=-30000/256;//定时50毫秒
TL0=-30000%256;
}

/*void init_display()//上电时数码管的显示
{

P2=0xff;
delay(3);
} */

void display(uint k)//显示温度
{
uchar ge,shi,bai;
ge=k%10;
shi=k/10%10; //shiwei
bai=k/100;

if(!flag)//温度为负数
{
P2=seg[0];
P0=0xbf;//负号 显示"-"
delay1(4);
P2=0xff;

P2=seg[1];
P0=tab[k/10%10];
delay1(4);
P2=0xff;

P2=seg[2];
P0=tab[k%10];
//DIN=0;
delay1(4);
P2=0xff;

/*P2=seg[3];
P0=tab[0];
delay1(4);
P2=0xff;
*/
}
if(flag)//温度为正数 由于实际的焊的板子只有三个数码管 所以,没加“+” 了。如 45.0度
{
//DIN=1;
P2=0xff;
P2=seg[0];
P0=tab[0];
delay1(4);
P2=0xff;

P2=seg[1];
P0=tab[ge];
DIN=0; // 问题问什么 加小数点要在P2口上加才能正常显示。
delay1(4);

DIN=1;
P2=0xff;
P2=seg[2];
P0=tab[shi];
delay1(4);
P2=0xff;

}
}
/*
每次读写前对DS18B20进行复位初始化。复位要求主CPU将数据线下拉500μ
,然后释放,DS18B20收到信号后等待16 - 60us然后60-240us的存在低脉冲
脉冲,主CPU收到此信号后表示复位成功。
*/
initial_ds18b20()//返回为0表示初始化成功
{
uchar j=0;
DQ=1;//这两条语句用不用不关紧要
delay(4);
DQ=0;
delay(180);//精确延时 730us 检测总线上是否有480-960微秒的低电平出现
delay(200);
DQ=1;
delay(15);//35us 如果有总线转为高电平后等待15-60微秒自动将总线电平拉低60-240微秒做出响应存在脉冲
j=DQ;
delay(50);//105us 至少要100秒以上
//return(j);
}

uchar read_byte(void)
{
uchar i=0,dat;
for(i=0;i<8;i++)
{
DQ=0;
delay(5);//15us
DQ=1;
if(DQ)
dat=(dat>>1)|0x80;//读1
else
dat=((dat>>1))|0x00;//读0
delay(25);
}
return(dat);
}

void write_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
delay(5);//15us
DQ=dat&0x01;//从低位到高位 一位一位的写入DS18B20,即控制它的工作方式
delay(10);//写所需时间
DQ=1;
dat>>=1;
delay(2);
}
delay(1);
}

uchar readwendu(void)
{

//float tt;
uint j=200;
uchar templ=0,temph=0;

initial_ds18b20();
write_byte(0xcc);//跳过ROM
write_byte(0x44);
while(--j);
initial_ds18b20();
write_byte(0xcc);
write_byte(0xbe);
templ=read_byte();//低位
temph=read_byte();//高位

if(temph>0x7f)//处理数据 负数
{
temph=~temph;
templ=~templ+1;
flag=downzero;
temph<<=4; //
temph+=(templ&0xf0)>>4;//
wendu=temph;//
delay(10);
}
else //正数
{
flag=upzero;
temph<<=4; // 左移四位 留一位符号位 因为高五位为符号位
temph+=(templ&0xf0)>>4;//低八位的高四位 即低八位的整数部分 再与temph相加得到一个新的八位
wendu=temph;
delay(10);
}
return(wendu);
}

void main()
{
time0_init();
//init_display();
while(1)
{

temperature=readwendu();
display(temperature);
TR0=1;

}
}

void time0() interrupt 2 //50毫秒判断 温度
{

TR0=0;
TH0=-30000/256;
TL0=-30000%256;

if(temperature>20||temperature<18)
led=~led;
delay(10);

}

我用的是共阳极的

回答2:

还不行的话,我来帮你搞定

回答3:

你可以留下邮箱,我发给你,包括仿真的硬件图一起