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 nhathung1101Thì đây là 4r điên nặng điện mà, nên họ show phần điện thôi. Phần "cốt lõi" có cái tay biên chắc sang Văn Môn rồi....
-
Channel: Điện tử dành cho người mới bắt đầu
30-11-2024, 18:54 -
-
Trả lời cho Chọn dây dẫn cho điện DC?bởi nhathung1101Điện DC đương nhiên là khác với AC rồi. Chỉ cần biết mặt chữ là thấy khác như gà trống với gà mái mà.
Còn về bản chất, AC là dòng điện hoạt động theo tần số. Tần số càng cao thì dây dẫn càng mỏng, nhẹ, vì hiệu ứng...-
Channel: Điện tử dành cho người mới bắt đầu
30-11-2024, 18:46 -
-
Trả lời cho Công thức điện tửbởi nhathung1101Ăn ít => Nói nhiều.
Nói nhiều => Làm ít.
Làm ít => Vợ mắng.
Vợ mắng => Cáu nhiều.
Cáu nhiều => Ngủ ít.
Ngủ ít => Râu nhiều.
Râu nhiều =>...-
Channel: Tâm tình dân kỹ thuật
30-11-2024, 18:39 -
-
Trả lời cho Chọn dây dẫn cho điện DC?bởi mèomướpDạ vài chục mét thì chú tính như vậy được ạ. Chứ chuẩn thì phải tính cả điện trở của toàn bộ chiều dài dây dẫn nhân với dòng điện xem sụt áp có trong khoảng chấp nhận đc hông ạ. Trong mạch điện tử khoảng cách ngắn và mạch...
-
Channel: Điện tử dành cho người mới bắt đầu
30-11-2024, 14:49 -
-
bởi vietroadTheo mình biết thì chọn dây dẫn dựa vào dòng tải. Thường thì tiết diện 1mm2 cho dòng 6A. Nhưng trong các mạch điện tử, như mạch nguồn tổ ong chẳng hạn, dòng đến vài chục Ampe mà đường mạch mỏng dính. Phải chăng điện DC nó khác với...
-
Channel: Điện tử dành cho người mới bắt đầu
30-11-2024, 14:19 -
-
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
29-11-2024, 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 -
Comment