PDA

View Full Version : Xem giúp mình lỗi code cho lm35 này với


loveboom3012
09-08-2012, 09:29 PM
#include <16f877a.h>
#include <def_877a.h>
#device ADC=10
#fuses nowdt,noprotect,nolvp,hs
#use delay(clock=20000000)
const unsigned char ma7[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x9 0};
int16 kqadc;
int dem,dv,ch,tr,ng,i;
unsigned char mdv,mch,mtr,mng;
void giaima7doan(int16 tam)
{
ng=tam/1000;
tam=tam%1000;
tr=tam/100;
tam=tam%100;
ch=tam/10;
dv=tam%10;
mng=ma7[ng];
mtr=ma7[tr];
mch=ma7[ch];
mdv=ma7[dv];
mch=mch&0x7f;
}
//hien thi quet led
void hienthi()
{
for(i=0;i<=30;i++)
{
output_d(mdv); output_low(pin_b2); delay_us(100); output_high(pin_b2);
output_d(mch); output_low(pin_b3); delay_us(100); output_high(pin_b3);
output_d(mtr); output_low(pin_b4); delay_us(100); output_high(pin_b4);
output_d(0x9c); output_low(pin_b1); delay_us(100); output_high(pin_b1);
output_d(0xc6); output_low(pin_b0); delay_us(100); output_high(pin_b0);
}
}
void main()
{
set_tris_A(0b00000001);
set_tris_D(0x00);
set_tris_b(0x00);
// set_tris_C(0x00);
output_b(0xff);
setup_ADC(ADC_clock_div_32);
setup_adc_ports(AN0);
set_adc_channel(0);
while(1)
{
kqadc=4.887*read_adc();
giaima7doan(kqadc);
hienthi();
if(kqadc>40)
{
output_high(pin_c0);
}
else
{
output_low(pin_c0);
}

}
}

theo ý mình coded thì khi nhiệt độ quá 40 độ thì pin RC0 lên mức high, dưới 40 độ thì mức low , nhưng khi mô phỏng thì nhiệt độ chưa tới 40 pin RC0 đã lên mức high rồi, xem giúp mình với !hình đã đính kèm

toancdt
10-08-2012, 12:06 AM
bạn nên thêm dòng kqadc=0.4887*read_adc(); ở dưới hienthi(); trong vòng lặp while

loveboom3012
10-08-2012, 02:01 PM
bạn nên thêm dòng kqadc=0.4887*read_adc(); ở dưới hienthi(); trong vòng lặp while
mình đã sửa lại theo ý của bạn, nhưng vẫn bị giống vậy à , hix

toancdt
10-08-2012, 03:40 PM
mình đã sửa lại theo ý của bạn, nhưng vẫn bị giống vậy à , hix

sửa như vậy mình test thử là đúng rồi, đâu bạn gửi code bạn lên đây mình kiểm tra lại xem

toancdt
10-08-2012, 04:45 PM
khi bạn mô phỏng thấy hiển thị chưa đến 40 mà rc0 đã lên mức cao nhưng thực tế biến kqadc đã lớn hơn 40 rất nhiều. cụ thể là tăng 1 độ thì giá trị adc của bạn sẽ tăng 2.046, nếu nhiệt độ là 5 thì giá trị adc đọc được là 2.046x5=10.23 => kqadc=4.887*10.23=49.99 => từ 5 độ trở lên biến kqadc đã lớn hơn 40 nên rc0 lên mức cao là phải thôi.

bạn sửa lại như dưới đây là chạy được.

kqadc=4.887*read_adc();// nếu bạn dùng biến kqadc này để so sánh sẽ không đúng
giaima7doan(kqadc);
hienthi();
kqadc=0.4887*read_adc();// thêm dòng này vào
if(kqadc>40)

loveboom3012
10-08-2012, 08:03 PM
khi bạn mô phỏng thấy hiển thị chưa đến 40 mà rc0 đã lên mức cao nhưng thực tế biến kqadc đã lớn hơn 40 rất nhiều. cụ thể là tăng 1 độ thì giá trị adc của bạn sẽ tăng 2.046, nếu nhiệt độ là 5 thì giá trị adc đọc được là 2.046x5=10.23 => kqadc=4.887*10.23=49.99 => từ 5 độ trở lên biến kqadc đã lớn hơn 40 nên rc0 lên mức cao là phải thôi.

