mấy a chỉ cho e cách dùng nhiều ngắt trong lập trình vdk 8051 với. e đang lam bài tập có đề là như thế này:viết chương trình ngắt timer để tạo đồng thời 2 sóng vuông 1khz và 50khz tại p1.0 và p1.1 (tần số dao động của thạch anh 12Mhz)
Thông báo
Collapse
No announcement yet.
cách dùng nhiều ngắt cho 8051
Collapse
X
-
Nguyên văn bởi imyour_nnc Xem bài viếtmấy a chỉ cho e cách dùng nhiều ngắt trong lập trình vdk 8051 với. e đang lam bài tập có đề là như thế này:viết chương trình ngắt timer để tạo đồng thời 2 sóng vuông 1khz và 50khz tại p1.0 và p1.1 (tần số dao động của thạch anh 12Mhz)
Last edited by chung1608; 23-12-2011, 17:28.
-
Nguyên văn bởi OoMrBayoO Xem bài viếtÈo cái này làm gì mà bạn phải dùng tới 2 ngắt vậy. Cái này dùng 1 ngắt Timer chế độ 16bits là được.
Comment
-
Bạn dùng 1 Timer bất kì rồi nhân lên thành 10 con hay 100 con hay 255 con timer rồi dùng dần
Ví dụ như sử dụng ngắt timer để tạo ra 32 con timer khác rồi sử dụng tạo 32 xung với 32 tần số khác nhau đưa ra 32 chân chíp ...
Bạn thử làm với ý tưởng này nhé ... Chúc thành công.
Comment
-
ý bạn đấy là thế này chứ đâu phải 1 timer thực hiện 2 ngắt 1 lúc
Code:time0: inc dem mov a,dem cjne a,do_sang_red,clr_pwm_green clr pwm_red clr_pwm_green: cjne a,do_sang_green,clr_pwm_blu clr pwm_green clr_pwm_blu: cjne a,do_sang_blu,setb_pwm clr pwm_blu setb_pwm: cjne a,#255,exit mov p0,#0ffh exit: reti
Comment
-
Nguyên văn bởi anh_hung_21 Xem bài viếtbạn ơi 1 timer làm sao có thể thực hiện 2 ngắt cùng 1 lần dc hả bạn,bạn thử đưa ra 1 vị dụ để thuyết phục mọi ng đi
Comment
-
Mình lấy ví dụ thế này nhé, để dễ hiểu mình trình bầy thuật toán là chính có dùng thêm code C các bạn tùy vào môi trường lập trình và ngôn ngữ sử dụng mà thay đổi cho thích hợp nhé ...
1. Ý tưởng: Ngày xưa mình học Vi điều khiển và PLC song song (PLC S7200 - siements) mình có nhận xét thế này:
Con PLCs7200 trong nó cũng chỉ là một con vi diều khiển họ 8051 vậy mà trong khi sử dụng môi trường lập trình của nó ta có thể chon độ phân giải timer và có rất nhiều timer để sử dụng ... vậy thì phần cứng nào đáp ứng được điều này. Mình đã tìm ra câu trả lời tất cả nằm ở phần mềm.
2. Không cam chịu: Vi điều khiển cũng có thể làm được chỉ có điều phải khá thận trọng trong việc xử lý ngắt timer tránh việc thời gian xử lý các câu lệnh trong ngắt lớn hơn thời gian ngắt của timer
3. Thử lập trình tạo ra 8 con timer để nháy 8 con led với 8 tân số khác nhau trong một dải tần số hạn chế nào đó
Bước 1: Cài đặt và tạo một ngắt timer khoảng 1ms tùy bạn
Bước 2: Khai báo biến để sử dụng
int timer_tutao(8)={}; //khai báo biến mảng cho dễ dùng ... tùi ý đặt tên
Bước 3: Viết thêm lệnh trong hàm ngắt của timer nhằm mục đích đếm tăng các biến vừa khai báo
Ngat_timer()
{
for (i=0,i<=7,i++)
{
timer_tutao[i] = timer_tutao[i] +1;
}
}
Như vậy vô hình chung ta đã tạo được 8 time line độ phân giải 1ms, chạy từ 0 đến 65535 ( int mà - tùi vào ứng dụng ta dùng kiểu biến cho hợp lí )
Bước 4: Sử dụng timer chúng ta vừa tạo ra trong chương trình chính như thế nào ?
void main()
{
// -------------- các lệnh khởi tạo ban đầu --------
// trước khi sử dụng timer_tutao nào đó ta reset giá trị cho timer đó
timer_tutao[0] = 0;
timer_tutao[4] = 0;
timer_tutao[7] = 0;
// ----------- hết các lệnh khởi tạo ban đầu -------
while(1) // vòng lặp chính của chương trình
{
//-----------------đoạn chương trình nhấp nháy led với f=1hz độ đầy 10% ------------------
if ((timer_tutao[0] >0) & (timer_tutao[0]<100)) {led1 = 0;}
if ((timer_tutao[0] >=100) & (timer_tutao[0]<1000)) {led1 = 1;}
if (timer_tutao[0] >= 1000) { timer_tutao[0]=0;}
//-----------------đoạn chương trình nhấp nháy led với f=1/T = 1 / 0.2 = 5hz độ đầy 50%
if ((timer_tutao[4] >0) & (timer_tutao[4]<100)) {led2 = 0;}
if ((timer_tutao[4] >=100) & (timer_tutao[4]<200)) {led2 = 1;}
if (timer_tutao[4] >= 200) { timer_tutao[4]=0;}
//-----------------đoạn chương trình nhấp nháy led với f=1hz độ đầy 50% ------------------
if ((timer_tutao[7] >0) & (timer_tutao[7]<500)) {led3 = 0;}
if ((timer_tutao[7] >=500) & (timer_tutao[7]<1000)) {led3 = 1;}
if (timer_tutao[7] >= 1000) { timer_tutao[7]=0;}
}
}
Bước 5: Triển khai và những ứng dụng mở rộng
Với cách viết như vậy ta có thể linh hoạt hơn trong việc quy hoạch chương trình chính, chương trính viết khéo sẽ không bị dừng tại đâu cả liên tục thực hiện qua các hàm và chương trình con.
Ta có thể phân bổ cho chương trình quét nút sau khoảng 100ms quét 1 lần , hiẻn thị LCD không nhất thiết phải bắng tằng tằng dữ liệu lên cho khoảng 40 ms cập nhật một lần (LCD không cần phải có tần số làm tươi lớn hơn 30 hình 1s làm gì cho phí hiệu năng của chíp), quét sensor dò đường 10ms một lần, quét cảm biến vật cản trước của robot 50ms, chống nhiễu rung tiếp điểm, trễ thời gian không chết chương tình ...vv ...
Đây cũng chính là bước đầu tiên để tập tành thực hiện viết một nhân hệ điều hành on chip vô cùng vô cùng cơ bản và ít tính năng.
Hi vọng với ý tưởng trên đây những bạn đang học lập trình Vi điều khiển sẽ có thêm một công cụ mới ý tưởng mới cho các đề tài lớn. Chúc vui.
Các bạn hãy thử cùng phân tích ưu điểm và nhược điểm của công cụ nhân bản timer này nhé ... !
Comment
-
Nguyên văn bởi namctmc Xem bài viếtCác anh ơi giúp em cái này với ạ
So sánh 2 phương pháp lập trình tạo trễ trong 8051 là
1. Dùng Timer.
2. Dùng vòng lặp.
Em cảm ơn các anh trước ạ.Website chính thức đổi địa chỉ website thành
Mời các bạn ghé thăm !!!
Comment
-
Nguyên văn bởi robot_arm Xem bài viếtMình lấy ví dụ thế này nhé, để dễ hiểu mình trình bầy thuật toán là chính có dùng thêm code C các bạn tùy vào môi trường lập trình và ngôn ngữ sử dụng mà thay đổi cho thích hợp nhé ...
1. Ý tưởng: Ngày xưa mình học Vi điều khiển và PLC song song (PLC S7200 - siements) mình có nhận xét thế này:
Con PLCs7200 trong nó cũng chỉ là một con vi diều khiển họ 8051 vậy mà trong khi sử dụng môi trường lập trình của nó ta có thể chon độ phân giải timer và có rất nhiều timer để sử dụng ... vậy thì phần cứng nào đáp ứng được điều này. Mình đã tìm ra câu trả lời tất cả nằm ở phần mềm.
2. Không cam chịu: Vi điều khiển cũng có thể làm được chỉ có điều phải khá thận trọng trong việc xử lý ngắt timer tránh việc thời gian xử lý các câu lệnh trong ngắt lớn hơn thời gian ngắt của timer
3. Thử lập trình tạo ra 8 con timer để nháy 8 con led với 8 tân số khác nhau trong một dải tần số hạn chế nào đó
Bước 1: Cài đặt và tạo một ngắt timer khoảng 1ms tùy bạn
Bước 2: Khai báo biến để sử dụng
int timer_tutao(8)={}; //khai báo biến mảng cho dễ dùng ... tùi ý đặt tên
Bước 3: Viết thêm lệnh trong hàm ngắt của timer nhằm mục đích đếm tăng các biến vừa khai báo
Ngat_timer()
{
for (i=0,i<=7,i++)
{
timer_tutao[i] = timer_tutao[i] +1;
}
}
Như vậy vô hình chung ta đã tạo được 8 time line độ phân giải 1ms, chạy từ 0 đến 65535 ( int mà - tùi vào ứng dụng ta dùng kiểu biến cho hợp lí )
Bước 4: Sử dụng timer chúng ta vừa tạo ra trong chương trình chính như thế nào ?
void main()
{
// -------------- các lệnh khởi tạo ban đầu --------
// trước khi sử dụng timer_tutao nào đó ta reset giá trị cho timer đó
timer_tutao[0] = 0;
timer_tutao[4] = 0;
timer_tutao[7] = 0;
// ----------- hết các lệnh khởi tạo ban đầu -------
while(1) // vòng lặp chính của chương trình
{
//-----------------đoạn chương trình nhấp nháy led với f=1hz độ đầy 10% ------------------
if ((timer_tutao[0] >0) & (timer_tutao[0]<100)) {led1 = 0;}
if ((timer_tutao[0] >=100) & (timer_tutao[0]<1000)) {led1 = 1;}
if (timer_tutao[0] >= 1000) { timer_tutao[0]=0;}
//-----------------đoạn chương trình nhấp nháy led với f=1/T = 1 / 0.2 = 5hz độ đầy 50%
if ((timer_tutao[4] >0) & (timer_tutao[4]<100)) {led2 = 0;}
if ((timer_tutao[4] >=100) & (timer_tutao[4]<200)) {led2 = 1;}
if (timer_tutao[4] >= 200) { timer_tutao[4]=0;}
//-----------------đoạn chương trình nhấp nháy led với f=1hz độ đầy 50% ------------------
if ((timer_tutao[7] >0) & (timer_tutao[7]<500)) {led3 = 0;}
if ((timer_tutao[7] >=500) & (timer_tutao[7]<1000)) {led3 = 1;}
if (timer_tutao[7] >= 1000) { timer_tutao[7]=0;}
}
}
Bước 5: Triển khai và những ứng dụng mở rộng
Với cách viết như vậy ta có thể linh hoạt hơn trong việc quy hoạch chương trình chính, chương trính viết khéo sẽ không bị dừng tại đâu cả liên tục thực hiện qua các hàm và chương trình con.
Ta có thể phân bổ cho chương trình quét nút sau khoảng 100ms quét 1 lần , hiẻn thị LCD không nhất thiết phải bắng tằng tằng dữ liệu lên cho khoảng 40 ms cập nhật một lần (LCD không cần phải có tần số làm tươi lớn hơn 30 hình 1s làm gì cho phí hiệu năng của chíp), quét sensor dò đường 10ms một lần, quét cảm biến vật cản trước của robot 50ms, chống nhiễu rung tiếp điểm, trễ thời gian không chết chương tình ...vv ...
Đây cũng chính là bước đầu tiên để tập tành thực hiện viết một nhân hệ điều hành on chip vô cùng vô cùng cơ bản và ít tính năng.
Hi vọng với ý tưởng trên đây những bạn đang học lập trình Vi điều khiển sẽ có thêm một công cụ mới ý tưởng mới cho các đề tài lớn. Chúc vui.
Các bạn hãy thử cùng phân tích ưu điểm và nhược điểm của công cụ nhân bản timer này nhé ... !
không hiểu sao bây giờ em mới đọc được bài viết này của a, đúng là chưa có duyên.
a còn thủ thuật gì hay chia sẻ nốt cho ae đi a ơi, quá hay, quá hữu ích!
Comment
-
Đề bài yêu cầu: HIển thị lần lượt 4 số trên 4 led 7 đoạn, dùng cổng P1.[3:0]. Sử dụng ngắt P3.3 cho phép ngắt ngoài.
Mong các bạn giúp đỡ thêm.
Code này chỉ là 2 led nhưng lại không đếm lần lượt.
#include <sfr51.inc>
ORG 00H
LJMP MAIN
ORG 0013H ; dia chi vector ngat ngoai1
LJMP INT1_EX
MAIN:
SETB EA ;cho phep ngat
SETB EX1 ;ngat ngoai1
SETB IT1 ;ngat canh ngoai1
MOV DPTR,#CODELED
MOV R0,#01H
MOV R1,#00H
DISP:
MOV A,R0
MOVC A,@A+DPTR
MOV P0,A
MOV A,R1
MOVC A,@A+DPTR
MOV P1,A
CJNE R0,#9,NEXT
CJNE R1,#10,DISP
SJMP MAIN
NEXT:
CJNE R0,#10,DISP
MOV R0,#00H
SJMP DISP
CODELED:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
RET
INT1_EX:
INC R0
CJNE R0,#10,JUMPER
MOV R0,#0
INC R1
CJNE R1,#10,JUMPER
MOV R1,#0
JUMPER:
RETI
END
Comment
-
Nguyên văn bởi 1zx2zx Xem bài viếtĐề bài yêu cầu: HIển thị lần lượt 4 số trên 4 led 7 đoạn, dùng cổng P1.[3:0]. Sử dụng ngắt P3.3 cho phép ngắt ngoài.
Mong các bạn giúp đỡ thêm.
Code này chỉ là 2 led nhưng lại không đếm lần lượt.
#include <sfr51.inc>
ORG 00H
LJMP MAIN
ORG 0013H ; dia chi vector ngat ngoai1
LJMP INT1_EX
MAIN:
SETB EA ;cho phep ngat
SETB EX1 ;ngat ngoai1
SETB IT1 ;ngat canh ngoai1
MOV DPTR,#CODELED
MOV R0,#01H
MOV R1,#00H
DISP:
MOV A,R0
MOVC A,@A+DPTR
MOV P0,A
MOV A,R1
MOVC A,@A+DPTR
MOV P1,A
CJNE R0,#9,NEXT
CJNE R1,#10,DISP
SJMP MAIN
NEXT:
CJNE R0,#10,DISP
MOV R0,#00H
SJMP DISP
CODELED:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
RET
INT1_EX:
INC R0
CJNE R0,#10,JUMPER
MOV R0,#0
INC R1
CJNE R1,#10,JUMPER
MOV R1,#0
JUMPER:
RETI
END
Comment
Bài viết mới nhất
Collapse
-
Trả lời cho Hỏi về bơm màng bldcbởi vi van phamPhải xem cơ cấu bơm, chứ xem cơ cấu rotor, thì chỉ làm thầy bói xem voi.
-
Channel: Điện tử dành cho người mới bắt đầu
Hôm qua, 08:19 -
-
Trả lời cho Xin hỏi về màn hình laptopbởi yname11vg, cám ơn bác...........
-
Channel: Thiết bị điện tử cá nhân
28-11-2024, 14:37 -
-
bởi khoine9899
Em chào các anh và mọi người.
Hiện em đang có 1 con bơm màng trong thiết bị y tế đang gặp tình trạng yếu dần hoặc ngừng hoạt động sau thời gian sử dụng
Sau khi tìm hiểu về thông tin của bơm trên mạng thì em được biết...-
Channel: Điện tử dành cho người mới bắt đầu
28-11-2024, 11:22 -
-
Trả lời cho Cần mọi người giúp mạch tạo sóng siêu âm máy rửabởi bqviet
-
Channel: Điện tử công suất
27-11-2024, 20:26 -
-
bởi Minhdai95Em chào mọi người, e đang sửa mạch tạo sóng siêu âm cho máy rửa mà chưa có tài liệu để tham khảo sửa, mọi người cho e xin tài liệu ạ...
-
Channel: Điện tử công suất
27-11-2024, 11:37 -
-
bởi pia2k1Cùng câu hỏi và cần được giải đáp thêm ạ...
-
Channel: Hướng dẫn sử dụng diễn đàn
27-11-2024, 11:28 -
-
Trả lời cho Công thức điện tửbởi mèomướpDạ thời thế giờ thay đổi theo hướng tích cực hơn rồi chú trung sĩ ạ. Kiến thức được chia sẻ ngày càng nhìu nên làm ăn gian dối ko còn dễ dàng như trước đâu ạ. Những thợ nhỏ rồi sẽ thành công nhân sản xuất đồ mới hết thay vì sửa chữa lặt vặt...
-
Channel: Tâm tình dân kỹ thuật
26-11-2024, 21:21 -
-
Trả lời cho Xin hỏi về màn hình laptopbởi mèomướpDạ cùng chuẩn tín hiệu thì chắc chắn là nhận ạ. Vì bản chất oled hay lcd thì đều phải có mạch chuyển đổi trên thanh gỗ rồi chuyển sang những chip xử lý hàng nghìn chân gắn trên những tab mỏng dính rồi mới ra các điểm ảnh theo hàng...
-
Channel: Thiết bị điện tử cá nhân
26-11-2024, 20:31 -
-
Trả lời cho Xin hỏi về màn hình laptopbởi yname11Ok , thanks bác đã chỉ...
-
Channel: Thiết bị điện tử cá nhân
26-11-2024, 15:06 -
-
bởi nguyendinhvanSau bao năm nghiên cứu cái dtvn. Tôi phát hiện công thức này. Các anh em xem đúng bao nhiêu phần trăm nhé !
Chập thì thay. Cháy thì tháo
Làm thì láo. Báo thì hay
May thì khoe. Rủi thì bỏ
Thành tích nhỏ. Báo thành to
Làm cho có. Báo chi li
Sai cả li. Báo...-
Channel: Tâm tình dân kỹ thuật
26-11-2024, 00:35 -
Comment