Đây là đoạn code em giao tiếp ds1820 với 89 mà không hiển thị được nhiệt độ.Em sửa mấy ngày nay.Đọc rất nhiều tài liệu mà vẫn ko chạy được.
Bỏ qua đoạn đầu là em viết hiển thị qua led ma trận.Đoạn sau em sửa từ code trên mạng.Hjc, nó chỉ hiển thị nhiệt độ là 85 độ.Giá trị mặc định trong bộ nhớ nháp của DS 1820, phần convert nhiệt độ ko biết em viết sai j.
Em post cả mạch mô phỏng trên proteus file .hex ở dưới.Mọi người chạy thử rùi giúp em với.Em sắp phải nộp bài tập rùi.
#include <t89c51rd2.h>
#include <intrins.h>
sbit DQ = P3^0;
signed char T=50;
unsigned char Rdata,count,count2,temp;
unsigned char SPAD[8];
unsigned int i;
unsigned int Tf;
bit FSerial;
bit presence=0;
unsigned char dem,count,count2;
unsigned int count1;
unsigned char cot[8] ={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
unsigned char so0[4] ={0x00,0x3E,0x41,0x3E};
unsigned char so1[4] ={0x00,0x10,0x20,0x7F};
unsigned char so2[4] ={0x00,0x4F,0x49,0x79};
unsigned char so3[4] ={0x00,0x49,0x49,0x36};
unsigned char so4[4] ={0x00,0x78,0x08,0x1F};
unsigned char so5[4] ={0x00,0x79,0x79,0x4E};
unsigned char so6[4] ={0x00,0x7F,0x49,0x4F};
unsigned char so7[4] ={0x00,0x40,0x40,0x7F};
unsigned char so8[4] ={0x00,0x36,0x49,0x36};
unsigned char so9[4] ={0x00,0x79,0x49,0x7F};
unsigned char dau_tru[4] ={0x00,0x10,0x10,0x10};
unsigned char do_c[6] ={0x00,0xC0,0xC0,0x3E,0x41,0x22};
void delay_ms(unsigned char time)
{unsigned char x;
unsigned int y;
for(x=0;x<time;x++)
for(y=0;y<330;y++);}
void hien_thi_so(unsigned char so)
{
switch(so)
{case 0 : P1=so0[dem+count2];break;
case 1 : P1=so1[dem+count2];break;
case 2 : P1=so2[dem+count2];break;
case 3 : P1=so3[dem+count2];break;
case 4 : P1=so4[dem+count2];break;
case 5 : P1=so5[dem+count2];break;
case 6 : P1=so6[dem+count2];break;
case 7 : P1=so7[dem+count2];break;
case 8 : P1=so8[dem+count2];break;
case 9 : P1=so9[dem+count2];break;
case 10: P1=dau_tru[dem+count2];break;}
}
void hien_thi_nhiet_do(signed char nhiet_do) //cot P1 hang P2 5v hang 0v cot
{
unsigned char a,b,c;
if (nhiet_do>=0) {c=nhiet_do%10;nhiet_do=nhiet_do/10;b=nhiet_do%10;nhiet_do=nhiet_do/10;a=nhiet_do;}
else {nhiet_do=-nhiet_do;c=nhiet_do%10;nhiet_do=nhiet_do/10;b=nhiet_do%10;a=10;}
for(count=0;count<15;count++)
for(count1=0;count1<40;count1++)
for(dem=0;dem<8;dem++)
{
P2=0xFF;
if((dem+count)<=4)
{count2=count; P2=cot[dem];hien_thi_so(a);}
else if((dem+count)<=8)
{count2=count-4;P2=cot[dem];hien_thi_so(b);}
else if((dem+count)<=12)
{count2=count-8;P2=cot[dem];hien_thi_so(c);}
else if((dem+count)<=17)
{count2=count-12;P2=cot[dem];P1=do_c[dem+count2];}
else P1=0x00;
delay_ms(1);
P1=0x00;
}
}
void Delay(unsigned int time) //
{for (i=0;i<time;i++);}
//************************************************** *******
Init_1W()
{ DQ=0;
Delay(50);
DQ=1;
Delay(10);
if (DQ==0)
{presence=1;}
else
{presence=0;}}
void Write_1W(unsigned char Data)
{
bit outbit;
for (count=1;count<=8;count++)
{
outbit=Data & 0x01;
Data=Data>>1;
if (outbit==1)
{DQ=0;
_nop_(); _nop_();
DQ=1;
Delay(5);
}
else
{
DQ=0;
Delay(5);
DQ=1;
_nop_();_nop_();_nop_();
}}}
Read_1W()
{
bit Ibit;
Rdata=0;
EA=0;
for (count=1;count<=8;count++)
{
Rdata=Rdata>>1;
DQ=0;
_nop_();_nop_();
DQ=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_n op_();_nop_();_nop_();
Ibit=DQ;
if (Ibit==1)
Rdata=Rdata|0x80;
Delay(6);
EA=1;
}
}
Get_Temperature()
{
DQ=1;Delay(300);
Init_1W();
if (presence==1)
{
Write_1W(0x44);
while (Rdata==0x00)
{
Read_1W();
Delay(1000);
}
Init_1W();
Delay(3300);
Write_1W(0xCC);
Write_1W(0XBE);
Delay(3400);
for (count2=0;count2<9;count2++) {
Read_1W();
SPAD[count2]=Rdata;
}
Init_1W();
T=SPAD[0]>>4;
T=T|(SPAD[1]<<4);
hien_thi_nhiet_do(T); } }
void main()
{i=0;
DQ=1;
while(1)
{Get_Temperature();}}
Bỏ qua đoạn đầu là em viết hiển thị qua led ma trận.Đoạn sau em sửa từ code trên mạng.Hjc, nó chỉ hiển thị nhiệt độ là 85 độ.Giá trị mặc định trong bộ nhớ nháp của DS 1820, phần convert nhiệt độ ko biết em viết sai j.
Em post cả mạch mô phỏng trên proteus file .hex ở dưới.Mọi người chạy thử rùi giúp em với.Em sắp phải nộp bài tập rùi.
#include <t89c51rd2.h>
#include <intrins.h>
sbit DQ = P3^0;
signed char T=50;
unsigned char Rdata,count,count2,temp;
unsigned char SPAD[8];
unsigned int i;
unsigned int Tf;
bit FSerial;
bit presence=0;
unsigned char dem,count,count2;
unsigned int count1;
unsigned char cot[8] ={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
unsigned char so0[4] ={0x00,0x3E,0x41,0x3E};
unsigned char so1[4] ={0x00,0x10,0x20,0x7F};
unsigned char so2[4] ={0x00,0x4F,0x49,0x79};
unsigned char so3[4] ={0x00,0x49,0x49,0x36};
unsigned char so4[4] ={0x00,0x78,0x08,0x1F};
unsigned char so5[4] ={0x00,0x79,0x79,0x4E};
unsigned char so6[4] ={0x00,0x7F,0x49,0x4F};
unsigned char so7[4] ={0x00,0x40,0x40,0x7F};
unsigned char so8[4] ={0x00,0x36,0x49,0x36};
unsigned char so9[4] ={0x00,0x79,0x49,0x7F};
unsigned char dau_tru[4] ={0x00,0x10,0x10,0x10};
unsigned char do_c[6] ={0x00,0xC0,0xC0,0x3E,0x41,0x22};
void delay_ms(unsigned char time)
{unsigned char x;
unsigned int y;
for(x=0;x<time;x++)
for(y=0;y<330;y++);}
void hien_thi_so(unsigned char so)
{
switch(so)
{case 0 : P1=so0[dem+count2];break;
case 1 : P1=so1[dem+count2];break;
case 2 : P1=so2[dem+count2];break;
case 3 : P1=so3[dem+count2];break;
case 4 : P1=so4[dem+count2];break;
case 5 : P1=so5[dem+count2];break;
case 6 : P1=so6[dem+count2];break;
case 7 : P1=so7[dem+count2];break;
case 8 : P1=so8[dem+count2];break;
case 9 : P1=so9[dem+count2];break;
case 10: P1=dau_tru[dem+count2];break;}
}
void hien_thi_nhiet_do(signed char nhiet_do) //cot P1 hang P2 5v hang 0v cot
{
unsigned char a,b,c;
if (nhiet_do>=0) {c=nhiet_do%10;nhiet_do=nhiet_do/10;b=nhiet_do%10;nhiet_do=nhiet_do/10;a=nhiet_do;}
else {nhiet_do=-nhiet_do;c=nhiet_do%10;nhiet_do=nhiet_do/10;b=nhiet_do%10;a=10;}
for(count=0;count<15;count++)
for(count1=0;count1<40;count1++)
for(dem=0;dem<8;dem++)
{
P2=0xFF;
if((dem+count)<=4)
{count2=count; P2=cot[dem];hien_thi_so(a);}
else if((dem+count)<=8)
{count2=count-4;P2=cot[dem];hien_thi_so(b);}
else if((dem+count)<=12)
{count2=count-8;P2=cot[dem];hien_thi_so(c);}
else if((dem+count)<=17)
{count2=count-12;P2=cot[dem];P1=do_c[dem+count2];}
else P1=0x00;
delay_ms(1);
P1=0x00;
}
}
void Delay(unsigned int time) //
{for (i=0;i<time;i++);}
//************************************************** *******
Init_1W()
{ DQ=0;
Delay(50);
DQ=1;
Delay(10);
if (DQ==0)
{presence=1;}
else
{presence=0;}}
void Write_1W(unsigned char Data)
{
bit outbit;
for (count=1;count<=8;count++)
{
outbit=Data & 0x01;
Data=Data>>1;
if (outbit==1)
{DQ=0;
_nop_(); _nop_();
DQ=1;
Delay(5);
}
else
{
DQ=0;
Delay(5);
DQ=1;
_nop_();_nop_();_nop_();
}}}
Read_1W()
{
bit Ibit;
Rdata=0;
EA=0;
for (count=1;count<=8;count++)
{
Rdata=Rdata>>1;
DQ=0;
_nop_();_nop_();
DQ=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_n op_();_nop_();_nop_();
Ibit=DQ;
if (Ibit==1)
Rdata=Rdata|0x80;
Delay(6);
EA=1;
}
}
Get_Temperature()
{
DQ=1;Delay(300);
Init_1W();
if (presence==1)
{
Write_1W(0x44);
while (Rdata==0x00)
{
Read_1W();
Delay(1000);
}
Init_1W();
Delay(3300);
Write_1W(0xCC);
Write_1W(0XBE);
Delay(3400);
for (count2=0;count2<9;count2++) {
Read_1W();
SPAD[count2]=Rdata;
}
Init_1W();
T=SPAD[0]>>4;
T=T|(SPAD[1]<<4);
hien_thi_nhiet_do(T); } }
void main()
{i=0;
DQ=1;
while(1)
{Get_Temperature();}}
Comment