PDA

View Full Version : RS232 và PIC16f877a


pantovi
11-05-2011, 12:18 PM
Code của mình như thế này mà nó không chạy, có ai biết sai chỗ nào không ?
Mục đích là khi nhận kí tự 1 từ máy tính thì sẽ set RA0=0, nhận kí tự 2 sẽ set RA1=0

#include <16F877a.h>
#include <def_877a.h>
#use delay(clock=20MHz,crystal)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#define role1 RA0
#define role2 RA1

unsigned char data;
#int_rda
void ngat()
{
data = getc();
}


void main()
{
TRISA = 0x00;
PORTA = 0xFF;
enable_interrupts(GLOBAL);
enable_interrupts(INT_RDA);
while(1){
if (data==0x31) role1=0;
if (data==0x32) role2=0;
}
}

stupid11
11-05-2011, 10:01 PM
-Bạn khai báo Port A ngõ vào ra số như vậy là không được rồi...Muốn port A là ngõ-vào ra số thì phải tác động vào thanh ghi ADCON1 ->tất cả các pin là digital
-Vì port A-E được cấu hình mặc định sau khi Reset là ngõ vào Analog.Trong datasheet có ghi rất rõ phần này..

tienchuan
12-05-2011, 12:27 AM
mình thấy khai báo trisa thế cũng ổn rồi mà,mình cũng điều khiển port a để kích opto thấy ok cả mà,nhưng ko làm giao tiếp như pantovi.

stupid11
12-05-2011, 10:23 AM
while(1){
if (data=='A') role1==1;
if (data=='B') role2==1;
}

Bạn viết như thế này là không ổn rồi !
Bạn phải hiểu role1==1 khác với role1=1.

+role1==1 tức là so sánh.
+role1=1 gán giá trị.
Mà mình cũng ko hiểu vì sao bạn lại cho PORTA=0XFF..làm như vậy thì vừa vào chương trình Role đã đóng hết rồi..cần gì đk nữa.. :D

tanbka
12-05-2011, 05:29 PM
Chắc bạn không để ý, chứ nếu bạn ghi lệnh
if (data=='A') role1==1;
if (data=='B') role2==1;
thì chương trình dịch sẽ báo lỗi chứ.
Với lại giá trị khởi tạo ban đầu thì PORTA = 0x00, bạn để 0xFF thì nó bằng 1 hết rồi, nhận hay không nhận dữ liệu nó cũng ko thay đổi gì nữa.

pantovi
12-05-2011, 06:52 PM
mình đã sửa lại yêu cầu và code rồi, nhưng vẫn chưa chạy, có câu hỏi này: "khi nào thì PIC biết nhận dữ liệu mà ngắt rda hoạt động ?"

stupid11
12-05-2011, 07:44 PM
Ngắt RDA xảy ra khi nhận được 1 ký tự trong bộ đệm nhận..dùng ngắt để tránh việc khỏi phải chờ dữ liệu nhận về..đơn giản vậy thôi..Bạn viết ngắt như trên là ổn rồi...

tienchuan
12-05-2011, 08:05 PM
đúng là code bạn ko thấy sai chỗ nào cả,hôm nay mới đọc kĩ :D
mình nghĩ bạn thử thay thạch anh 11.0592Mhz thử,hình như con thạch anh này tạo ra tốc độ baud (9600)chuẩn hơn thạch anh 20Mhz của bạn,mình chưa làm phần này nên cũng suy luận vậy thôi,pantovi thử xem,chúc thành công.mà nếu có làm được thì báo cho ae biết nhỉ :D
Thân,bạn có thể pm hỏi mấy anh admin thử, có thể mấy anh sx giúp bạn giải quyết được. :D

stupid11
12-05-2011, 10:46 PM
Bạn thử lấy chương trình này để test thử xem sao..mình thấy giao tiếp RS232 giữa PIC và PC cũng không khó lắm quan trọng là 2 phía phải hiểu định dạng dữ liệu của nhau...

khienpzo
13-05-2011, 11:42 PM
hay quá lại gặp Dũng ở đây !! cũng đang làm VB giao diện điều khiển thiết bị đây . Nhưng qua mạng truyền thông RS485 và chỉ sử dụng 2 dây giao tiếp với 3 thiết bị thôi ... Đã tìm hiểu vấn đề này chưa góp ý cho tớ với ...Ah quên đồ án ông sao rồi ??

