PDA

View Full Version : nhờ giúp đỡ code đo nhiệt độ hiển thi ra led dung DS18B20


lyxa_bk
24-01-2014, 12:48 PM
đây là đoạn code của mình, ai hiểu sâu vấn đề nào vào tư vấn giúp mình với

#include <main.h>
#define DQ pin_c1 // chân C1 nối DQ
const char m[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x9 0};
int nghin,tram,chuc,donvi;
// hiển thị ra led 7 đoạn, hàm này chạy tốt vì mình đã đo ADC qua hiển thị led.
void hienthiso(int16 c)
{
nghin=c/1000;
tram=(c%1000)/100;
chuc=((c%1000)%100)/10;
donvi= (((c%1000)%100)%10)/1;
while(true)
{
if(nghin>0)
{
output_d(m[nghin]);
output_a(12);
delay_ms(1);
output_d(255);
delay_ms(1);
}
if(tram>0||nghin>0)
{
output_d(m[tram]);
output_a(16);
delay_ms(1);
output_d(255);
delay_ms(1);
}
if(chuc>0||tram>0||nghin>0)
{
output_d(m[chuc]);
output_a(20);
delay_ms(1);
output_d(255);
delay_ms(1);
}
if(donvi>=0||chuc>0||tram>0||nghin>0)
{
output_d(m[donvi]);
output_a(24);
delay_ms(1);
output_d(255);
delay_ms(1);
}
}
}
// reset va start DS18B20
char reset_start()
{
int a;
output_low(DQ);
delay_us(480);
output_float(DQ);
delay_us(65);
a=!input(DQ);
delay_us(240);
if(a)
return(1);
else
return(0);
}
//doc 1 byte tu DS18B20
byte read_byte()
{
byte i;
byte Din;
for(i=0;i<8;i++)
{
output_low(DQ);
delay_us(4);
output_float(DQ);
delay_us(5);
shift_right(&Din,1,input(DQ));
delay_us(100);
}
return (Din);
}
//ghi 1 byte len DS18B29
byte write_byte(byte Dout)
{
byte i;
for(i=0;i<8;i++)
{
output_low(DQ);
delay_us(10);
if(shift_right(&Dout,1,0))
output_high(DQ);
else
output_low(DQ);
delay_us(5);
output_high(DQ);
delay_us(5);
}
return(1);
}
void config(unsigned char A_th,A_tl,mode)
{
reset_start();
write_byte(0x4e);
write_byte(A_th);
write_byte(A_tl);
write_byte(mode);
}
// doc nhiet do
float read_tem()
{
int8 busy=0, tem1, tem2;
int16 tem3;
float result;
reset_start();
write_byte(0xCC);
write_byte(0x44);
while(busy==0)
busy=read_byte();
reset_start();
write_byte(0xCC);
write_byte(0xBE);
tem1=read_byte();
tem2=read_byte();
tem3= make16(tem2,tem1);
result=(float)tem3/16.0;
delay_ms(200);
return(result);
}
void main()
{
float tem;
while(true)
{
tem = read_tem();
hienthiso(tem);
}
}


mình không rõ là sai ở đâu khi nạp code thì thấy hiện lên số 4095 trên led 7 đoan??

1041002
13-07-2014, 10:46 PM
đây là đoạn code của mình, ai hiểu sâu vấn đề nào vào tư vấn giúp mình với

#include <main.h>
#define DQ pin_c1 // chân C1 nối DQ
const char m[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x9 0};
int nghin,tram,chuc,donvi;
// hiển thị ra led 7 đoạn, hàm này chạy tốt vì mình đã đo ADC qua hiển thị led.
void hienthiso(int16 c)
{
nghin=c/1000;
tram=(c%1000)/100;
chuc=((c%1000)%100)/10;
donvi= (((c%1000)%100)%10)/1;
while(true)
{
if(nghin>0)
{
output_d(m[nghin]);
output_a(12);
delay_ms(1);
output_d(255);
delay_ms(1);
}
if(tram>0||nghin>0)
{
output_d(m[tram]);
output_a(16);
delay_ms(1);
output_d(255);
delay_ms(1);
}
if(chuc>0||tram>0||nghin>0)
{
output_d(m[chuc]);
output_a(20);
delay_ms(1);
output_d(255);
delay_ms(1);
}
if(donvi>=0||chuc>0||tram>0||nghin>0)
{
output_d(m[donvi]);
output_a(24);
delay_ms(1);
output_d(255);
delay_ms(1);
}
}
}
// reset va start DS18B20
char reset_start()
{
int a;
output_low(DQ);
delay_us(480);
output_float(DQ);
delay_us(65);
a=!input(DQ);
delay_us(240);
if(a)
return(1);
else
return(0);
}
//doc 1 byte tu DS18B20
byte read_byte()
{
byte i;
byte Din;
for(i=0;i<8;i++)
{
output_low(DQ);
delay_us(4);
output_float(DQ);
delay_us(5);
shift_right(&Din,1,input(DQ));
delay_us(100);
}
return (Din);
}
//ghi 1 byte len DS18B29
byte write_byte(byte Dout)
{
byte i;
for(i=0;i<8;i++)
{
output_low(DQ);
delay_us(10);
if(shift_right(&Dout,1,0))
output_high(DQ);
else
output_low(DQ);
delay_us(5);
output_high(DQ);
delay_us(5);
}
return(1);
}
void config(unsigned char A_th,A_tl,mode)
{
reset_start();
write_byte(0x4e);
write_byte(A_th);
write_byte(A_tl);
write_byte(mode);
}
// doc nhiet do
float read_tem()
{
int8 busy=0, tem1, tem2;
int16 tem3;
float result;
reset_start();
write_byte(0xCC);
write_byte(0x44);
while(busy==0)
busy=read_byte();
reset_start();
write_byte(0xCC);
write_byte(0xBE);
tem1=read_byte();
tem2=read_byte();
tem3= make16(tem2,tem1);
result=(float)tem3/16.0;
delay_ms(200);
return(result);
}
void main()
{
float tem;
while(true)
{
tem = read_tem();
hienthiso(tem);
}
}


