code asm đâu///???
Thông báo
Collapse
No announcement yet.
[TUT] Lý thuyết về code LED sao băng bằng ASM và KeilC cho 8051
Collapse
This is a sticky topic.
X
X
-
các bạn tham khảo sao băng này nhé. chân sao băng là ở cổng P0.
và file hex saobangP0 - Download - 4shared
chú ý đầu ra tích cực là mức 1 nhé.chỉ có tâm hồn là nơi duy nhất: có thể biến thiên đường thành địa ngục và ngược lại có thể biến địa ngục hóa thiên đường
Everything should be made as simple as possible, but not simpler
Comment
-
code asm thì ae phải chờ bạn tienhuypro và các bạn khác . mình thấy pác chung1608,hoangnam555..... quen viết asm, nhờ pác ấy viết ổn đấychỉ có tâm hồn là nơi duy nhất: có thể biến thiên đường thành địa ngục và ngược lại có thể biến địa ngục hóa thiên đường
Everything should be made as simple as possible, but not simpler
Comment
-
code hay lắm, bạn huypro viết tiếp pwm kiểu 32 led sao băng đi.
mình ko biết cái timer sử dụng như thế nào nhưng mình nghĩ chắc dùng vòng lặp while và delay để ngắt.
while(i<=32)//số chân các port = 32
{
if (i>=25) { số chân port 0 sáng}
if (i>=17)&&(i<=24) { số chân port 2 sáng}
if (i>=9)&&(i<=16) { số chân port 3 sáng}
if (i>=1)&&(i<=8) { số chân port 1 sáng}
delay_ms(thời gian);
tăng biến i;
i++
}
Comment
-
Cho em hỏi sao trong chuơng trình ngắt của a chỉ có giá trị nạp lại cho TH và TL mà ko có thao tắc xóa cờ tràn??Nguyên văn bởi tienhuypro Xem bài viếtPhần 3:
- Phần này mình sẽ xây dựng:
a. Code PWM cho 1 LED bởi ngắt timer 8051
b. Code PWM cho 1 module LED RGB chuyển màu full color
a. Phần này sẽ gồm 3 phần:
- Khởi tạo ngắt timer0 cho 89S52;
- Code PWM trên timer1;
- Code thay đổi PWM trong hàm main();
Để khởi tạo ngắt timer0 hoặc timer1 trong 89S52 các bạn tham khảo thanh ghi TMOD và IE trong datasheet nha:
- Mình khởi tạo timer1 ở mode1 là bộ đếm 16bit: nghĩa là khi thanh ghi TH1 và TL1 chuyển từ FFFF --> 0000 thì sẽ xảy ra ngắt timer1;
- Để cho phép ngắt timer1 thì phải enable bit EA và bit ET1 trong thanh ghi IE
- Đây là code để khởi tạo ngắt timer1 chế độ 16bit
* Mình giải thích vì sao TH1=0xFE, TL1=0xB3;Code:TMOD=0x10; /*timer 1 16bit*/ TR1=1; TH1=0xFE; TL1=0xB3; IE=0x88; /*Ket thuc khoi dong timer1*/
Như mình đã nói: 1. Muốn LED sáng mịn thì tần số PWM phải đảm bảo >=60Hz, 2. Độ phân giải cường độ sáng của LED là bao nhiêu.
Vì đợt này mình thực hiện PWM trên ngắt timer nên mình sẽ tạo độ phân giải là 100 mức sáng khác nhau.
Ta dùng thạch anh là 24Mhz --> 1 chu kỳ máy = 1/(24/12) = 0.5us --> F= 2000000Hz --> nếu TH1=0xFF và TL1=0xFF thì tần số ngắt timer1 là F=2000000Hz. Vậy để tần số PWM LED là 60Hz và độ phân giải là 100 mức sáng khác nhau thì giá trị nạp vào TH1 và TL1 được tính như sau:
TH1TL1 = -(2000000/60/100) ~= -333(DEC) = 0xFEB3(HEX) hay TH1=0xFE, TL1=0xB3
- Đây là code PWM trên ngắt timer1 cho 1 LED tại chân P0.0
* Giải thích hàm delay_ms(uchar time) :Code:/*Thach anh su dung f=24Mhz*/ #include "regx52.h" typedef unsigned char uchar; typedef unsigned int uint; sbit led = P0^0; uchar num_pwm; uchar pwm_c; uchar delay_in_t1; void isr_timer1() interrupt 3 using 2{ TH1=0xFE; /* -24000000/12/60/100 ~= -333 ->0xfeb3 (100 nghia la 100 muc sang)*/ TL1=0xB3; /* chu ky ngat timer1 T=(333/2)us --> T*6 = 999 us ~= 1ms*/ led =(pwm_c>num_pwm)?1:0; if(++num_pwm==100){ num_pwm=0; } ++delay_in_t1; } void delay_ms(uchar time){ delay_in_t1 = 0; while(delay_in_t1 <= time*6); } void led_dim_ti(); void main(){ TMOD=0x10; /*timer 1 16bit*/ TR1=1; TH1=0xFE; TL1=0xB3; IE=0x88; /*Ket thuc khoi dong timer1*/ while(1){ led_dim_ti(); } } void led_dim_ti(){ uchar i; P0 = 0; while(1){ for(i=0;i<=100;i++){ pwm_c = i; num_pwm = 0; delay_ms(16); } for(i=0;i<=100;i++){ pwm_c = 100-i; num_pwm = 0; delay_ms(16); } } }
- Vì khi sử dụng ngắt timer1 với TH1TL1 =0xFEB3(-333) có nghĩa là cứ 333 chu kỳ máy là xảy ra 1 lần ngắt trên timer1, vì thạch anh 24Mhz nên mỗi chu kỳ máy tốn 0.5us --> 333 ckm sẽ tốn 333*0.5 us --> nếu xảy ra 6 lần ngắt timer1 thì T = 333*0.5*6 = 999 us ~=1ms. Chính vì thế mà hàm delay_ms(uchar time) được xây dựng như sau:
- Còn hàm led_dim_ti() các bạn tự hiểu nha.Code:void delay_ms(uchar time){ delay_in_t1 = 0; while(delay_in_t1 <= time*6); // time*6 = 1ms }
Vì độ sáng được chia làm 100 mức nên PWM bằng ngắt timer sẽ mịn hơn khi delay với vòng lặp ở phần 2. Các bạn có thể xem video sau đây
Hoặc chạy mô phỏng trên flie proteus Led Dimmer kèm theo ở phần 2 rất giống thực tế.
[ATTACH=CONFIG]54911[/ATTACH][ATTACH=CONFIG]54914[/ATTACH]
Sơ đồ kết nối phần cứng cho video này tương tự như phần 2 nha các bạn.
b. Phần này tương tự phần (a) nhưng mình chỉ viết thêm hàm dimmer_GRB() để thay đổi độ sáng từng LED đỏ, xanh lá và xanh dương để phối ra được các màu khác nhau.
******Giờ chúc các bạn ngủ ngon, ai xem đá banh cuối tuần thì xem cho đã còn mình phải ngủ thôi vì mai dậy sớm có cv rùi. Mình sẽ sớm viết tiếp các phần còn lại cho các bạn. bibi*******
File Code C
Cái nữa là nếu khi xảy ra ngắt bác ko cấm timer hoạt động TR0=0 thì trong khi nó xử lý ngắt timer của bác vẫn đếm, như vậy liệu có vấn đề gì ko ạ?Nguyễn Huy Biên - 01649 802 694
gmail :
Comment
-
hàm trả về giá trị T or F. nếu pwm_c[0] > num_pwm mà đúng thì c1 =1 còn lại c1=0Nguyên văn bởi manhcan94 Xem bài viếtAnh Huy giải thích ro giúp e cái này vs. e không hiểu lắm
c1=(pwm_c[0]>num_pwm)?1:0;Nguyễn Huy Biên - 01649 802 694
gmail :
Comment
-
vẫn trong chương trình nếu không muốn ngắt timer nữa thì phải cho EA=0 àh.
hay là TR =0;
khi nào dùng thì lại cho =1, có đúng ko vậy?
Híc, mình đặt trở ở giữa chân IC với led có được ko vậy các bạn.
Port Px.y ---- trở ------(-) chân led (+)----- Vcc
như thế có tạo ra pwm được ko.
Comment
-
khi xảy ra ngắt timer mặc định phần cứng của 89 sẽ tự xóa cờ tràn ko cần phần mềm phải xóa. Ko nhất thiết phải xóa TR0 vì thời gian timer đếm là thời gian chết, chương trình có thể chạy trình phục vụ ngắt timer0 trong lúc timer0 đếm miễn là ko ảnh hưởng tới lần tràn tiếp theo.Nguyên văn bởi bienhou Xem bài viếtCho em hỏi sao trong chuơng trình ngắt của a chỉ có giá trị nạp lại cho TH và TL mà ko có thao tắc xóa cờ tràn??
Cái nữa là nếu khi xảy ra ngắt bác ko cấm timer hoạt động TR0=0 thì trong khi nó xử lý ngắt timer của bác vẫn đếm, như vậy liệu có vấn đề gì ko ạ?
Comment
-
trong khi nó phục vụ ngắt thì timer vẫn đếm đúng ko ạ? như vậy nếu ctrinh ngắt mà chiếm nhiều thời gian thì có phải là sai rồi ko ạNguyên văn bởi chung1608 Xem bài viếtkhi xảy ra ngắt timer mặc định phần cứng của 89 sẽ tự xóa cờ tràn ko cần phần mềm phải xóa. Ko nhất thiết phải xóa TR0 vì thời gian timer đếm là thời gian chết, chương trình có thể chạy trình phục vụ ngắt timer0 trong lúc timer0 đếm miễn là ko ảnh hưởng tới lần tràn tiếp theo.Nguyễn Huy Biên - 01649 802 694
gmail :
Comment
-
mình có đoạn code sao băng 8 kênh viết bằng Keil C các bạn xem có gì trao đổi nhé
#include<regx52.h>
sbit w1=P1^0;
sbit w2=P1^1;
sbit w3=P1^2;
sbit w4=P1^3;
sbit w5=P1^4;
sbit w6=P1^5;
sbit w7=P1^6;
sbit w8=P1^7;
// khai báo mảng cố định . mạng này là tài nguyên để tạo sao băng
unsigned char code a[8][24]=
{
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0}
};
void delayus()
{ // ham tao thoi gian tre co uS
unsigned char a,n;
for(n=0;n<10;n++)
{
a=0;
}
}
void saobang8() // ham tao sao bang
{
int n,k,h;
for(k=0;k<17;k++) // dich chuyen 1 lan thi sao bang dich 1 lan
{
for(n=1;n<15;n++) // lap lai 15 lan de hien thi
{
for(h=0;h<8;h++)
{ P1=0;
w1=a[h][k];w2=a[h][k+1];w3=a[h][k+2];w4=a[h][k+3];
w5=a[h][k+4];w6=a[h][k+5];w7=a[h][k+6];w8=a[h][k+7];
delayus();
}
}
}
}
main()
{
for( ; ; )
{
saobang8(); // gọi chương trình tạo sao băng ra dùng
}
}chỉ có tâm hồn là nơi duy nhất: có thể biến thiên đường thành địa ngục và ngược lại có thể biến địa ngục hóa thiên đường
Everything should be made as simple as possible, but not simpler
Comment
Bài viết mới nhất
Collapse
-
bởi hayarNăm 2026 việc chọn laptop gaming chủ yếu vẫn là cân bằng vì giá cả và phần cứng thay đổi liên tục, nên tập trung vào GPU ổn, tản nhiệt tốt và hiệu năng thực tế sẽ quan trọng hơn việc chạy theo cấu hình cao nhất, giống như trong nulls brawl, chơi hay hơn khi biết cách tối ưu và chọn chiến...
-
Channel: Đánh giá sản phẩm DTVN
hôm nay, 21:23 -
-
bởi theidiotcatDưới đây là một số gợi ý để các bạn sinh viên chọn được chiếc laptop phù hợp với nhu cầu, ngân sách và ngành học trong bối cảnh giá linh kiện leo thang kéo theo mức giá laptop liên tục tăng cao.
Bước vào mùa tựu trường năm...-
Channel: Đánh giá sản phẩm DTVN
Hôm qua, 11:26 -
-
bởi theidiotcatAMD Ryzen 9 9950X bước sang năm 2026 vẫn là một trong những bộ vi xử lý desktop mạnh mẽ nhất dành cho người dùng phổ thông cao cấp. Dù đã ra mắt từ thế hệ Zen 5 đầu tiên của dòng Ryzen 9000, con chip 16 nhân 32 luồng này vẫn giữ được sức...
-
Channel: Đánh giá sản phẩm DTVN
29-06-2026, 13:58 -
-
bởi theidiotcatTrong thị trường CPU năm 2026, khi các dòng vi xử lý đời mới liên tục ra mắt với những thông số kỹ thuật hào nhoáng, AMD Ryzen 5 7600X vẫn là một cái tên khiến nhiều game thủ và người dùng phổ thông phải cân nhắc kỹ lưỡng. Sau gần hai...
-
Channel: Đánh giá sản phẩm DTVN
29-06-2026, 13:42 -
-
bởi theidiotcatTrong bối cảnh giá linh kiện tăng cao, hiện tại mức giá laptop đã tăng đáng kể so với thời điểm trước cơn sốt AI. Chính vì vậy để lựa chọn được một chiếc laptop đáp ứng tốt nhu cầu vừa học vừa giải trí các bạn sinh viên cần...
-
Channel: Đánh giá sản phẩm DTVN
29-06-2026, 13:33 -
-
bởi theidiotcatViệc lựa chọn một chiếc laptop gaming phù hợp với nhu cầu, ngân sách chưa bao giờ là dễ dàng. Và điều đó càng khó hơn trong năm 2026 khi mà mức giá liên tục tăng.
Nếu bạn chưa biết nên chọn một chiếc laptop gaming như thế nào...-
Channel: Đánh giá sản phẩm DTVN
26-06-2026, 10:29 -
-
bởi theidiotcatVới mức ngân sách 20 - 30 triệu đồng trong năm 2026, các bạn sinh viên và dân văn phòng có thể tìm thấy nhiều lựa chọn cao cấp, mạnh mẽ, pin “trâu”, đặc biệt là các mẫu laptop AI hỗ trợ cho học tập và làm việc.
Trong phân...-
Channel: Đánh giá sản phẩm DTVN
26-06-2026, 10:25 -
-
bởi theidiotcatDưới đây là một số mẫu laptop nổi bật trong phân khúc dưới 20 triệu giúp các bạn văn phòng, sinh viên và đặc biệt là tân sinh viên có thể dễ dàng lựa chọn được mẫu laptop phù hợp với nhu cầu và ngân sách của mình.
Thị...-
Channel: Đánh giá sản phẩm DTVN
26-06-2026, 10:07 -
-
bởi theidiotcatViệc chọn mua một bộ máy tính phục vụ cho các nhu cầu làm việc văn phòng và sử dụng cơ bản hàng ngày đang trở nên dễ dàng và tiết kiệm hơn bao giờ hết. Thay vì phải đau đầu trích ngân sách để mua cả vi xử lý lẫn card đồ họa rời...
-
Channel: Đánh giá sản phẩm DTVN
25-06-2026, 11:23 -

...
Comment