stupid11
13-05-2011, 11:46 PM
Tôi cũng làm truyền thông qua RS485(1 master 3 slave)..Chương trình VB với Code trên VĐK cũng khá ngon lành rồi..giờ đang làm phần cứng..hôm nào xong qua xem chơi...Hjjj.

phatcddt08a
16-05-2011, 10:12 AM
tại sao không thấy max232 vậy bạn.vậy có sự khác biệt nào giữa hai cái này không tức là có max232 va không có max232 thì truyền nhận có khác nhau không.mình đang tìm hiểu vb mà chưa có kết quả gì hết .ai có tài liệu về lập trình vb trong truyền nhận cho mình với.thank nhiều

khienpzo
16-05-2011, 11:18 AM
uh hôm nào tớ rỗi tớ qua ...tớ cũng làm vấn đề đó nên cũng muốn xem thử .Ròi có gì thì chỉ giáo với .hihi

phatcddt08a
16-05-2011, 01:52 PM
xong không có ai chỉ mấy cái tuyệt chiêu nhỉ.mình giờ đang rối tung lên rồi.cú với mọi người

stupid11
16-05-2011, 06:53 PM
-Gửi bạn phatcddt08a:
-Trong mo phỏng thì không cần max232 tuy nhiên khi làm mạch thật thì bắt buộc phải có vì mức logic của chuẩn RS232 là +/-12v (hình như là thế :))) nên bạn phải có max232 để chuyển mức logic cho phù hợp với PIC.
-Bạn gặp khó khăn ở phần nào thì cứ nói ra..rồi mọi người cùng giúp bạn,bạn nói chung chung như vậy biết giúp bạn thế nào đây...
-Nếu lập trình VB để giao tiếp với VĐK thực sự chỉ có khoảng 20 lệnh thôi..rất đơn giản..chương trình mình gửi ở trên rất cơ bản..đọc là hiểu ngay mà..

phatcddt08a
17-05-2011, 02:15 PM
mình củng gặp khó khăn một số vấn đề thứ nhất mình chưa học vb nên chưa thông về cái lệnh cho lắm.cái này chắc phải học vb lại rồi .cai file của bạn mình down về dùng vb mở file vbp rồi chạy run no bao lổi dòng gì mà có from_load bao loi bắt đầu từ dòng .CommPort = 2 và hiện lên cửa sổ complier error: method ỏ data menber not found mình không biết sao nửa.hay tại vì mở mô phỏng bẳng cách này không được phải không.còn mở file dung.exe mô phỏng thì được.bạn có thể cho mình một số tài liệu về lệnh truyền nhận trong vb dc khong bạn,thanks bạn nhiều

stupid11
17-05-2011, 06:17 PM
-file mình gửi muốn Run được thì bạn vào Project-Component-Chọn Microsoft Comm Control 6.0 -Apply-Ok là Run đc ngay..Mà nhớ trước khi Run phải mở cổng com 2 ảo lên.
-Bạn kiếm trên diễn đàn có TUT về Giao tiếp Visual Basic với VDK của anh Ngô Hải Bắc viết rất chi tiết..

stupid11
17-05-2011, 08:16 PM
Đây là 1 số tài liệu giao tiếp PC với VDK..có cả TUT của anh Ngô Hải Bắc..Chúc vui.

phatcddt08a
18-05-2011, 09:18 PM
cảm ơn bạn nhé.chúc bạn vui

phatcddt08a
19-05-2011, 10:42 PM
minh da mo duoc roi minh quen thiet lap thong so com trong hardware cua win