mình không rõ là sai ở đâu khi nạp code thì thấy hiện lên số 4095 trên led 7 đoan??

Bạn có thể xem project tại đây (có code và mô phỏng)
http://www.picvietnam.com/forum/showthread.php?t=31124&page=2

dung07d6
19-08-2016, 01:28 PM
Nhờ các cao thủ chỉ giáo cho, không biết code sai ở đoạn nào. Khi mô phỏng thì led không có hiện tượng gì.
//=========================================

#include <16f877a.h>
#include <def_877a.h>
#device *=16 ADC=10
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP,NOCPD, NOWRT
#use delay(clock=8m)
#use rs232(baud=9600,parity=N,xmit=PIN_B5,rcv=PIN_B2,bi ts=9)
#use i2c(Master,Fast,sda=PIN_B1,scl=PIN_B4)
#define DS18B20_PIN RA4
#define DS18B20_SKIP_ROM 0xCC
#define DS18B20_CONVERT_T 0x44
#define DS18B20_READ_SCRATCH_PAD 0xBE
#define led1 RB1
#define led2 RB2
#define led3 RB3

//------------------------------------------------------------------------------------
void DS18B20_RESET()
{
output_low(DS18B20_PIN);
delay_us(500);

output_float(DS18B20_PIN);
delay_us(500);

output_float(DS18B20_PIN);
}

//------------------------------------------------------------------------------------

void DS18B20_write_byte(unsigned char data)
{
unsigned char i = 8;
while(i--)
{
output_low(DS18B20_PIN);
delay_us(2);

output_bit(DS18B20_PIN, shift_right(&data, 1, 0));
delay_us( 60 );

output_float(DS18B20_PIN);
delay_us( 2 );
}
}

//------------------------------------------------------------------------------------

FLOAT DS18B20_READ_BYTE()
{
unsigned char data, i=8;
while(i--)
{
output_low(DS18B20_PIN);
delay_us(2);

output_float(DS18B20_PIN);
delay_us(8);

shift_right(&data, 1, input(DS18B20_PIN));
delay_us(120);
}
return data;
}

//------------------------------------------------------------------------------------
float ds18b20_read()
{
int8 busy, temp1, temp2;
int16 temp3;
float result;

while(1)
{
DS18B20_RESET();
DS18B20_write_byte(0xCC) ;
DS18B20_write_byte(0x44);

while(busy==0)
busy=DS18B20_READ_BYTE();

DS18B20_RESET();
DS18B20_write_byte(0xCC) ;
DS18B20_write_byte(0xBE);

temp1=DS18B20_READ_BYTE();
temp2=DS18B20_READ_BYTE();
temp3=make16(temp2,temp1);

delay_ms(200);
}
return temp3;
}
//------------------------------------------------------------------------------------

void main()
{
int16 nhiet_do;
unsigned char int_part, decimal_part, HC, HDV;
unsigned char ma7doan[10]={0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x9 0};

while(1)
{
nhiet_do=ds18b20_read();
int_part=nhiet_do>>4;
HC=int_part/10;
HDV=nhiet_do%10;

decimal_part=(nhiet_do&0x000f);
decimal_part=decimal_part*10/16;

output_high(RB1);
output_C(ma7doan[HC]);
delay_ms(2);
output_low(RB1);


output_high(RB2);
output_C(ma7doan[HDV]);
delay_ms(2);
output_low(RB2);

output_high(RB3);
output_C(ma7doan[decimal_part]);
delay_ms(2);
output_low(RB3);

}
}