|
Tài trợ cho PIC Vietnam |
Giao tiếp cổng COM và LPT RS232, RS485 và LPT là những giao tiếp cơ bản và kinh điển khi mới học về vi điều khiển... |
|
Ðiều Chỉnh | Xếp Bài |
16-09-2011, 09:26 PM | #1 |
Nhập môn đệ tử
|
PC kết nối RS232 với 16F877A, truyền giá trị cho 595 rất mong các bạn thảo luận và gi
- Mình có một bảng điều khiển như sau viết bằng VB.
Tất cả có 8 con LED 3 màu <=> 24 trạng thái. Ở mỗi vị trí 1 LED có 3 check. Nếu check màu xanh nhấn thì có màu xanh, vàng nhấn có màu vàng, đỏ nhấn thì LED có màu đỏ. Sau khi đã thiết lập xong thì nhấn nút CONECT giá trị cần truyền được lấy từ trạng thái các check được đưa xuống 16F877A. - Sơ đồ mô phỏng được vẽ trên ISIS 24 trạng thái được thể hiện bằng 24 con LED, cứ 3 LED liền nhau thể hiện cho một LED 3 màu. Vì số lượng LED sau này điều khiển có thể lớn hơn nên mình sử dụng 74HC595 để đưa giá trị nhận được từ Rs232 nối tiếp xuất ra các LED. - Đây là lệnh trên VB6 Code:
Private Sub Cmd_CONECT_Click() If MSComm2.PortOpen = False Then MSComm2.PortOpen = True End If MSComm2.Output = Chr(FF) End Sub Private Sub Form_Load() With MSComm2 .CommPort = 2 'cong COM 2 .Settings = "9600,N,8,1" 'Baudrate=9600,Ko KT chan le,frame 8 bit,1 bit stop .InBufferSize = 1024 'Bo dem 1024 byte thi day .InputLen = 0 'Doc toan bo gia tri bo dem .RThreshold = 1 'Cho phep ngat khi su kien Receiver o MSCOMM .SThreshold = 0 'Ko cho phep ngat khi su kien Send o MMSCOMM .OutBufferSize = 512 .InputMode = comInputModeText .PortOpen = True 'Mo cong COM End With End Sub Code:
#include <16f877a.h> #include <def_877a.h> #device 16f877a*16ADC=10 #fuses nowdt,nolvp,noprotect,xt,put #use delay(clock=4000000) #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8) #define Clk ra0 #define Data ra1 #define Rck ra2 #define sclk ra3 //================Cac bien ============================================// int i; char a[3]; //================= Cac ham con===========================================// void dich_595(char num); void ngat_rda(); //------------------------------------------------------------------------- void main(void) { enable_interrupts(global); enable_interrupts(int_RDA); set_tris_d(0x00); //portd is output set_tris_a(0x00); portd=0x00; porta=0x00; while(true) { } } void dich_595(char num) { int j; int8 value; value = (int8)num; for(j = 0;j<8;j++) { if(value&0x80)//truyen bit co trong so cao truoc Data = 1; else Data = 0; Clk = 1; //xung nhip Clk =0; value =value<<1; //dich tra 1 bit } } #int_RDA void ngat_rda() { a[0]=getc(); a[1]=0xAA; a[2]= 0xFF; sclk=0; sclk=1; for(i=0;i<3;i++) { dich_595(a[i]); } Rck = 1; //chot du lieu Rck = 0; } Rất mong các bạn có kinh nghiệm và đã làm nhiều về RS232 cho mình ý kiến về cách tổ chức biến của VB6 và CCS sao cho hợp lý. Xin cảm ơn các bạn.
__________________
Thà thức suốt đêm để tìm ra vấn đề con hơn cả đời sống trong nghi vấn --------------------------------- Các bạn đặt mạch in xin vui lòng gửi trực tiếp file và yêu cầu vào địa chỉ mail của mình, không gửi trên diễn đàn --------------------------------- Mail: buibachtuananh@gmail.com cdt39.mta@gmail.com anhquan.cdt@gmail.com ĐT: 0989 94 66 95 0988 11 24 00 |
Ðiều Chỉnh | |
Xếp Bài | |
|
|