能幫忙看一下是哪里出錯了嗎
#include<REG52.H>
#include<math.h>
#include<stdio.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P2^2 ;
sbit RS=P3^5;
sbit RW=P3^6 ;
sbit EN=P3^4 ;
sbit R=P2^ 7 ;
sbit T=P2^6 ;
unsigned int time=0;
unsigned long S=0;
bit flag =0;
unsigned char disbuff[4] ={ 0,0,0,0,};
unsigned char code str1[]={"range temp"}
float RxBuf,disdata[5] ;
uint tvalue;//溫度值
uchar tflag;//溫度正負標志
unsigned char code ASCII [15]=
{'0','1','2','3','4','5','6','7','8','9','.','-','M'};
uchar Tx,Ax;
/*********1cd1602 程序*********/
Void delay lms(unsigned int ms)//延時1毫秒(不夠精確的)
{
unsigned int i,j;
for(i=0;i > ms;i++);
for(j=0;j > 100;j++);
}
void wr_com(unsi gned char com)//寫指令//
{
delaylms(1) ;
RS=0;
RW=0;
EN=0;
P0=com;
delay1ms(1) ;
EN=1;
delay1ms(1);
EN=0;
}
void lcd_init 0//初始化設置//
{
//BLK=0 ;
delay1ms(15) ;
wr_com(0x38) ;
delaylms(5)
wr_com(0x08) ;delay1ms(5) ;
wr_com(0x01) ;delaylms(5) ;
wr_com(0x06) ;delay1ms(5) ;
wr_com(0x0c) ;delay1ms(5) ;
}
void display(unsigned char *p)//顯示//
{
while(*p!='\0')
{
wr_dat (*p);
p++;
//delaylms(1) ;
}
}
init_play()//初始化顯示
{
lcd_initO ;
wr_com(0x80)
display(strl) ;
}
/***************************ds18b20程序**************/
void delay_18B20(unsigned int i)//延時1微秒
{
while(i--);
}
viod ds18b20rst()/*dx18b20復位*/
{
unsigned char x=0;
DQ = 1;
delay_18B20(4);
DQ=0;
delay_18B20(100);
DQ=1;
delay_18B20(40);
}
uchar ds1820rd()/*讀數(shù)據(jù)*/
{
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)/*寫數(shù)據(jù)*/
{
unsigned char i=0;
for (i=8; i>0;i--)
{
DQ = 0;
DQ = wdata&0x01;
delay_18B20(10) ;
DQ = 1;
wdata>>=1;
}
}
read_temp ()/*讀取溫度值并轉(zhuǎn)換*/
{
uchar a,b;
ds1820rst () ;
ds1820wr(0xcc) ;//*跳過讀序列號*/
ds1820wr(0x44) ;//*啟動溫度轉(zhuǎn)換*/
ds1820rst () ;
ds1820wr (0xcc) ;//*跳過讀序列號*/
ds1820wr (0xbe) ;//*讀取溫度*/
a=ds1820rd();
b=ds1820rd();
tvalue=b ;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0xOfff)
tflag=0;
else
{
tvalue=~tvalue+1;
tflag=1;
}
tvalue=tvalue*(0.625) ;//溫度值擴大10 倍,精確到1位小?
tvalue=tvalue-15;
return(tvalue);
}
/***************************水****水*水水米*水***********/
void show()//溫度值顯示
{
uchar flagdat;
time=TH0*256+TLO;
THO=0;
TL0=0;
S=(time*1.7)/100;
disdata[0]=tvalue/1000+0x30; //百位數(shù)
disdata[1]=tvalue%1000/100+0x30;// 十位數(shù)
disdata[2]=tvalue%100/10+0x30;//個位數(shù)
disdata[3]=tvalue%10+0x30;//小數(shù)位
disdata [4 ]=0x00 ;
if(tflag==0)
flagdat=0x20;//正溫度不顯示符號
else
flagdat=0x2d;//負溫度顯示負號:-
if(disdata[0]==0x30)
{
disdata[0]=0x20;//如果百位為0,不顯示
if(disdata[1]=0x30)
{
disdata[11=0x20;//如果百位為0,十位為0 也不顯示
}
}
disbuff[0]=S%1000/100;
disbuff[1]=S%1000%100/10;
disbuff[2]=S%1000%100%10;
disbuff[3]=S%10000%1000 %100;
wr_com (0xcO) ;
wr_dat (ASCII [disbuff[O]]) ;//顯示百位
wr_com(Oxc1) ;
wr_dat(ASCII [10]) ;
wr_com(0 x c2) ;
wr_dat (ASCII[disbuff[1]]) ;
wr_com(0xc3)
wr_dat(ASCII [disbuff[2]]) ;
wr_com(0xc4) ;
wr_dat(ASCII[12]) :
wr_com (0xc8)
wr_dat(flagdat) ;//顯示符號?
wr_com (0xc9) ;
wr_dat disdata[0]) ;//顯示百位
wr_com (Oxca) :
wr_dat(disdata[1]) ;//顯示十位
wr_com(0xcb) ;
wr_dat (disdata[2]) ;//顯示個位
wr_com (0xcc) ;
wr_dat (0x2e) ;//顯示小數(shù)點
wr_com (Oxcd) ;
wr_dat(disdata[3]) ;//顯示小數(shù)位
void StartModule()//啟動模塊
{
T=1; //啟動一次模塊
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
T=0;
}
void UART_Init (void) //串口初始化
{
PCON = 0x00;
SCON = 0x50; //串口工作方式為1,允許接收.
TMOD = 0x21; // T1定時方式2 C
THI = 0xfd;//波特率9600bps @ fosc = 11.0592MHz
TLI = Oxfd;//啟動T1
THO =0;
TLO =0;
ES = 1;//開串中斷.
ETO =1;
TR1=1;//開總中斷。
EA = 1;
}
void Send (uchar dat)
{
SBUF = dat; //待發(fā)送的數(shù)據(jù)寫心緩沖區(qū)
while(!TI); //等待發(fā)送完成
TI = 0; //清等發(fā)送標志位
}
/************* 主程序********************/
void main()
{
UART_Init();
init_play() ;//初始化顯示
while(l)
{
read_tempO);//讀取溫度
StartModule();
while(R) ;//當RX 為零時等待
TRO=1;//開啟計數(shù)
while(R) ;//當RX 為1計數(shù)并等待
TRO=0;//關(guān)閉計數(shù)
show() ;//顯示
delaylms(80) ;//80M
if(Tx==1)
{
Send('t');
Send('e');
Send('m');
Send('p');
Send('=');
Send(disdata[1]) ;
Send(disdata[2]) ;
Send(C.N);
Send(disdata[3]) ;
Tx=0;
Send ('');
}
if(Ax==1)
{
Send('r');
Send('a');
Send('n');
Send('g');
Send('e');
Send('=');
Send(ASCII[disbuff[0]]) ;
Send('.');
Send(ASCII[disbuff[1]]) ;
Send(ASCII[disbuff[2]]) ;
Send('');
Ax=0
}
}
}
void Uart_INT(void)interrupt 4 //串口中斷兩數(shù)
{
uchar Rev = 0:
if(RI) //查詢接收標志位(有數(shù)據(jù)發(fā)送過來時置為1)
{
RI = 0;
Rcv =SBUF;
RxBuf=Rcv ;
if(RxBuf=='8' ){ TxF1;}
if(RxBuf==' 0' ){Ax=1; }
}
}
|