Cảm ơn cả nhà rất nhiều!
Thông báo
Collapse
No announcement yet.
Hỏi về lập trình giao tiếp
Collapse
X
-
Bạn ơi! Làm như bạn thế này thì ko ổn rồi, nếu giá trị truyền xuống bằng 1 thì led chỉ đếm tiến từ 1 =>4 rồi ngừng thôi, Yêu cầu của bài là cứ lặp đi, lặp lại từ 1=>4 cho đến khi nào ấn nút thứ 2 thì nó lại đếm tiến từ 5=> 9 và cứ lặp đi lặp lại như thế; Cho tới khi ấn nút thứ 1. . .Nguyên văn bởi chipmickey Xem bài viếtcách của mình thế này:
sử dụng ngắt của Port nối tiếp, khi có ngắt thì làm như sau: trước tiên kiểm tra xem ký tự truyền từ PC xuống có phải 1 không? nếu không thì kiểm tra có phải là 2 không? nếu không nữa thì chẳng làm gì cả
nếu là 1:
đưa con trở DPTR vào bitmap1 (bitmap1 chủa mã hiển thị từ 1-->4) rồi thoát khoải ngắt.
nếu là 2:
đưa con trỏ DPTR vào bitmap2 (bitmap2 chứa mã hiển thị từ 5-->9) rồi thoát khỏi ngắt.
chương trình chính bạn chỉ cần khởi tạo ngắt cho Port nối tiếp, sau đó cho hiển thị kí tự tắt led (tùy phần cứng mà có thể là 00h, hoặc FFh)
khi có ngắt và ký tự thích hợp thì khi đó sẽ hiển thị được thôi.
main:
khởi tạo port nối tiếp
mov dptr,#bitmap ; bitmap này toàn là 00 hoặc là FFh
quay_lai: mov a,#0;
mov r0,#4
loop: movc a,@a+dptr
mov p1,a
delay(1s)
inc a
djnz r4,loop
jmp quay_lai
Comment
-
truyền nhận dữ liệu???
Các bạn xem hộ, mình truyền nhận dữ liệu ko ổn ở chỗ nào mà chẳng thấy chạy vậy? Mình muốn trên VB nhập vào ô text là số 5, thì dưới VDK cũng nhận được số 5.
Cảm ơn các bạn!
code VB:
Private Sub CHAY_Click()
If Text1.Text = "" Then
MsgBox "VUI LONG NHAP SO CHUOI BUOC!"
End If
Dim X As Integer
Text1.Text = X
MSComm1.Output = Chr(X)
Text1.Text = ""
End Sub
Private Sub Form_Load()
With MSComm1
.CommPort = 1
.Settings = "9600,N,8,1"
.SThreshold = 0
.OutBufferCount = 0
End With
If MSComm1.PortOpen = True Then
MSComm1.PortOpen = False
End If
Text1.Text = ""
End Sub
Private Sub KETNOI_Click()
MSComm1.PortOpen = True
End Sub
Private Sub THOAT_Click()
End
End Sub
code vdk
$INCLUDE(REG51.INC)
ORG 0000H
LJMP MAIN
ORG 0023H
LJMP NOITIEP
ORG 0030H
;--------------------------THIETLAPTOCDO---------------
MAIN:
MOV TMOD,#20H
MOV TH1,#-3
MOV SCON,#50H
MOV IE,#90H
SETB TR1
JMP $
;--------------------------NGAT------------------------
NOITIEP:
MOV A,SBUF
CJNE A,#5,K0
LJMP CHAY
K0:
CLR RI
RETI
CHAY:
MOV R0,#4
MOV DPTR,#BANGMA
K:
CLR A
MOVC A,@A+DPTR
MOV P2,A
LCALL DELAY
INC DPTR
DJNZ R0,K
DJNZ R1,K0
CLR RI
RETI
;----------------------------TRE-----------------------
DELAY:
MOV R6,#250
K1:
MOV R7,#255
DJNZ R7,$
DJNZ R6,K1
RET
;---------------------------BANGMA----------------------
BANGMA: DB 03H,09H,0CH,06H
ENDLast edited by caube; 07-07-2008, 18:57.
Comment
-
@caube:
Tôi mới xem phần VB đã thấy không thể truyền text1.text xuống VĐK được vì bạn viết:
Text1.Text = X --> Chr(X) luôn =0
đáng lẽ phải viết ngược lại.
Mà X nên khai báo kiểu Byte--> Dim X as byte và lấy nội dung text như sau
X=cbyte(val(Text1.Text))
lúc này đưa X vào Chr(X) để truyền mới đúng.
email:mahaco@fpt.vn
Comment
-
Nguyên văn bởi hoctro89xxx Xem bài viết@caube:
Tôi mới xem phần VB đã thấy không thể truyền text1.text xuống VĐK được vì bạn viết:
Text1.Text = X --> Chr(X) luôn =0
đáng lẽ phải viết ngược lại.
Mà X nên khai báo kiểu Byte--> Dim X as byte và lấy nội dung text như sau
X=cbyte(val(Text1.Text))
lúc này đưa X vào Chr(X) để truyền mới đúng.
cám ơn bạn về câu trả lời này. bạn hoctro89 ơi cho mình hỏi nhé. truyền 1 byte thi mình đa truyền được rồi (làm như bạn hướng dẫn ở trên), vậy bây giở minh muốn truyền một ký tự bất kỳ 2byte thì mình phải làm như thế nào? phải khai báo ra sao? mình đang làm điều khiển vị trí giao tiếp máy tính nhưng bị bí ở đay rồi. mình chỉ biết là phải truyền từng byte một nhưng không biết phải làm thế nao. hichichic mong bạn giúp mình nhé. cám ơn bạn nhiều.
Comment
-
Thế này bạn ạ, truyền qua cổng nối tiếp thì mỗi lần truyền chỉ được 1 byte thôi. Truyền nhiều byte liên tục thì được nhiều byte, nhưng mỗi byte vẫn cách nhau bởi bit START, STOP. Kể cả bạn có truyền 1 chuỗi trên PC đến VĐK bằng 1 lệnh thì nó vẫn cứ tách ra và truyền từng byte. Nên bạn muốn truyền 1 số 2 byte hay nhiều hơn thì vẫn phải tách ra để truyền từng byte 1. Tôi lấy ví dụ truyền số được cấu tạo bởi 2 byte nhé:Nguyên văn bởi heoluoi2006 Xem bài viếtcám ơn bạn về câu trả lời này. bạn hoctro89 ơi cho mình hỏi nhé. truyền 1 byte thi mình đa truyền được rồi (làm như bạn hướng dẫn ở trên), vậy bây giở minh muốn truyền một ký tự bất kỳ 2byte thì mình phải làm như thế nào? phải khai báo ra sao? mình đang làm điều khiển vị trí giao tiếp máy tính nhưng bị bí ở đay rồi. mình chỉ biết là phải truyền từng byte một nhưng không biết phải làm thế nao. hichichic mong bạn giúp mình nhé. cám ơn bạn nhiều.
Số 300 là số 2 byte ( vì > 255) nên phải tách ra 2 byte- byte cao và byte thấp.
byte cao= 300 \ 256 ( lấy phần nguyên) = 1
byte thấp = 300 mod 256 (lấy phần dư)=44
Như vậy ta truyền từ PC các byte cao và thấp này.
VĐK nhận xong 2 byte sau đó để riêng để xử lý, Nếu dùng ASM thì có thể cho vào DPTR (đây là thanh ghi 2 byte).... có nhiều cách xử lý theo ý của mình với 2 byte này.
email:mahaco@fpt.vn
Comment
-
Post xong bài trước mới đọc thấy bài này.Nguyên văn bởi heoluoi2006 Xem bài viếtà mình đang viết bằng C. nghe mọi người nói cách truyền và nhận đơn giản lắm nhưng mình chăng biết gì cả, tự học nên mình chăng biết hỏi ai hết. mong các bạn nhiệt tinh giúp mình nhé. cám ơn các bạn nhiều.
Nếu dùng C thì đơn giản, nhận được 2 byte thì lấy byte cao * 256 + byte thấp gán cho 1 biến 2 byte được khai báo trong C là dùng được ngay.
email:mahaco@fpt.vn
Comment
-
hoctro89 ơi lần trước bạn chỉ cách lấy ký tự 1 byte la X=cbyte(val(text1.text)), bây giờ mình muốn lấy ký tự 2 byte mình thử làm X=cDbl(val(text1.text)) nhưng lại kg đc. mình tìm trong thư viện của VB thì chi thấy cDbl là hợp lý thôi, vậy bạn xem giúp mình nhé, kg biết mình có cần phải cài thư viện MSDN kg hả bạn?
Comment
-
Chào bạn!Nguyên văn bởi hoctro89xxx Xem bài viết@caube:
Tôi mới xem phần VB đã thấy không thể truyền text1.text xuống VĐK được vì bạn viết:
Text1.Text = X --> Chr(X) luôn =0
đáng lẽ phải viết ngược lại.
Mà X nên khai báo kiểu Byte--> Dim X as byte và lấy nội dung text như sau
X=cbyte(val(Text1.Text))
lúc này đưa X vào Chr(X) để truyền mới đúng.
- Bạn cho mình hỏi nhé! Nếu khai báo kiểu này thì mỗi lần mình chỉ truyền được 1 con số <= 255 thôi phải ko?
- nếu trên VB mình gõ vào ô text là 250
dưới vdk: mov a,sbuf
thì giá trị của a=250 phải ko?
mình thử truyền trên mạch thật mà nó cứ loạn hết cả lên!
Cảm ơn bạn!
Comment
-
Đúng rồi bạn ạ, sẽ nhận được a =250 . Nếu không thì bạn phải xem lại các thiết lập về tốc độ... của VB và VĐK xem có giống nhau không, xem lại cả phần max232 nữa..Nguyên văn bởi caube Xem bài viếtChào bạn!
- Bạn cho mình hỏi nhé! Nếu khai báo kiểu này thì mỗi lần mình chỉ truyền được 1 con số <= 255 thôi phải ko?
- nếu trên VB mình gõ vào ô text là 250
dưới vdk: mov a,sbuf
thì giá trị của a=250 phải ko?
mình thử truyền trên mạch thật mà nó cứ loạn hết cả lên!
Cảm ơn bạn!
email:mahaco@fpt.vn
Comment
-
Bạn truyền như bình thường, coi mỗi byte là 1 số.Nguyên văn bởi heoluoi2006 Xem bài viếtkhi mình tách 2 byte thành byte cao và byte thấp vậy khi mình truyền thì mình vẫn truyền như bình thường phải kg bạn, tức là mình làm như thế này.
Private Sub START_Click() 'khi nhấn START thì truyền
MSComm1.Output = Chr(byte cao)
MSComm1.Output = Chr(byte thấp)
VĐK nhận byte đầu phải coi nó là byte cao.
Tách 1 số 2 byte thành 2 byte thì có nhiều cách, như tôi đã giới thiệu 1 cách rồi đấy. Không dùng cDbl được .
Chúc thánh công!
email:mahaco@fpt.vn
Comment
-
bạn cho mình hỏi luôn nhé. mình đang use ngắt timer, mục đích của mình là khi mình truyền số xung từ pc xuống vdk, vdk nhận giá trị xung đó và tính toán giá trị nạp cho timer, sau đó timer sẽ đếm hết số xung đó thì xảy ra ngắt, nhưng mình đang không biết làm cách nào để nạp giá trị cho TH va TL của timer. ban cho minh y kiến nhé. mình làm ví dụ như sau
vd: 65535-400=65135 /*400 là giá trị nhận được từ pc*/
làm sao để nạp giá trị 65135 cho TH va TL vậy bạn.
Comment
Bài viết mới nhất
Collapse
-
bởi FotiniChào mọi người.
Cấu trúc khung giàn của tôi sử dụng một động cơ servo tích hợp trên mỗi trục (https://www.oyostepper.es/category-8...integrado.html), với một dây nối đất chung.
Việc kích hoạt từng trục riêng lẻ hoạt động tốt, nhưng...-
Channel: Điện tử dành cho người mới bắt đầu
18-06-2026, 14:03 -
-
Trả lời cho Cấu hình chiến game "quốc dân" cho nền tảng AM5: Lựa chọn tối ưu ngân sách với Ryzen 5 7500Fbởi kumarbrMình đồng ý với hướng build AM5 bằng 7500F, nhưng nếu có thể cố thêm ngân sách thì nên lên RX 7600 ngay từ đầu. 4GB VRAM của RX 6500 XT bắt đầu khá chật với nhiều game mới, còn RX 7600 sẽ dùng thoải mái hơn trong vài năm tới.
-
Channel: Đánh giá sản phẩm DTVN
16-06-2026, 15:49 -
-
bởi theidiotcatTrong thời buổi vật giá leo thang, việc sắm một bộ máy tính chơi game đáp ứng đủ tiêu chí "ngon, bổ, rẻ" là ưu tiên hàng đầu của nhiều bạn trẻ. Lúc này, combo sử dụng vi xử lý AMD Ryzen 5 7500F kết hợp cùng card màn hình Radeon...
-
Channel: Đánh giá sản phẩm DTVN
16-06-2026, 10:16 -
-
bởi theidiotcatAMD Ryzen 9 9950X3D không chỉ là một bộ vi xử lý đơn thuần; nó là lời khẳng định về sức mạnh của kiến trúc Zen 5 kết hợp cùng công nghệ 3D V-Cache đột phá. Trong bối cảnh thị trường linh kiện PC cạnh tranh khốc liệt, đây được xem...
-
Channel: Đánh giá sản phẩm DTVN
15-06-2026, 09:21 -
-
bởi theidiotcatBộ đôi Ryzen 9 9950X3D2 và Radeon RX 9070 XT 16GB là sự kết hợp phần cứng cao cấp nhất của AMD hiện nay. Đây không chỉ là một dàn máy tính để giải trí thông thường, mà là công cụ làm việc mạnh mẽ dành cho những ai có nhu cầu xử lý cường...
-
Channel: Đánh giá sản phẩm DTVN
15-06-2026, 09:09 -
-
bởi theidiotcatKhi ráp một bộ máy tính cấu hình cao, việc cân đối ngân sách cho từng linh kiện là rất quan trọng. Sự kết hợp giữa vi xử lý AMD Ryzen thế hệ mới có công nghệ 3D V-Cache và card đồ họa Radeon RX 9070 XT đang là lựa chọn rất đáng tiền....
-
Channel: Đánh giá sản phẩm DTVN
11-06-2026, 10:43 -
-
Trả lời cho Yêu thơ mê nhạc, mời các bác vào đây!bởi dinhthuong92Giới thiệu bản nhạc đệm mới nhộn nhịp tươi vui, nghe là muốn... xuất gia đi tu liền!!!!😁...
-
Channel: Tâm tình dân kỹ thuật
11-06-2026, 09:51 -

Comment