phatcddt08a
26-05-2011, 12:26 AM
em có một số thấp mắt như sau ve doan coed nay :
#include <16f877a.h>
#device 16f877a*16ADC=10
#fuses nowdt,nolvp,noprotect,xt,put
#include <DEFS_16F877A.h>
#include <string.h>
#include <stdlib.h>
#use delay(clock=4000000)
#use fast_io(b)
#use fast_io(c)
#use fast_io(a)
#bit RS = portA.0
#bit RW = portA.1
#bit E = portA.2
#define lcd PORTD
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7)
char data;
int t;
char luukytu[16];
int8 dem;
void goilenh();
void goi_dulieu();
#int_RDA
void ngat_RDA()
{

if (0 != kbhit())
{
data = fgetc();
if (data==':')
dem=0;
else
dem++;
luukytu[dem]=data;
putc(data);
}
}
void main()
{
enable_interrupts(int_RDA);
enable_interrupts(global);
set_tris_c(0x80);
set_tris_a(0);
set_tris_d(0);
portc=0;
portd=0;
porta=0;
delay_ms(100);// CHOI THOI GIAN KHOI DONG LCD
for(t=0;t<16;t++)
{
lcd=0x38;
goilenh();
lcd=0x0e;
goilenh();
lcd=0x06;
goilenh();
lcd=0x80;
goilenh();
lcd=luukytu[t];
goi_dulieu();
delay_ms(1);
}
}
/*Ham yeu cau goi lenh dieu khien LCD*/
void goilenh()
{
RS = 0;
RW = 0;
E = 1;
E = 0;
delay_ms(1);
}
/*Ham yeu cau goi du lieu hien thi len LCD*/
void goi_dulieu()
{
RS = 1;
RW = 0;
E = 1;
E = 0;
delay_ms(1);
}
doan code vb:
Option Explicit
Dim i As Integer

Private Sub cmdchu_Click()
Text1.Text = ""
Text2.Text = ""
End Sub

Private Sub cmdsend_Click()
MSComm1.Output = Text2.Text
End Sub

Private Sub cmdthoat_Click()
MsgBox "Thoat Khoi Chuong Trinh"
End
End Sub

Private Sub Form_Load()

MSComm1.CommPort = 2 'cong COM 2
MSComm1.Settings = "9600,N,8,1" 'Baudrate=9600,Ko KT chan le,frame 8 bit,1 bit stop
MSComm1.InBufferSize = 1024 'Bo dem 1024 byte thi day
MSComm1.InputLen = 0 'Doc toan bo gia tri bo dem
MSComm1.RThreshold = 1 'Cho phep ngat khi su kien Receiver o MSCOMM
MSComm1.SThreshold = 0 'Ko cho phep ngat khi su kien Send o MMSCOMM
MSComm1.OutBufferSize = 512
MSComm1.InputMode = comInputModeText
MSComm1.PortOpen = True 'Mo cong COM

End Sub

Private Sub MSComm1_OnComm()
Dim StringIn As String
If MSComm1.CommEvent = comEvReceive Then
StringIn = MSComm1.Input
Text1.Text = StringIn
End If
End Sub


+ thứ nhất: dùng giao diện vb để truyền một chuổi ký tự từ pc xuống pic để hiện thị lên lcd .em còn yếu về lập trình lắm nên không sửa được lổi nên em mong các bác có thể giúp em với.em chĩ thuc hiện dc viec truyen một ký tự xuống và hiện thị lên lcd .còn một chuổi thì không được như tên mình chẳn hạn.chương trình này nhận dữ liệu phản hồi từ pic thì đúng nhưng nó không hiện thị trên lcd gì hết .chắc do chương trình hiện thị sai thì phải mà em không biết sửa như thế nào nào
+ thứ hai : là làm sao mình có thể lưu chuỗi ký tự nhận dc tu pc và lưu nó vào mảng động rồi sao đó lấy chuỗi ký tự trong mảng hiện thị lên một cái gì đó.
+ thứ ba : em muốn hiện thị nhiệt độ lên máy tính thì truyền như thế nào .ví dụ 30 độ
thì ta có cần tách số 30 này thành số 3 và số 0 để truyền lên không hay là truyền số 30 lên luôn trên vb khai bao nhận có phải là khai báo biến là integer hoặc byte gj không .em cần một số ý kiến để đã thông nguyệt đạo .mong các bac giúp em thanhk nhiều

nguyen_de89
26-05-2011, 09:59 AM
Mình góp ý cho bạn 1 chút nhé
Thứ 1:Bạn muốn truyền 1 chuỗi ký tự xuống thì bạn phải coi lại dòng lệnh này "MSComm1.InputMode = comInputModeText " (Change "Text"="Binary"), và bạn nên coi lại dòng này nữa MSComm1.RThreshold = 1,nếu bạn muốn nhận 2 ký tự bạn để cái này bằng 1 thì........
Thứ 2: bạn chỉ cần dùng hàm
If Len(Y)=2 then
Text1.Text=Y ("Y =mscomm1.input bạn nhé,đừng thêm dòng này vào")
Thứ 3:mình nghĩ bạn chỉ cần tách ký tự khi VD bạn có 2 số là tốc độ,2 số là nhiệt độ thì bạn mới cần tách thôi.Nếu bạn muốn truyền số 30 lên thì MSComm1.RThrehold=2 bạn nhé
Note:mình góp ý chút bạn nên làm lần lượt,trước tiên bạn nên làm cái nhiệt độ truyền lên xuống dc rồi mới giải quyết cái LCD chứ bạn làm vậy k ai đã thông dc nguyệt đạo cho bạn đâu .Chúc Vui