bạn sửa lại như dưới đây là chạy được.

kqadc=4.887*read_adc();// nếu bạn dùng biến kqadc này để so sánh sẽ không đúng
giaima7doan(kqadc);
hienthi();
kqadc=0.4887*read_adc();// thêm dòng này vào
if(kqadc>40)
tai sao ko phai la
kqadc=4.887*read_adc(); ma la kqadc=0.4887*read_adc(); zay ban

toancdt
10-08-2012, 08:59 PM
tai sao ko phai la
kqadc=4.887*read_adc(); ma la kqadc=0.4887*read_adc(); zay ban

trích:
Dùng ADC 10 bít, điện áp lấy mẫu Vdd = 5V, sensor LM35 (10 mV / 1 độ C)
Xác định nhiệt độ đo được qua số đo trên chân ADC:
Ta có: 5000 mV --- ứng với --- 1023 (thang đo ADC 10 bít)
Vậy: 10 mV --- ứng với --- 10 x 1023/5000 = 2.046
Con số 2.046 tính được đó chính là lượng thay đổi trên chân ADC ứng với thay đổi 10mV ở đầu ra LM35 hay ứng với thay đổi 1 độ C trên LM35.

Suy ra nhiệt độ đo được: Nhiệt độ = read_adc / 2.046 (1/2.046=0.4887)
-----------------------------------------------------------------------------------------

loveboom3012
10-08-2012, 11:59 PM
mình đã làm được rồi, mô phỏng chạy nhưng protues báo lỗi thế này bạn xem giùm mình nha, code

#include <16f877a.h>
#include <def_877a.h>
#device ADC=10
#fuses nowdt,noprotect,nolvp,hs
#use delay(clock=20000000)
const unsigned char ma7[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x9 0};
int16 kqadc;
int dem,dv,ch,tr,ng,i;
unsigned char mdv,mch,mtr,mng;
void giaima7doan(int16 tam)
{
ng=tam/1000;
tam=tam%1000;
tr=tam/100;
tam=tam%100;
ch=tam/10;
dv=tam%10;
mng=ma7[ng];
mtr=ma7[tr];
mch=ma7[ch];
mdv=ma7[dv];
mch=mch&0x7f;
}
//hien thi quet led
void hienthi()
{
for(i=0;i<=30;i++)
{
output_d(mdv); output_low(pin_b2); delay_us(100); output_high(pin_b2);
output_d(mch); output_low(pin_b3); delay_us(100); output_high(pin_b3);
output_d(mtr); output_low(pin_b4); delay_us(100); output_high(pin_b4);
output_d(0x9c); output_low(pin_b1); delay_us(100); output_high(pin_b1);
output_d(0xc6); output_low(pin_b0); delay_us(100); output_high(pin_b0);
}
}
void main()
{
set_tris_A(0b00000001);
set_tris_D(0x00);
set_tris_b(0x00);
// set_tris_C(0x00);
portb=0xff;
setup_ADC(ADC_clock_div_32);
setup_adc_ports(AN0);
set_adc_channel(0);
while(1)
{
kqadc=0;
for(i=0;i<10;i++)
{kqadc=kqadc+read_adc();}
kqadc=kqadc/10;
kqadc=kqadc*4.887;
giaima7doan(kqadc);
hienthi();
kqadc=0.4887*read_adc();
if(kqadc>40)
{
output_high(pin_c0);
}
else
{
output_low(pin_c0);
}

}
}

báo lỗi

toancdt
11-08-2012, 10:26 AM
proteus: http://www.mediafire.com/?mcp28259cwgwmup
ccs : http://www.mediafire.com/?pwd053o8i5yco9x

code và mô phỏng trên đây chạy như yêu cầu của bạn, nếu bạn chạy thấy bị lỗi nữa thì kiểm tra lại 2 phần mềm đó coi bị lỗi gì không.