Chào các anh chị và các bạn trong diễn đàn. Như trong phần tiêu đề em đã trình bày: Em muốn nhờ các anh chị và các bạn trong diễn đàn trợ giúp em về phần code ASM, lập trình điều khiển tốc độ nhấp nháy của đèn LED bằng phím bấm (mô phỏng bằng Proteus).
- Về phần cứng:
- Yêu cầu đặt ra là:
- Dựa trên yêu cầu trên em có ý tưởng viết code như sau:
Dưới đây là code ASM thực hiện ý tưởng trên nhưng nó hoạt động không đúng mục đích (tốc độ nháy led không được thay đổi khi bấm phím) mà em vẫn chưa tìm ra lỗi (có file mô phỏng ở dưới).
Nhờ mọi người sửa giúp hoặc có ý tưởng nào hay thì chỉ cho em với.
Em xin chân thành cảm ơn!
- Về phần cứng:
kết nối khá đơn giản, em có 16 con LED đơn, Anot của các LED được nối lần lượt tới các chân của port 0 và port 2 của VĐK 8051, các Catot được nối MASS. 2 phím bấm được đặt tên là NHANH và CHẬM được nối lần lượt tới P3.2 và P3.3 của VĐK, đầu còn lại của phím bầm được nối MASS.
khi cấp nguồn cho VĐK hoạt động thì các LED sáng - tắt (nhấp nháy) ở một tốc độ nhất định, tốc độ này được giữ nguyên cho đến khi nào bấm phím NHANH hoặc CHẬM thì nó mới được thay đổi. Nếu phím NHANH được bấm thì các LED nhấp nháy nhanh, cứ mỗi lần bấm phím thì tốc độ nháy của LED lại tăng lên (tăng lên đến 1 giới hạn nhất định do người lập trình đặt ra). Ngược lại mỗi lần bấm phím CHẬM thì tốc độ nháy của LED chậm lại (cũng chỉ chậm đến một mức độ nhất định).
+ Trong code, em sử dụng ngắt ngoài 0 và 1 để phát hiện phím bấm.
+ Em dùng một biến đếm đặt tên là "count", biến này có tác dụng chỉ ra vị trí của các mã thời gian.
+ Mã thời gian: chính là số lần lặp lại của một khoảng thời gian đã trễ được định trước (thời gian trễ này được tạo ra bởi timer 0). Mã thời gian này được nạp vào trong thanh ghi R0 khi thực hiện vòng lặp. Khi biến đếm count thay đổi thì mã thời gian thay đổi tương ứng.
=> Khi có phím bấm ngắt tương ứng với phím bấm được kích hoạt sẽ thay đổi giá trị biến đếm count => mã thời gian thay đổi => R0 thay đổi => thời gian delay thay đổi => tốc độ nháy của LED thay đổi.
+ Em dùng một biến đếm đặt tên là "count", biến này có tác dụng chỉ ra vị trí của các mã thời gian.
+ Mã thời gian: chính là số lần lặp lại của một khoảng thời gian đã trễ được định trước (thời gian trễ này được tạo ra bởi timer 0). Mã thời gian này được nạp vào trong thanh ghi R0 khi thực hiện vòng lặp. Khi biến đếm count thay đổi thì mã thời gian thay đổi tương ứng.
=> Khi có phím bấm ngắt tương ứng với phím bấm được kích hoạt sẽ thay đổi giá trị biến đếm count => mã thời gian thay đổi => R0 thay đổi => thời gian delay thay đổi => tốc độ nháy của LED thay đổi.
Code:
;=============================== ; Dung VDK AT89C51, thach anh 12Mhz ; ; 16 led duoc noi voi p0 va p2 ; ; 2 nut bam dieu khien toc do nhay cua led: ; ; - NHANH noi voi p3.2 ; ; - CHAM noi voi p3.3 ; ; Cac Led duoc noi Catot chung, Led sang khi ; ; tin hieu xuat ra o cac chan VDK la muc 1. ; ;=============================== NHANH bit p3.2 CHAM bit p3.3 value equ -20000 ; 20ms count equ 07fh ; dia chi bien dem 07fh ; org 0h sjmp start org 03h ; vecto ngat ngoai 0 ljmp ex0_isr ; trinh phuc vu ngat ngoai 0 org 13h ; vecto ngat ngoai 1 ljmp ex1_isr ; trinh phuc vu ngat ngoai 1 ; org 30h ; dia chi bat dau chuong trinh chinh start: mov p0, #0 ; tat tat ca cac led mov p2, #0 setb p3.2 ; thiet lap p3.2, p3.3 setb p3.3 ; lam dau vao mov tmod, #01h ; timer 0 che do 1 (16-bits) setb ie.7 ; cho phep ngat toan cuc setb ie.0 ; cho phep ngat ngoai 0 setb ie.2 ; ngat ngoai 1 setb it0 ; kich ngat setb it1 ; theo suon am mov count, #09 ; nap bien dem bang 9 (0 <= count <= 18) mov r0, #50 ; khoi dong so lan lap thoi tgian delay voi gia tri ban dau la 50 mov dptr, #ma_tg ; dat con tro o bang ma thoi gian back: mov p0, #0ffh ; tat ca cac led sang mov p2, #0ffh ; call delay ; ct tre tao thoi gian sang mov p0, #0h ; tat tat ca cac led mov p2, #0h call delay ; ct tre tao thoi gian tat sjmp back ; lap lai ; ;-------------------------------------------- ; Trinh phuc vu ngat ngoai 0 ;-------------------------------------------- ex0_isr: clr a ; xoa Acc dec count ; nut NHANH dc bam: giam bien dem thoi gian mov a, count ; Acc = count cjne a, #255, skip ; Count = -1 (255) ? inc count ; dung: tang Count len 1 dv (Acc = 0) inc a ; skip: movc a, @a+dptr ; Acc khac -1: nap ma thoi gian vao Acc mov r0, a ; dua ma thoi gian vao r0 va reti ; thoat khoi ngat ;-------------------------------------------- ; Trinh phuc vu ngat ngoai 1 ;-------------------------------------------- ex1_isr: clr a ; xoa Acc inc count ; nut CHAM dc bam: tang bien dem thoi gian mov a, count ; Acc = count cjne a, #19, skip1 ; Count = 19 ? dec count ; dung: giam count di 1 dv dec a skip1: movc a, @a+dptr mov r0, a ; dua ma thoi gian vao r0 va reti ; thoat khoi ngat ;-------------------------------------------- delay: push 00 ll: mov th0, #high value mov tl0, #low value setb tr0 jnb tf0, $ clr tr0 clr tf0 djnz r0, ll pop 00 ret ;-------------------------------------------- ma_tg: ;count 0,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18 ; | | | | | | | | | | | | | | | | | | | db 5,10,15,20,25,30,25,40,45,50,55,60,65,70,75,80,85,90,100 ;-------------------------------------------- end
Nhờ mọi người sửa giúp hoặc có ý tưởng nào hay thì chỉ cho em với.
Em xin chân thành cảm ơn!
Comment