phatcddt08a
26-05-2011, 03:24 PM
#include <16f877a.h>
#include <stdlib.h>
#fuses nowdt,nolvp,noprotect,xt,put
#include <DEFS_16F877A.h>
#include <ctype.h>
#use delay(clock=4000000)
#use fast_io(b)
int data,x;
char chu='a';
void main()
{
set_tris_d(0);
portd=atoi(chu);
}
minh có đoạn code nhỏ muốn chuyển ký tự ascii sang số nhưng chương trình không hiểu
mình dùng lệnh atoi chuyển ký tự ascii sang so nguyên 8 bit
vi dụ : chữ A trong ascii là có mã thập phân là 65 và hex là 0x41
ý mình muốn đổi A thành 65 thôi . còn nếu cho portd = 'A' thì nó ra kết quả là 65;
chỉ có điều mình sử dụng biến trung gian để chuyển đổi thì không được
nhung có điều chương trình nó không hiệu tại sao vậy .bác nào giúp giải thích thắc mắt này với

stupid11
26-05-2011, 11:56 PM
Bạn nhấn phím F1 xem cách sử dụng lệnh Atoi() nhé !!!


#int_RDA
void ngat_RDA()
{
if (0 != kbhit())
{
data = fgetc();
if (data==':')
dem=0;
else
dem++;
luukytu[dem]=data;
putc(data);
}
}


Bạn chỉ putc(data) khi đã nhận được ký tự kết thúc thôi nhé.. trên máy tính bạn gửi 1 chuỗi liên tục xuống mà PIC cũng đồng thời gửi ngược lại...=>xung đột đấy nhé..

Mình góp ý bạn viết như thế này :

#INT_RDA
void ngat_RDA()
{
char data;
if(kbhit())
{
data=getc();
if(data=='#') // Neu da nhan duoc byte ket thuc thi tien hanh set co Flag //
{
mangdata[index]=data;
index=0;
flag=1; // co bao nhan duoc byte ket thuc //
putc(data); //bao da nhan duoc chuoi thanh cong //
}
else // Neu chua nhan duoc byte ket thuc thi dua gia tri data vao mangdata[index] //
{
mangdata[index]=data;
index++;
}
}
}



Trong main() bạn viết

....
while(flag==1)
{
flag=0;
...cho hiển thị chuỗi nhận được ở đây...
mangdata=0;
}
....

phatcddt08a
27-05-2011, 02:28 PM
cam on bạn nhé de minh thu viet theo cach nay thu xem
ah cho mình hỏi thêm một tý nếu mà data =='#' tuc là trong chuỗi ký tự truyền xuống nhận được ký tự # này thì báo là pic đã nhận được ký tự cuối cùng set cờ flag ==1 . ý bạn nói ở đây là chờ cho nhận đủ ký tự rồi mới đem hiển thị gì đó đúng không .còn nếu chưa nhận đủ ký tự thì trong chương trình main không làm gì cả vì flag=0; tức là không thực hiện lệnh trong while(flag==1) { lenh } được .thế thì theo mình nghỉ thì truyền chuỗi ký tự từ máy tính xuống pic phải kết thúc bằng dấu # rồi .ví dụ chuỗi ký tự truyền xuống có dạng như vậy chẳng hạn : caothang# .giả sử nếu ký tự truyền xuống thì không có dấu # ở cuối câu thì đâu có xác định được khi nào nhận được ký tự cuối cùng. ah còn thằng putc(data) ; nó có truyền được chuổi ký tự đâu nó chỉ truyền một ký tự thôi mà vậy nếu như vậy thì nếu nhận đủ ký tự cuối cùng thì chỉ truyền được ký tự cuối cùng là dấu # lên pc thôi mình nói có đúng không bạn cho mình ý kiến nhé.ah ban ở đâu thế mình thì đang theo học kỷ thuật cao thắng ở thành phố. bạn ở thành phố này không.nếu bạn ở thành phố thì có thể anh em mình ra ngoài quán bàn nhé .xin hỏi như vậy có phiền bạn quá không nhỉ

stupid11
27-05-2011, 07:51 PM
cam on bạn nhé de minh thu viet theo cach nay thu xem
ah cho mình hỏi thêm một tý nếu mà data =='#' tuc là trong chuỗi ký tự truyền xuống nhận được ký tự # này thì báo là pic đã nhận được ký tự cuối cùng set cờ flag ==1 . ý bạn nói ở đây là chờ cho nhận đủ ký tự rồi mới đem hiển thị gì đó đúng không .còn nếu chưa nhận đủ ký tự thì trong chương trình main không làm gì cả vì flag=0; tức là không thực hiện lệnh trong while(flag==1) { lenh } được .thế thì theo mình nghỉ thì truyền chuỗi ký tự từ máy tính xuống pic phải kết thúc bằng dấu # rồi .ví dụ chuỗi ký tự truyền xuống có dạng như vậy chẳng hạn : caothang# .giả sử nếu ký tự truyền xuống thì không có dấu # ở cuối câu thì đâu có xác định được khi nào nhận được ký tự cuối cùng. ah còn thằng putc(data) ; nó có truyền được chuổi ký tự đâu nó chỉ truyền một ký tự thôi mà vậy nếu như vậy thì nếu nhận đủ ký tự cuối cùng thì chỉ truyền được ký tự cuối cùng là dấu # lên pc thôi mình nói có đúng không bạn cho mình ý kiến nhé.ah ban ở đâu thế mình thì đang theo học kỷ thuật cao thắng ở thành phố. bạn ở thành phố này không.nếu bạn ở thành phố thì có thể anh em mình ra ngoài quán bàn nhé .xin hỏi như vậy có phiền bạn quá không nhỉ

Bạn hiểu ý mình rồi đấy..tức là phải nhận đầy đủ 1 chuỗi thì mới đem hiển thị...
trong VB mình cũng lập trình đơn giản thôi.

vd: cho nút command "send data"


mscomm1.output=text1.text
mscomm1.output="#"


Còn truyền ngược ký tự "#" lên máy tính để báo VĐK đã nhận đầy đủ chuỗi..nếu ko thì thực hiện truyền lại..
Cậu học Cao Thắng à..vậy cũng là người quen rồi..mình học lớp B..hôm nào gặp nhé..mail:dungdt08b@gmail.com

phatcddt08a
28-05-2011, 12:19 AM
ok nhe .ban ten gi the so dt cua minh la 01656145431 .
minh ten phát lớp cddt08a minh quen may nguoi o lop B tên đình thiên
thật ra hiện giờ mình đang nguyên cưu vb.net đễ truyền nhận nè.
bên vb.net này truyền bằng serialport mỉnh thấy củng hay nên mình củng đang nguyên cứu nó

meomeo_3012
30-05-2011, 10:38 PM
stupid11
ong cho tui hoi
#include <stdlib.h>
#include <DEFS_16F877A.h>
co nghia la gi vay?
thank!

stupid11
30-05-2011, 11:17 PM
stupid11
ong cho tui hoi
#include <stdlib.h>
#include <DEFS_16F877A.h>
co nghia la gi vay?
thank!


#include <DEFS_16F877A.h>

Đây là add thư viện khai báo PIN,PORT của PIC 16F877A vào đó bạn
Nếu sử dụng thư viện này thì bạn khỏi cần viết khai báo như sau:

#use fast_io(a)...
#byte porta=0x5...
#bit a0=0x5.0

Khi add thư viện này vào rồi thì viết chương trình sẽ ngắn hơn..đỡ được khâu khai báo.

#include <stdlib.h>

đây là thư viện dùng cho các hàm như itoa();atoi();itof()...nếu trong chương trình có sử dụng các hàm này thì bạn phải add thư viện này vào...
Muốn xem hàm mình sử dụng yêu cầu add thư viện nào thì bạn nhấn phím F1 -> chọn hàm cần xem -> ở phần Requires (yêu cầu)

Chúc bạn vui...

phatcddt08a
31-05-2011, 12:16 AM
MÀ CÁI ĐỒ ÁN CỦA BẠN LÀM VỀ CÁI GÌ THẾ . AH stupid11 CHO MÌNH HỎI TÝ BẠN ĐÃ TỪNG QUÉT LED ĐƠN MÀ LÀM SAO THAY ĐỔI CƯỜNG ĐỘ SÁNG CỦA LED KHÔNG .THUẬT TOÁN QUÉT NHƯ THẾ NÀO VẬY LÀM THẾ NÀO ĐỂ THAY ĐỔI DÒNG KHI QUÉT VẬY.

stupid11
31-05-2011, 01:42 AM
Thay đổi cường độ sáng không hề đơn giản chút nào (theo mình nghĩ) cái này dùng PWM để điều chỉnh độ sáng..với việc điều chỉnh được độ sáng thì người ta làm ra bảng led ma trận đa sắc...vì tất cả các màu đều được phối từ 3 màu cơ bản (R-G-B) mà...bạn lên google với từ khoá bảng led ma trận đa sắc ,có nhiều cho bạn tham khảo lắm...

phatcddt08a
31-05-2011, 08:56 AM
mình củng đã từng làm bằng xung nhưng chưa thấy kết quả gì hết .mình thấy có một số phần mềm có thể quet led thay đổi cường độ sáng luôn như ledimm pro nhưng dành cho 89. nạp trực tiếp vào mạch không cần mạch nạp .

hein_ts
17-07-2011, 03:07 AM
Pantovi: Máy hiểu đúng nhưng chương trình của bạn thì có vấn đề.
Ví dụ nhé, khi máy vừa thực hiện xong cái lệnh so sánh thứ nhất mà ngắt RDA xuất hiện, lúc đó data bị thay đổi thì hai câu so sánh đó chẳng có ý nghĩa lắm. -> chương trình xử lý nên nằm luôn trong hàm ngắt thì hơn.
Trong vòng while bạn nên sử dụng cấu trúc switch --case, và thực tế là nên làm vừa tắt vừa mowe, ví dụ như A là tắt, a là mở. Nễu như bạn viết thì role =0 được lần đầu, lần sau có so sánh đi nữa thì giá trị nó vẫn bằng 0 mà.

hoanglangtu
21-08-2011, 10:09 PM
Chào các bạn, minh đang làm giao tiếp PC và PIC sử dụng com ảo, nhưng giá trị gửi từ máy tính 4 số 0, 1, 2, 3, 4 chỉ nhận đúng 0 và 1, còn 3 thì nhận được 1, 4 thì nhận được 0, nói chung số chẫn nhân 0, số lẻ nhận được 1. Nhờ các bạn giải thích và sửa dúp dùm mình.
Chương trình VB
Dim i As Byte
Private Sub CmdSend_Click()
i = 0
MSComm1.Output = Chr(i)
End Sub

Private Sub Command1_Click()
i = 1
MSComm1.Output = Chr(i)
End Sub

Private Sub Command2_Click()
End
End Sub

Private Sub Command3_Click()
i = 2
MSComm1.Output = Chr(i)
End Sub

Private Sub Command4_Click()
i = 3
MSComm1.Output = Chr(i)
End Sub

Private Sub Form_Load()
MSComm1.CommPort = 5
MSComm1.PortOpen = True
'i = 0
Text1.Text = "DKM"
Text1.Enabled = False
End Sub

Chương trình CSS
#include <16F877A.h>
#FUSES NOWDT, HS, PUT, NOPROTECT, NODEBUG, BROWNOUT, NOLVP, NOCPD, NOWRT
#use delay (clock=20000000)
#use rs232(baud=9600,parity=n,xmit=pin_C6,rcv=pin_C7)
#include <DEFS_16F877A.h>
char value;
#int_RDA
void RDA_isr(void)
{
value = getc();
switch(value)
{
case 0:
{
PORTB = 0x0f;
break;
}
case 1:
{
PORTB = 0x07;
break;
}
case 2:
{
PORTB = 0x08;
}
case 3:
{
PORTB = 0x09;
break;
}
}
}

void main()
{
enable_interrupts(GLOBAL);
enable_interrupts(INT_RDA);
set_tris_B(0);
PORTB = 0;
while(true)
{
;
}
}

student_dtvt
12-10-2011, 09:35 PM
Mấy bác cho em hỏi cái này. Em truyền nhận dữ liệu giữa 16f877 và VB6 đã nhận đc nhưng chỉ với thạch anh 4000000Hz, khi thay đổi cái này thì lại không nhận được. Em làm với kit thạch anh 24Mhz ko thể nhận dữ liệu được. Mong các bác chỉ giáo giùm em với.

