Để giải quyết bài toán này, nên tách làm các bài toán nhỏ sau :
-Giao tiếp giữa PIC với PC bằng RS232 qua cổng COM. Hiện nay, đa số các máy tính đều không có cổng COM, vậy phải dùng một thiết bị chuyển đổi USB ra COM. Lưu ý là o dùng cổng chuyển đổi USB ra COM mua ở Phong Vũ nhé, cái đó nó không chuyển mức Logic điện áp để có sự tương thích giữa CMOS và TTL. Tham khảo làm cái cổng COM đó hoặc mua ở Thiên Minh.
-Thứ 2 là dùng đối tượng COM trong Visual Basic viết giao tiếp với PIC qua RS232. Dùng CCS cho dễ. Quá trình này gồm truyền và nhận
-Thứ nữa, viết giao tiếp giữa PIC và LCD để hiển thị
Và cuối cùng tổng hợp lại sẽ giải quyết được bài toán của bạn
Thử nghiệm: Sợi đen mua ở Phong Vu. Soi trắng tự làm. Cà sơi đều dùng chuyển USB sang COM
Ở logic 1, sợi Phong vu gần 7 Volt, trong khi sợi trắng 5 Volt
Viết chương trình nhấn nút ấn, vi điều khiển sẽ
cho sáng đèn tương ứng, đồng thời gửi lên hiển thị ở mành hình máy tính:
Đoạn Code chương trình :
#include <16f877A.h>
#FUSES HS
#use delay (clock=8000000)
#use rs232(baud = 9600, parity = n , xmit = pin_c6 , rcv = pin_c7 , bits = 9 )
int8 z ;
BOOLEAN NGAT ;
CHAR CHU ;
int1 b0, b1, b2, b3, b4, b5, b6, b7 ;
void daobit0() ;
void daobit1() ;
void daobit2() ;
void daobit3() ;
void daobit4() ;
void daobit5() ;
void daobit6() ;
void daobit7() ;
#INT_RDA
VOID HAMTRUYENTHONG()
{
CHU = GETCH() - 48 ;
SWITCH(CHU)
{
CASE 0: DAOBIT0() ; BREAK ;
CASE 1: DAOBIT1() ; BREAK ;
CASE 2: DAOBIT2() ; BREAK ;
CASE 3: DAOBIT3() ; BREAK ;
CASE 4: DAOBIT4() ; BREAK ;
CASE 5: DAOBIT5() ; BREAK ;
CASE 6: DAOBIT6() ; BREAK ;
CASE 7: DAOBIT7() ; BREAK ;
}
NGAT = FALSE ;
}
void main()
{
b0 = b1 = b2 = b3 = b4 = b5 = b6 = b7 = 0 ;
OUTPUT_D(0) ;
set_tris_b(0xff) ;
set_tris_d(0x00) ;
ENABLE_INTERRUPTS(INT_RDA) ;
ENABLE_INTERRUPTS(GLOBAL) ;
while(true)
{
NGAT = TRUE ;
putc(b0 + 48) ;
putc(b1 + 48) ;
putc(b2 + 48) ;
delay_ms(3) ;
putc(b3 + 48) ;
putc(b4 + 48) ;
putc(b5 + 48) ;
delay_ms(3);
putc(b6 + 48) ;
putc(b7 + 48) ;
z = 0 ;
while(bit_test(input_b(),z) && NGAT) // quet phim
{
z++ ;
if(z == 8) z = 0 ;
delay_ms(5) ;
}
while(!bit_test(input_b(),z)) // cho nha phim
{
}
IF(NGAT)
{
switch(z)
{
case 0: daobit0() ; break ;
case 1: daobit1() ; break ;
case 2: daobit2() ; break ;
case 3: daobit3() ; break ;
case 4: daobit4() ; break ;
case 5: daobit5() ; break ;
case 6: daobit6() ; break ;
case 7: daobit7() ; break ;
}
}
output_bit(pin_d0,b0) ;
output_bit(pin_d1,b1) ;
output_bit(pin_d2,b2) ;
output_bit(pin_d3,b3) ;
output_bit(pin_d4,b4) ;
output_bit(pin_d5,b5) ;
output_bit(pin_d6,b6) ;
output_bit(pin_d7,b7) ;
}
}
void daobit0()
{
if(b0)
{
b0 = 0 ;
}
else
{
b0 = 1 ;
}
}
void daobit1()
{
if(b1)
{
b1 = 0 ;
}
else
{
b1 = 1 ;
}
}
void daobit2()
{
if(b2)
{
b2 = 0 ;
}
else
{
b2 = 1 ;
}
}
void daobit3()
{
if(b3)
{
b3 = 0 ;
}
else
{
b3 = 1 ;
}
}
void daobit4()
{
if(b4)
{
b4 = 0 ;
}
else
{
b4 = 1 ;
}
}
void daobit5()
{
if(b5)
{
b5 = 0 ;
}
else
{
b5 = 1 ;
}
}
void daobit6()
{
if(b6)
{
b6 = 0 ;
}
else
{
b6 = 1 ;
}
}
void daobit7()
{
if(b7)
{
b7 = 0 ;
}
else
{
b7 = 1 ;
}
}
Ở Visual Basic:
Dim VT As Integer
Private Sub Form_Load()
With rs232
.CommPort = 3
.Settings = " 9600 , n , 8 , 1"
.InBufferSize = 1024
.OutBufferSize = 512
.InputLen = 0 'Gia tri nay = 0 la doc ca chuoi tu buffer, bang 1 se doc tung ky tu
.InputMode = comInputModeText
.PortOpen = True
End With
VT = 0
End Sub
Private Sub rs232_OnComm()
Timer1.Enabled = True
End Sub
Private Sub Timer1_Timer()
Label5.Caption = rs232.Input
Timer1.Enabled = False
Timer2.Enabled = True
End Sub
Private Sub Timer2_Timer()
If Mid(Label5.Caption, VT + 1, 1) = 1 Then
Shape1(VT).BackColor = &HFF&
Else
Shape1(VT).BackColor = &H0&
End If
VT = VT + 1
If VT = 8 Then
VT = 0
Timer2.Enabled = False
End If
End Sub
Tùy theo máy tính mà vào phần Hadware/Comport để xác định chính xác cổng Com cần mở Port