PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Các ngôn ngữ lập trình khác (CCS C, HT PIC,...) (http://www.picvietnam.com/forum/forumdisplay.php?f=12)
-   -   Xem giúp mình lỗi code cho lm35 này với (http://www.picvietnam.com/forum/showthread.php?t=30135)

loveboom3012 09-08-2012 09:29 PM

Xem giúp mình lỗi code cho lm35 này với
 
1 Attachment(s)
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,0x90};
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

Trích:

Nguyên văn bởi toancdt (Post 77079)
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

Trích:

Nguyên văn bởi loveboom3012 (Post 77082)
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

Trích:

Nguyên văn bởi toancdt (Post 77090)
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

Trích:

Nguyên văn bởi loveboom3012 (Post 77101)
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

1 Attachment(s)
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
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,0x90};
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.


Múi giờ GMT. Hiện tại là 06:09 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam