Băm Xung Cho LED Với Chân P0.0
2 tụ 22p hoặc 33p
1 thạch anh 12MHz
1 tụ 10uF
1 trở 10k
1 trở thanh 10k hoặc trở 1k
1 led 5 mm màu tùy ý
1 trở 220k hoặc 100k
nguồn 5v có thể lấy từ nguồn máy tính hoặc sạc điện thoại
Một số chú ý khi băm xung:
Để led sáng mịn và không có cảm giác bị giật thì
Tần số f khi băm xung phải luôn đảm bảo f >= 60Hz
Nếu f = 60Hz ==> T = 1/60Hz = 16ms
Ví dụ: Chia cường độ led ra làm 16 mức thì trong chu kỳ T = 16ms ta chia ra 16 mức khác nhau.
nghĩa là mỗi mức giữ 1ms
- Code viết sau đây sẽ sáng dần và tắt dần LED tại PORT0.0 sử dụng vòng lặp.
Tiến hành. Viết code
Đầu tiên là code bằng C cho 8051
Các bạn xem sơ đồ thuật toán để hiểu chi tiết hơn
Còn đây là Code C:
/*Thach anh su dung f=12Mhz*/
#include "regx52.h"
sbit led = P0^0;
void led_dimmer();
void delay_ms(unsigned char time){
unsigned char temp;
while(time--){
temp = 85;
while(temp--);
temp = 60;
while(temp--);
};
}
void main(){
while(1){
led_dimmer();
}
}
void led_dimmer(){
unsigned char i,j;
for(i=1;i<=16;i++){
j=0;
while(++j<5){ // tong time delay la 16*20 = 320 ms
led = 1;
delay_ms(i);
led = 0;
delay_ms(16-i);
}
}
for(i=1;i<=16;i++){
j=0;
while(++j<5){ // tong time delay la 16*20 = 320 ms
led = 1;
delay_ms(16-i);
led = 0;
delay_ms(i);
}
}
}
Debug:Tính thời gian delay cho đoạn code trên
5: void delay_ms(unsigned char time){
6: unsigned char temp;
7: while(time--){
C:0x0003 AD07 MOV R5,0x07 ;2ckm
C:0x0005 1F DEC R7 ;1ckm
C:0x0006 ED MOV A,R5 ;1ckm
C:0x0007 6012 JZ C:001B ;2ckm
8: temp = 250;
C:0x0009 7EFA MOV R6,#0x55 ; 2ckm
9: while(temp--);
C:0x000B AD06 MOV R5,0x06 ; 2ckm
C:0x000D 1E DEC R6 ;1ckm
C:0x000E ED MOV A,R5 ;1ckm
C:0x000F 70FA JNZ C:000B ;2ckm
10: temp = 62;
C:0x0011 7E3E MOV R6,#0x3C ;2ckm
11: while(temp--);
C:0x0013 AD06 MOV R5,0x06 ;2ckm
C:0x0015 1E DEC R6 ;1ckm
C:0x0016 ED MOV A,R5 ;1ckm
C:0x0017 60EA JZ delay_ms(C:0003) ;2ckm
C:0x0019 80F8 SJMP C:0013 ;2ckm
12: };
Phân tích đoạn code trên thì ta được:
: 6 + 2 + 80*6 + 2 + 60*8 = 1000 (ckm)
==> t = 1000*Tosc (Tosc) tần số thạch anh. Ví dụ thạch anh 12MHz thì t = 1ms
CODE DÙNG ASM:
ORG 0000H
LJMP MAIN
MAIN:
MOV R3,#01
NHAY1:
CLR A
MOV R4,A
NHAY2: INC R4
MOV A,R4
CLR C
SUBB A,#05
JNC NHAY3
SETB P0.0
MOV R7,0X03
CALL DELAY1MS
CLR P0.0
CLR C
MOV A,#16
SUBB A,R3
MOV R7,A
CALL DELAY1MS
SJMP NHAY2
NHAY3: INC R3
CJNE R3,#17,NHAY1
MOV R3,#01
NHAY4: CLR A
MOV R4,A
NHAY5: INC R4
MOV A,R4
CLR C
SUBB A,#05
JNC NHAY6
SETB P0.0
CLR C
MOV A,#16
SUBB A,R3
MOV R7,A
CALL DELAY1MS
CLR P0.0
MOV R7,0X03
CALL DELAY1MS
SJMP NHAY5
NHAY6: INC R3
CJNE R3,#17,NHAY4
LJMP MAIN
DELAY1MS: MOV R5,0X07
DEC R7
MOV A,R5
JZ OFF_TIME
MOV TMOD,#01
MOV TH0,#0FCH
MOV TL0,#018H
SETB TR0
JNB TF0,$
CLR TF0
CLR TR0
SJMP DELAY1MS
OFF_TIME: RET
END
Tính thời gian trễ mình dùng timer0, chế độ 16 bit
cách tính toán các bạn có thể tham khảo thêm tại tài liệu 8051
Mô phỏng trên Proteus
Mạch thực tế
Video: Thực hiện trên Board
Copyright tienhuypro from dientuvietnam.net
Đăng nhận xét