VB:

Private Sub Command1_Click()
On Error GoTo OpenFalse
If MSComm1.PortOpen = False Then
MSComm1.PortOpen = True
End If
Exit Sub
OpenFalse:
MsgBox Err.Description & vbLf + vbCr + "Loi, khong the mo cong. Hay dong cac ung dung dang su dung cong COM"

End Sub

Private Sub Command2_Click()
If MSComm1.PortOpen = True Then
MSComm1.PortOpen = False
End If
End
End Sub

Private Sub Command3_Click()
On Error GoTo sendfalse
MSComm1.Output = Text1.Text
Exit Sub
sendfalse:
MsgBox Err.Description & vbLf + vbCr + "Loi, Cong COM chua duoc mo, nhan Connect"
End Sub

Private Sub Form_Load()
With MSComm1
.Settings = cmbBaudRate.Text + "N,8,1"
.RThreshold = 1
.SThreshold = 0
.InBufferSize = 1024
.OutBufferSize = 1024
.InputMode = comInputModeText
.ParityReplace = ""
.CommPort = Switch(cmbComPort.Text = "COM 1", 1, cmbComPort.Text = "COM 2", 2, cmbComPort.Text = "COM 3", 3, cmbComPort.Text = "COM 4", 4)
End With
End Sub

Private Sub MSComm1_OnComm()
Dim StringIn As String
If MSComm1.CommEvent = comEvReceive Then
StringIn = MSComm1.Input 'Nhan chuoi du lieu to VCOM
Text2.Text = StringIn
End If
End Sub




PIC:
#include <16f877a.h>
#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)
#include <stdlib.h>
#byte porta = 0x05
#byte portb = 0x06
#byte portc = 0x07
#byte porte = 0x09
int8 y,i,a,b,c,d,e;
int16 x;
char string[5];
BYTE CONST maled[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x9 0};

void nhan_rs232()
{

for(i=0;i<=4;i++)
{
string[i]=getc();
}
printf("%s",string);
y=0;
x=atol(string);
a=x/10000;
x=x%10000;
b=x/1000;
x=x%1000;
c=x/100;
x=x%100;
d=x/10;
x=x%10;
e=x;

a=maled[a];
b=maled[b];
c=maled[c];
d=maled[d];
e=maled[e];

for(i=0;i<=200;i++)
{
output_A(0b01111);
output_D(a);
delay_ms(1);
output_A(0b11111);

output_A(0b10111);
output_D(b);
delay_ms(1);
output_A(0b11111);

output_A(0b11011);
output_D(c);
delay_ms(1);
output_A(0b11111);

output_A(0b11101);
output_D(d);
delay_ms(1);
output_A(0b11111);

output_A(0b11110);
output_D(e);
delay_ms(1);
output_A(0b11111);
}


}
/*void xoa()
{
for(i=0;i<=4;i++)
{
string[i]=0;
}
}*/
void main()
{
set_tris_b(0);
set_tris_e(0);
while(true)
{
if(y==0)
{
nhan_rs232();
delay_ms(100);

}
}
}


Em làm nhận một số 5 chữ số hiển thị led 7 đoạn

đây là file mô phỏng: http://www.mediafire.com/?d4g26cwn4bx4g8y

hangocminh1989
14-10-2011, 01:21 AM
Mấy bác cho em hỏi cái này. Em truyền nhận dữ liệu giữa 16f877 và VB6 đã nhận đc nhưng chỉ với thạch anh 4000000Hz, khi thay đổi cái này thì lại không nhận được. Em làm với kit thạch anh 24Mhz ko thể nhận dữ liệu được. Mong các bác chỉ giáo giùm em với.

VB:

Private Sub Command1_Click()
On Error GoTo OpenFalse
If MSComm1.PortOpen = False Then
MSComm1.PortOpen = True
End If
Exit Sub
OpenFalse:
MsgBox Err.Description & vbLf + vbCr + "Loi, khong the mo cong. Hay dong cac ung dung dang su dung cong COM"

End Sub

Private Sub Command2_Click()
If MSComm1.PortOpen = True Then
MSComm1.PortOpen = False
End If
End
End Sub

Private Sub Command3_Click()
On Error GoTo sendfalse
MSComm1.Output = Text1.Text
Exit Sub
sendfalse:
MsgBox Err.Description & vbLf + vbCr + "Loi, Cong COM chua duoc mo, nhan Connect"
End Sub

