有哪位大佬幫忙看看的
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit ds=P2^7;
sbit CS=P3^4;
sbit SID=P3^5;
sbit SCLK=P3^6;
sbit PSB=P3^7;
char code table[]={"temperature:"};
char data disdate[8];
uchar tflag; //溫度正負標志
uchar value=0; //溫度
/******************************液晶顯示程序******************************/
void delay(uchar z)
{
uchar i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void sendbyte(uchar byte)
{
uchar i;
for(i=0;i<8;i++)
{
SCLK=1;
if(byte&0x80)
SID=1;
else
SID=0;
SCLK=0;
byte<<=1;
}
}
void write_cmd(uchar cmd)
{
CS=1;
sendbyte(0xf8);
sendbyte(cmd&0xf0);
sendbyte(cmd<<4&0xf0);
CS=0;
delay(10);
}
void write_data(uchar date)
{
CS=1;
sendbyte(0xfa);
sendbyte(date&0xf0);
sendbyte(date<<4&0xf0);
CS=0;
delay(10);
}
void dizhi(uchar x,uchar y)
{
uchar address;
switch(x)
{
case 1:address=0x80+y;break;
case 2:address=0x90+y;break;
case 3:address=0x88+y;break;
case 4:address=0x98+y;break;
}
write_cmd(address);
}
void guding(uchar l,uchar k,uchar *s)
{
dizhi(l,k);
while(*s)
{
write_data(*s);
s++;
}
}
void init()
{
PSB=0;
write_cmd(0x30);
write_cmd(0x01);
write_cmd(0x02);
write_cmd(0x06);
write_cmd(0x0e);
}
/******************************傳感器ds1802程序*******************************/
void yanshi(uint i) //延時1微秒
{
while(i--);
}
uchar fuwei() //復位
{
bit ok;
ds=1;
yanshi(4);
ds=0;
yanshi(200);
yanshi(300); //延時時間在480us~960us
ds=1;
yanshi(50); //延時等待,確定傳感器的存在
ok=ds;
yanshi(25);
return ok;
}
uchar read_date() //讀數據
{
uchar i=0;
uchar date=0;
for(i=0;i<8;i++)
{
ds=0;
date>>=1;
ds=1;
if(ds) //執行到這電平已經穩定,不用再加延時
date|=0x80;
yanshi(30);
}
return(date);
}
void write_date(uchar wdata) //寫數據
{
uchar i=0;
for(i=0;i>8;i++)
{
ds=0;
yanshi(15); //區分讀寫,讓讀的時間過去
ds=wdata&0x01;
yanshi(45); //讓有效數據穩定
ds=1; //電平穩定后,釋放總線
wdata>>=1;
}
}
int read_temp() //讀取溫度并轉換
{
uchar a,b;
fuwei();
write_date(0xcc); //跳過讀序列號
write_date(0x44); //啟動溫度轉換
yanshi(10); //給芯片轉換溫度的時間
fuwei();
write_date(0xcc);
write_date(0xbe); //讀溫度
a=read_date(); //低八位
b=read_date(); //高八位
value=b;
value<<=8;
value=value|a;
if(value<0x0fff)
tflag=0;
else
{
value=~value+1;
tflag=1;
}
value=value*(0.625)+0.5;
return value;
}
void display()
{
disdate[0]=0x30; //正負號位
disdate[1]=value/1000+0x30; //百位
disdate[2]=value%1000/100+0x30; //十位
disdate[3]=value%100/10+0x30; //個位
disdate[4]=0x2e; //小數點
disdate[5]=value%10+0x30; //小數
if(tflag==0)
disdate[0]=0x2b; //如果溫度為正,不顯示
else
disdate[0]=0x2d;
if(disdate[1]==0x30) //如果百位為零不顯示
{
disdate[1]=0x20;
if(disdate[2]==0x30) //如果百位,個位為零,也不顯示
disdate[2]=0x20;
}
}
/******************************主程序*****************************/
void main()
{
init();
delay(5);
guding(1,0,table);
while(1)
{
read_temp(); //讀溫度
display(); //顯示溫度
guding(2,1,disdate);
}
}
|