来人啊。。程序我先贴出来,看着不难(可我就是不会)。#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uint date1;
uchar flagdat,tflag,num,date,qian1,bai1,shi1,ge1,bai,shi,ge;
uchar period=200;
uchar high;
uchar time=0;
uchar code table[]="Zhi Neng gong shui xi tong jia hai dong";
uchar code table1[]="Pres: mPa Speed: kRPM Temp: C";
uchar code table2[]="6.826.275.243.892.831.780.360.00" ;
//sbit kaiguan=P2^6;
sbit wr=P3^2;
sbit rd=P3^7;
sbit rs=P3^3;
sbit e=P3^4;
sbit cs=P3^6;
sbit P3_5=P3^5;
sbit dq=P2^7;
sbit deng1=P2^0;
sbit deng2=P2^1;
sbit deng3=P2^2;
sbit deng4=P2^3;
sbit deng5=P2^4;
sbit deng6=P2^5;
void delay(uint z)
{
uint t1,y;
for(t1=z;t1>0;t1--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{
rs=0;
P0=com;
delay(5);
e=1;
delay(5);
e=0;
}
void write_data(uchar date)
{
rs=1;
P0=date;
delay(5);
e=1;
delay(5);
e=0;
}
void delay_18B20(unsigned int i)//延时1微秒
{
while(i--);
}
void ds1820rst()/*ds1820复位*/
{ unsigned char x=0;
dq = 1; //DQ复位
delay_18B20(4); //延时
dq = 0; //DQ拉低
delay_18B20(100); //精确延时大于480us
dq = 1; //拉高
delay_18B20(40);
}
uchar ds1820rd()/*读数据*/
{ 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(10);
}
return(dat);
}
void ds1820wr(uchar wdata)/*写数据*/
{unsigned char i=0;
for (i=8; i>0; i--)
{ dq = 0;
dq = wdata&0x01;
delay_18B20(10);
dq = 1;
wdata>>=1;
}
}
read_temp()/*读取温度值并转换*/
{uchar a,b;
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0x44);//*启动温度转换*/
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0xbe);//*读取温度*/
a=ds1820rd();
b=ds1820rd();
date1=b;
date1<<=8;
date1=date1|a;
if(date1<0x0fff)
tflag=0;
else
{date1=~date1+1;
tflag=1;
}
date1=date1*(0.625);//温度值扩大10倍,精确到1位小数
return(date1);
}
void init()
{
P2=0x00;
//kaiguan=0;
cs=0;
e=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(num=0;num<40;num++)
{
write_data(table[num]);
}
write_com(0x80+0x40);
for(num=0;num<40;num++)
{
write_data(table1[num]);
}
TMOD=0x01; /*定时器0方式1*/
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
ET0=1; /*开定时器0中断*/
TR0=1; /*启动定时器0*/
}
void timer0() interrupt 1 using 1
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
time++;
if(time==high) /*高电平持续时间结束,变低*/
P3_5=0; /*经过反相器反相*/
else if(time==period) /*周期时间到,变高*/
{ time=0;
P3_5=1; /*经过反相器反相*/
}
}
void AD()
{
wr=1;
wr=0;
wr=1;
rd=0;
delay(10);
}
void displaypres()
{
date=P1;
bai=date/100;
shi=date%100/10;
ge=date%10;
delay(10);
write_com(0x80+0x40+0x05);
write_data(0x30+bai);
write_data(0x30+shi);
write_data(0x30+ge);
}
void displayspeed()
{
write_com(0x80+0x40+0x12);
if (date<25)
{
high=1;
EA=1;
for(num=0;num<4;num++)
{
write_data(table2[num]);
}
}
else
if(date>=25)
{
if(date<=50)
{
high=15;
EA=1;
for(num=4;num<8;num++)
{
write_data(table2[num]);
}
}
else
if(date<=100)
{
high=50;
EA=1;
for(num=8;num<12;num++)
{
write_data(table2[num]);
}
}
else
if(date<=125)
{
high=90;
EA=1;
for(num=12;num<16;num++)
{
write_data(table2[num]);
}
}
else
if(date<=150)
{
high=120;
EA=1;
for(num=16;num<20;num++)
{
write_data(table2[num]);
}
}
else
if(date<=190)
{
high=150;
EA=1;
for(num=20;num<24;num++)
{
write_data(table2[num]);
}
}
else
if(date<=220)
{
high=190;
EA=1;
for(num=24;num<28;num++)
{
write_data(table2[num]);
}
}
else
if(date<=250)
{
EA=0;
for(num=28;num<32;num++)
{
write_data(table2[num]);
}
}
}
if(date<=48)
{
deng2=0;
deng3=0;
deng1=1;
}
else
if(date>=220)
{
deng1=0;
deng2=0;
deng3=1;
}
else
{
deng1=0;
deng3=0;
deng2=1;
}
}
void displaytemp()
{
read_temp();//读取温度
qian1=date1/1000;
bai1=date1%1000/100;
shi1=date1%1000%100/10;
ge1=date1%10;
delay(10);
if(tflag==0)
{
if(date1>950)
{
deng6=0;
deng5=0;
deng4=1;
}
else
{
deng5=1;
deng4=0;
deng6=0;
}
}
else
{
deng4=0;
deng5=0;
deng6=1;
}
if(tflag==0)
flagdat=0x20;//正温度不显示符号
else
flagdat=0x2d;//负温度显示负号:-
write_com(0x80+0x40+0x20);
write_data(flagdat);
write_data(0x30+qian1);
write_data(0x30+bai1);
write_data(0x30+shi1);
write_data(0x2e);//显示小数点
write_data(0x30+ge1);
write_data(0xDF);
}
void main()
{
init();
while(1)
{
AD();
displaypres();
displayspeed();
displaytemp();
}
} |