Private Sub Form_Load()
With MSComm1
.Settings = cmbBaudRate.Text + "N,8,1"
.RThreshold = 1
.SThreshold = 0
.InBufferSize = 1024
.OutBufferSize = 1024
.InputMode = comInputModeText
.ParityReplace = ""
.CommPort = Switch(cmbComPort.Text = "COM 1", 1, cmbComPort.Text = "COM 2", 2, cmbComPort.Text = "COM 3", 3, cmbComPort.Text = "COM 4", 4)
End With
End Sub

Private Sub MSComm1_OnComm()
Dim StringIn As String
If MSComm1.CommEvent = comEvReceive Then
StringIn = MSComm1.Input 'Nhan chuoi du lieu to VCOM
Text2.Text = StringIn
End If
End Sub




PIC:
#include <16f877a.h>
#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)
#include <stdlib.h>
#byte porta = 0x05
#byte portb = 0x06
#byte portc = 0x07
#byte porte = 0x09
int8 y,i,a,b,c,d,e;
int16 x;
char string[5];
BYTE CONST maled[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x9 0};

void nhan_rs232()
{

for(i=0;i<=4;i++)
{
string[i]=getc();
}
printf("%s",string);
y=0;
x=atol(string);
a=x/10000;
x=x%10000;
b=x/1000;
x=x%1000;
c=x/100;
x=x%100;
d=x/10;
x=x%10;
e=x;

a=maled[a];
b=maled[b];
c=maled[c];
d=maled[d];
e=maled[e];

for(i=0;i<=200;i++)
{
output_A(0b01111);
output_D(a);
delay_ms(1);
output_A(0b11111);

output_A(0b10111);
output_D(b);
delay_ms(1);
output_A(0b11111);

output_A(0b11011);
output_D(c);
delay_ms(1);
output_A(0b11111);

output_A(0b11101);
output_D(d);
delay_ms(1);
output_A(0b11111);

output_A(0b11110);
output_D(e);
delay_ms(1);
output_A(0b11111);
}


}
/*void xoa()
{
for(i=0;i<=4;i++)
{
string[i]=0;
}
}*/
void main()
{
set_tris_b(0);
set_tris_e(0);
while(true)
{
if(y==0)
{
nhan_rs232();
delay_ms(100);

}
}
}


Em làm nhận một số 5 chữ số hiển thị led 7 đoạn

đây là file mô phỏng: http://www.mediafire.com/?d4g26cwn4bx4g8y

bạn quả nhiên lợi hại, cho mình hỏi 1 câu hơi ngớ ngẩn là bạn đã đọc datasheet của con 16f877a chưa vậy? nếu đọc rồi thì cho mình hỏi tần số thạch anh cao nhất con pic này có thể chạy là bao nhiêu thê? bạn bắt nó chạy ở 24mhz có mà nó chạy bằng niềm tin à?

cho87
14-10-2011, 07:56 PM
đây là đồ án giao tiếp máy tính mình làm vừa xong , mình chia sẽ cho cac bạn cùng tham khảo
http://www.mediafire.com/?xz5d77h57x9bkql

cho87
14-10-2011, 08:02 PM
thao khảo nè
http://www.mediafire.com/?xz5d77h57x9bkql

vudiepdh1
11-12-2011, 01:27 PM
thao khảo nè
http://www.mediafire.com/?xz5d77h57x9bkql
Mình vẫn chưa rõ đề tài của bạn về cái gì ? vs lại chạy bằng proteus ko thấy xi nhê gì cả ! Thân

acestartn
01-01-2012, 11:59 PM
mình đang làm đề tài giao tiếp máy tính,điều khiển thiết bị và đo nhiệt độ.
mình có tham khảo chương trình của Stupid11.Mình làm theo,kết nói được nhưng đèn trên vb ko sáng.các bạn có thể giúp mình gửi nhiệt độ lên vb được ko?

hoangson_200529
20-03-2012, 12:54 PM
lập trình Vb 6.0 tren laptop thì làm sao giao tiếp được qua cổng Com. các anh giúp em cho này.
theo em bit thì VB không hổ trợ giao tiếp cổng USB

hoangson_200529
20-03-2012, 01:04 PM
Vb 6.0 không hổ trợ giao tiếp quan cổng USB, nhưng Laptop không có cổng Com, Z phải làm thế nào các anh