PDA

View Full Version : PIC16F877A và LM 35 nhờ giúp đở


pitpro09
08-07-2014, 12:18 AM
Hiện tại em đang làm cái mạch điều khiển tắt mở thiết bị bằng VB6 dựa vào nhiệt độ đo được. Mọi thứ chạy ok chỉ tội PIC không đo đúng nhiệt độ, nó chạy tùm lum hết. Moih người giúp e chỉ cách viết hàm nhiệt độ cho PIC16F877A bằng CSS và cách truyền nó lên VB. Đồng thời trên VB chỉ e cách nhận và hiển thị giá trị nhiệt độ đúng với nhé. Xin chân thanh cảm ơn. E đã cày cả tuần, tìm cả đống công thức bỏ vào nó cũng sai tè le.
Sau đây là code C của e mọi người chỉ e chổ sai với nhé:
//-----------------------------------------------//
//-----------------------------------------------//
#include <16f877a.h>
#include <DEF_877A.h>
#DEVICE *=16 ADC=10
#use delay(clock=20000000)
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bi ts=8)
#bit b0 = portb.0 //NUT NHAN TB01
#bit b1 = portb.1 //NUT NHAN TB02
#bit b2 = portb.2 //NUT NHAN TB03
#bit b3 = portb.3 //NUT NHAN TB04
#bit b4 = portb.4 //NUT NHAN TB05
#bit b5 = portb.5 //NUT NHAN OFF ALL
#bit b6 = portb.6 //DU TRU
#bit b7 = portb.7 //DU TRU
#bit d0 = portd.0 //DIEU KHIEN TB01
#bit d1 = portd.1 //DIEU KHIEN TB02
#bit d2 = portd.2 //DIEU KHIEN TB03
#bit d3 = portd.3 //DIEU KHIEN TB04
#bit d4 = portd.4 //DIEU KHIEN TB05 CAP 1
#bit d5 = portd.5 //DIEU KHIEN TB05 CAP 2
#bit d6 = portd.6 //DU TRU
#bit d7 = portd.7 //DU TRU
#bit e0 = porte.0 //LED BAO NHAN DU LIEU TU MAY TINH
#bit e1 = porte.1 //LED BAO GUI DU LIEU LEN MAY TINH
#bit e2 = porte.2 //LED CANH BAO NHIET DO
char i;
unsigned dem, value;
void dieukhien();
void capnhat();
void baodong();
void receive();
void main()
{

//**********************************
// KHOI TAO

//**********************************
set_tris_d(0);
output_d(0xff);
set_tris_b(255);
set_tris_e(0b000);
output_e(0b111);
enable_interrupts(int_rda);
enable_interrupts(global);
setup_adc(adc_clock_internal);
setup_adc_ports(AN0);
set_adc_channel(1);

//**********************************
// LED dich trai - phai

//**********************************
if (PortE == 0b111) //LED PortE deu tat
{
delay_ms(300);
e0 = 0;
delay_ms(300);
e0 = 1; e1 = 0;
delay_ms(300);
e1 = 1; e2 = 0;
delay_ms(300);
e2 = 1;
delay_ms(300);
e2 = 0;
delay_ms(300);
e2 = 1; e1 = 0;
delay_ms(300);
e1 = 1; e0 = 0;
delay_ms(300);
e0 = 1;
delay_ms(300);
}

//**********************************
// Nut Nhan Dieu Khien

//**********************************
while(true)
{
if (b0 == 0) //Nut nhan tb 1
{
delay_ms(50);
if (b0 == 0)
{
while (b0 == 0)
{}
d0 = !d0;
}
}
if (b1 == 0) //Nut nhan tb 2
{
delay_ms(50);
if (b1 == 0)
{
while (b1 == 0)
{}
d1 = !d1;
}
}
if (b2 == 0) //Nut nhan tb 3
{
delay_ms(50);
if (b2 == 0);
{
while (b2 == 0)
{}
d2 = !d2;
}
}
if (b3 == 0) //Nut nhan tb 4
{
delay_ms(50);
if (b3 == 0);
{
while (b3 == 0)
{}
d3 = !d3;
}
}
if (b4 == 0) //Nut nhan tb 5
{
delay_ms(50);
if (b4 == 0)
{
while (b4 == 0)
{}
if (d4 == d5 == 1)
{
d4 = 0;
d5 = 1;
}
else if ((d4 == 0) && (d5 == 1))
{
d4 = 1;
d5 = 0;
}
else if ((d4 == 1) && (d5 == 0))
{
d4 = 1;
d5 = 1;
}
}
}
if (b5 == 0) //Nut nhan tat tat ca
{
delay_ms(50);
if (b5 == 0)
{
while (b5 == 0)
{}
portd = (255);
e2 = 1; //LED 3
}
}
}
}

