PDA

View Full Version : nhờ giúp đở mạch tưới nước dùng 16f877 và lm 35


legolas_2801
29-04-2012, 10:55 AM
em mới tìm hiểu về PIC16F877A và viết bằng CCS nên ko biết nhiều, mong các anh chị chỉ giùm em.
e dùng lm35 và PIC16F877A! sườn bài như thế này:
- nếu A5=mức cao => B0=mức cao (delay_ms (100))
- nếu A5=mức thấp => B0=mức thấp (delay_ms(60000))
- trong lúc chân B0 đang ở mức thấp mà LM35 lên đến nhiệt độ là 37c thì B0 vẫn lên mức cao.
chương trình của em nếu chạy riêng 2 yêu cầu thì được nhưng nếu chạy chung thì LM35 có lên bao nhiêu độ chân B0 vẫn không lên mức cao được!
đây là code của em:
#include <16f877a.h>
#use delay(clock=4000000)
int i;
unsigned char tVal;
//+++++++++++++++++++++
void nhietdo()
{
if(tVal<=37)
{
output_low(PIN_B0);
delay_ms(1000);
}
else
{
output_high(PIN_B0);
delay_ms(1000);
}
}

//+++++++++++++++++++++
#INT_RTCC
void tuoi_theo_c()
{
nhietdo();
}
//+++++++++++++++++++++
void main()
{
enable_interrupts(GLOBAL);
enable_interrupts(INT_RTCC);
setup_timer_0(RTCC_DIV_8);
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports( RA0_RA1_ANALOG_RA3_REF );
while(TRUE)
{
set_adc_channel(0);
delay_ms(10);
tVal = (float)read_adc();
if(input(pin_A5))
{ output_high(PIN_B0);
delay_ms(100);
output_low (PIN_B0);
{ for (i=1;i<=10;++i)
delay_ms(6000);
}
}
}
}
Mong các anh chị giúp em gấp, còn mấy ngày nữa nộp bài rồi mà viết hoài không được!

lambaotrung
04-05-2012, 10:34 AM
Bạn xem toàn bộ phía dưới nhé.....


Ở chồ dòng láy giá trị và trả giá trị về tVal của bạn còn thiếu bước chuyển số sang độ.

LM35 thây đổi 10mv/độ. nhữ vậy adc của bạn chọn là 8 bit thì giá trị dc trả về cao nhất là 255. tương đương là khi LM35 đạt 500 độ th2i giá trị tVal sẽ là 255.

Sai chổ nào? cái của bạn viết ko sai. chỉ thiếu ổ chổ là

tVal=(float)read_adc()/0.51;

tại sao phải chia cho 0.51 vì sao? trả lời: 255/500=0.51.

như vậy giá trị của tVal trả về sé đúng với nhiệt độ thực thế.

//-------------- And phần đọc và trả giá trị ----------------//

ở phần tạo tưới nước cho cây thì bạn làm thế này.. nền dùng thêm IC fiplop ( IC nhỏ ) tham khảo google nhé.



vi du:
if(tval>=30)
{
output_high(pin_b0); // tao xung kich cho ic fiplop để mở bom
output_low(pin_b0);
}

if(tval<30)
{
output_high(pin_b0); // tao lai 1 xung kich ở ic fiplop để tắt Bơm
output_low(pin_b0);
}

rất đơn giản bạn ah...

bạn nên kết noi thêm 1 cái LCD để hiển thị nhiệt độ để kiểm chứng.... chúc bạn thành công ..