star_dream
29-09-2011, 06:31 PM
Đây là code bài điều khiển nhiệt độ bằng PIC 16F877A kết hợp VB giao tiếp bằng máy tính, bạn em viết code vi xử lý được nhưng không giải thích được nên em nhờ các anh giải thích dùm cái đoạn code này :
#include <16f877a.h>
#include <def_877a.h>
#device *=16 ADC=8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
#use RS232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bi ts=8)
char c,data=0;
unsigned int16 connect,control;
//-----------------------------------------------
#INT_RDA // ngat cho biet data nhan tu RS232 da san sang
// begin chuong trinh ngat
void ngatrs232()
{
char c;
c = getc(); // ham tra ve ki tu khi doc tu RS232
if(c=='0')
{
putc(c); //ham gui ki tu den rs23
delay_ms(10);
}
if(c=='2')
{
data=0;
control=2;
}
if(c=='3')
{
data=0;
control=3;
}
}
void main()
{
connect=0;
control = 0;
enable_interrupts(INT_RDA);
ext_int_edge(H_TO_L);
enable_interrupts (GLOBAL);
//Khoi tao che do cho bo ADC
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
delay_ms(500);
//Khoi tao cac port
set_tris_A(0xff);
set_tris_B(0x00);
set_tris_C(0x80);
output_B(0x00);
while(1)
{
if(control==2)
{
output_B(0xff);
data = read_adc();
data = data*1.960784314;
putc(data);
delay_ms(500);
}
if(control==3)
{
output_B(0x00);
data = read_adc();
data = data*1.960784314;
putc(data);
delay_ms(500);
}
}
}
Code bên VB của em có Tmin và Tmax. Trong đoạn code vi xử lý trên, em hỏi bạn em làm sao để hiển thị Tmin và Tmax thì bạn em gán control 2 cho Tmin và control 3 cho Tmax nhưng em hỏi làm sao code vi xử lý nó hiểu là control 2 cho Tmin thì bạn em không giải thích được nên em nhờ các anh giải thích dùm chỗ này. ( Có nghĩa là khi nhiệt độ vượt quá Tmax thì đèntắt và ngược lại ).
Vấn đề thứ 2 mà em không hiểu là đoạn main :
void main()
{
connect=0;
control = 0;
enable_interrupts(INT_RDA);
ext_int_edge(H_TO_L);
enable_interrupts (GLOBAL);
Em không hiểu tại sao lại cho control =0 ngay vòng main sao bên VB nhận bên vi xử lý mà nó điều khiển được và các dòng còn lại. Bạn em không viết dùm em chỗ này thì nó không chạy được, em hỏi bạn em thì bạn em chỉ biết lập trình nhưng không giải thích được cho em nên em mong các anh giải thích chỗ này cho em.
Đó là hai vấn đề em bị vướng mắc mà không giải đáp được.
Em rất mong rất mong các anh có thể giải thích dùm em. Em cảm ơn các anh nhiều lắm.
#include <16f877a.h>
#include <def_877a.h>
#device *=16 ADC=8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
#use RS232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bi ts=8)
char c,data=0;
unsigned int16 connect,control;
//-----------------------------------------------
#INT_RDA // ngat cho biet data nhan tu RS232 da san sang
// begin chuong trinh ngat
void ngatrs232()
{
char c;
c = getc(); // ham tra ve ki tu khi doc tu RS232
if(c=='0')
{
putc(c); //ham gui ki tu den rs23
delay_ms(10);
}
if(c=='2')
{
data=0;
control=2;
}
if(c=='3')
{
data=0;
control=3;
}
}
void main()
{
connect=0;
control = 0;
enable_interrupts(INT_RDA);
ext_int_edge(H_TO_L);
enable_interrupts (GLOBAL);
//Khoi tao che do cho bo ADC
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
delay_ms(500);
//Khoi tao cac port
set_tris_A(0xff);
set_tris_B(0x00);
set_tris_C(0x80);
output_B(0x00);
while(1)
{
if(control==2)
{
output_B(0xff);
data = read_adc();
data = data*1.960784314;
putc(data);
delay_ms(500);
}
if(control==3)
{
output_B(0x00);
data = read_adc();
data = data*1.960784314;
putc(data);
delay_ms(500);
}
}
}
Code bên VB của em có Tmin và Tmax. Trong đoạn code vi xử lý trên, em hỏi bạn em làm sao để hiển thị Tmin và Tmax thì bạn em gán control 2 cho Tmin và control 3 cho Tmax nhưng em hỏi làm sao code vi xử lý nó hiểu là control 2 cho Tmin thì bạn em không giải thích được nên em nhờ các anh giải thích dùm chỗ này. ( Có nghĩa là khi nhiệt độ vượt quá Tmax thì đèntắt và ngược lại ).
Vấn đề thứ 2 mà em không hiểu là đoạn main :
void main()
{
connect=0;
control = 0;
enable_interrupts(INT_RDA);
ext_int_edge(H_TO_L);
enable_interrupts (GLOBAL);
Em không hiểu tại sao lại cho control =0 ngay vòng main sao bên VB nhận bên vi xử lý mà nó điều khiển được và các dòng còn lại. Bạn em không viết dùm em chỗ này thì nó không chạy được, em hỏi bạn em thì bạn em chỉ biết lập trình nhưng không giải thích được cho em nên em mong các anh giải thích chỗ này cho em.
Đó là hai vấn đề em bị vướng mắc mà không giải đáp được.
Em rất mong rất mong các anh có thể giải thích dùm em. Em cảm ơn các anh nhiều lắm.