//**********************************
// Dieu Khien Thiet Bi

//**********************************
void dieukhien()
{
switch (i)
{
case 'n':
capnhat();
break;
case 'r':
baodong();
break;
case '1':
d0 = 0; //tb 1 bat
break;
case '2':
d0 = 1; //tb1 tat
break;
case '3':
d1 = 0; //tb 2 bat
break;
case '4':
d1 = 1; // tb2 tat
break;
case '5':
d2 = 0; //tb 3 bat
break;
case '6':
d2 = 1; //tb 3 tat
break;
case '7':
d3 = 0; //tb 4 bat
break;
case '8':
d3 = 1; //tb 4 tat
break;
case '9':
d4 = 0; // tb 5 bat cap 1
d5 = 1;
break;
case 'a':
d5 = 0;
d4 = 1; // tb 5 bat cap 2
break;
case 'b':
d4 = 1; //tb 5 tat
d5 = 1;
break;
}
}

//**********************************
// Cap Nhat Trang Thai

//**********************************
void capnhat()
{
e1 = 0; //Bat Led 2
if (d0 == 1) //Kiem tra tb 1
{ printf("c");}
else
{printf("d");}
delay_ms(5);
if (d1 == 1) //Kiem tra tb 2
{ printf("e");}
else
{printf("f");}
delay_ms(5);
if (d2 == 1) //Kiem tra tb 3
{ printf("g");}
else
{printf("h");}
delay_ms(5);
if (d3 == 1) //Kiem tra tb 4
{ printf("i");}
else
{printf("j");}
delay_ms(5);
if (d4 == d5 == 1) //Kiem tra tb 5
{ printf("k");}
else if ((d4 == 0) && (d5 == 1))
{printf("l");}
else if ((d4 == 1) && (d5 == 0))
{printf("m");}
delay_ms(5);
//**********************************
// Gui Gia Tri Nhiet Do

//**********************************
dem = read_adc();
value=dem/2.048;
printf("%u",value);
delay_ms(100);
//**********************************
// Gui Gia Tri Bao Ket Noi

//**********************************
printf("o");
delay_ms(5);
e1 = 1; //Tat LED 2
}

//**********************************
// Bao Dong

//**********************************
void baodong()
{
e2 = 0; //Bat LED 3
}

//**********************************
// Ngat Rs232

//**********************************
#int_RDA
void receive()
{
e0 = 0; //Bat LED 1
i=getc();
dieukhien();
e0 = 1; //Tat LED 1
}

pitpro09
08-07-2014, 08:25 PM
không ai chỉ e với huuuu

hangocminh1989
10-07-2014, 10:04 PM
code của em nhìn hung nhỉ :D muốn giúp thế nào nữa đây bạn? bạn đã thử phần help trên ccs chưa? mình làm cũng lâu rồi nên bây giờ cũng không nhớ nhiều nữa. bây giờ mình hướng dẫn lại các bước chi tiết cho bạn làm thế này nhé :
1: viết 1 chương trình chỉ gửi dữ liệu từ pic lên PC thôi => đảm bảo cho pic và pc có thể nhận ra nhau và pc nhận được data của pic. => viết vb để hiển thị => done
2: viết 1 chương trình ngắt rs232 (có thể là 1 nút bấm, bấm vào đó là nhảy vào ngắt, trong ngắt chỉ truyền 1 số nào đó lên pc và hiển thị ra vb) => đảm bảo ngắt hoạt động tốt => done
3: viết 1 chương trình đo nhiệt độ hiển thị lên pc bằng ngắt rs232 (có thể sự dụng đồng thời 1 led hiển thị để kiểm tra coi có đọc được nhiệt độ hay không) =>đảm bảo nhiệt độ được hiển thị đúng lên pc => done
4: bây giờ mới là bước viết các chương trình điều khiển các thiết bị khác => done.
trong thời gian làm việc, bạn chịu khó tìm thêm tài liệu về rs232, ngắt rs232, read adc để đo nhiệt độ trong diễn đàn. tất cả những thứ này đã quá cũ nhé bạn, nên bạn hỏi ở đây không ai trả lời đâu, vì câu trả lời có ở khắp nơi rồi. việc của bạn chỉ gói gọn trong 1 từ : "search" thôi.
chúc bạn vui,
thân