Nếu đây là lần đầu tiên đến với Điện Tử Việt Nam, bạn có thể đọc phần Hỏi đáp bằng cách nhấn vào liên kết. Có thể bạn cần đăng kí trước khi có thể gửi bài . Để bắt đầu xem bài viết, chọn diễn đàn bạn muốn thăm dưới đây.
dung thach anh 12Mh nha cho chinh xac
DELAY1S: MOV 7AH,#500000
DJNZ 7FH,$
vay chac ban hieu chu gi?
djnz 2 chu ky may tuc 2us, giam 500.000 tuc la ton thoi gian = 500.000 x 2us = 1s
hoan hô! nhưng mà bạn chưa hiểu gì về vi điều khiển cả
bạn hiểu gì về từng dòng lệnh trong ASM ko?
bạn đã thử phân tích một chương trình nào đó, đã biết CPU nó xử lý từng lệnh như thế nào, thời gian cho từng lệnh, cách thức thoát khỏi một chương trình con, các thủ tục kèm theo chưa?...
Mấy cái hàm tạo trễ này rất quen thuộc, hầu như sách vdk nào cũng có nói. Trên mạng, cũng đã có nhiều bài trao đổi rồi! Vậy mà vẫn còn một số bạn lóng ngóng quá nhỉ!
Ta có thể xây dựng trễ 1ms là thời gian đơn vị, muốn trễ lâu hơn thì nhân lên thôi. Chằng hạn trễ 1s => làm 1000 lần trễ 1ms. Với thạch anh 12MHz thì chu kì dao động T=1us, việc tính toán này quá đơn giản phải không!?
Trễ_1ms:
MOV R7,#250
lặp_giảm:
NOP
NOP
DJNZ R7,lặp_giảm
RET
Ghi chú:
- 2 lệnh NOP tốn 2T
- Lệnh DJNZ tốn 2T
- Lặp lại 250 lần của 4T => 250x4x1us = 1000us = 1ms.
mov r6,#0ffh
de: mov r7,#0ffh
djnz r7,$
djnz r6,de
mình có đoạn code delay như vậy
viết cho at89s52 dùng thạch anh 12 MHz
không hiểu làm sao biết cách tính đoạn trên là delay ? giây
Các cao thủ chỉ giúp em với
theo mình bít thì lệnh djnz và lệnh MOV chiếm 2 chu kì máy nếu ban dùng thạch anh 12Mhz
thì 1 chu kì khoảng 1us
cách tính chu kì:
Tmáy = 12 * Txn = 12*1/f= 12*1/(12*10^6)
(thạch anh 12Mhz) nếu là thạch anh khác thì bạn chỉ thay f khác thôi
thời gian trễ của bạn :t=(2*255+2)*255+2
nói chung cách tính này không chính xác lắm tốt nhất bạn nên dùng timer nó vừa dễ lại vừa chính xác.
Mình mới học vxl cũng xin viết dùng timer2_autoreload, sai chỗ nào ae chỉ giáo :
Ta hình dung thế này nhé, timer 2 có 16 bit==> tối đa là FFFFH==> 65535
Vậy ta dùng timer 2 để đếm tối đa là 65536 Micro s (Đếm từ 0-->65535)
VD cần tính 10ms (10.000 Micro s) thì ta sẽ đếm từ (65536-10000)=55536=#0D8F0H đến 65536 là được 10ms thì báo tràn.
org 100
Init:
clr EA ;Cam tat ca cac ngat
mov SP,#2FH ;Khoi tao ngan xep
mov T2CON,#00H ;T2 lam viec o che do Auto_reload
mov TH2,#0D8H
mov TL2,#0FOH
mov RCAP2H,TH2
mov RCAP2L,TL2
mov a,#01H
setb TR2 ;Cho phep T2 lam viec
setb IE.5 ;Cho phep ngat tran T2
setb EA ;Cho phep tat ca cac ngat
here:
sjmp here ;Doi ngat
Để có đúng 1 s, bạn tạo thêm 1 biến a=100, sau đó dùng djnz để giảm a 100 lần. Vậy sau 100 lần *10ms( 1 lân)=1000ms=1s
nhân tiện cho mình hỏi thêm về cái phần test hipot (cao áp),là để kiểm tra độ bền cách điện giưa các cuộn dây,mà thấy thông số test thường ở mức 4kvac,vậy nếu mấy con fail đó xài bình thường vẫn dduocj phải không ạ,vì điện mình làm gì lên tới mức đó
Xin chào mọi người, tôi đã sử dụng Flashforge Inventor 2 được gần 5 năm và rất hài lòng với nó, nhưng tuần trước đã xảy ra sự cố. Có vẻ như động cơ bước đưa sợi in vào đầu nóng đã bị hỏng. Mọi thứ khác có vẻ ổn trên máy...
Comment