Thông báo

Collapse
No announcement yet.

Xin trợ giúp về điều khiển độ sáng đèn LED bằng phím bấm với code ASM !

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Xin trợ giúp về điều khiển độ sáng đèn LED bằng phím bấm với code ASM !

    Em có bài tập như sau:
    ĐỀ BÀI:
    Điều khiển trạng thái đèn LED với 3 nút bấm. Với các chức năng:
    - Nút ON/OFF để tắt mở LED.
    - Nút UP để tăng độ sáng của LED.
    - Nút DOWN để giảm độ sáng của LED.
    YÊU CẦU:
    - Dùng VĐK AT89C51 để lập trình.
    + Nút ON/OFF nối với P1.0
    + Nút UP nối với P1.1
    + Nút DOWN nối với P1.2
    + LED nối với P2.0
    - Khi cấp nguồn thì LED tắt. Ấn ON/OFF thì Led sáng. Ấn UP thì LED tăng dần độ sáng. Ấn DOWN thì LED giảm dần độ sáng (có thể giảm độ sáng đến mức tắt hẳn), sau đó nếu ấn UP thì LED lại tăng dần độ sáng. Ấn ON/OFF thì LED tăt hẳn (lúc này có ấn UP LED cũng không sáng trở lại).
    Hiện tại em chưa biết phải viết CODE thế nào cả. Thấy mọi người bảo có thể dùng phương pháp điều độ rộng xung để điều khiển nhưng em lại không biết gì về cái này.
    Bác nào có ý tưởng hay thuật toán giải bài này thì cho em xin ý kiến với !

  • #2
    Điều chỉnh độ rộng xung với vài led, thật chất cũng dễ lắm bạn ah.
    Nguyên tắc là như thế này.

    Nếu ta cho led sáng 200 micro giây và tắt trong vòng 1 micro giây
    cho vòng lặp mãi mãi => led sáng nhất
    Nếu ta cho led sáng 1 micro giây và tắt trong vòng 200 micro giây
    cho vòng lặp mãi mãi => led mờ nhất

    => Vậy việc ta cần làm là, tăng giảm thời gian sáng và tắt thôi, sao cho thời gian sáng + thời gian tắt =1 hằng số (để không bị ảnh hưởng gì nhiều tới chương trình).

    Comment


    • #3
      Nguyên văn bởi vu_elec Xem bài viết
      Điều chỉnh độ rộng xung với vài led, thật chất cũng dễ lắm bạn ah.
      Nguyên tắc là như thế này.

      Nếu ta cho led sáng 200 micro giây và tắt trong vòng 1 micro giây
      cho vòng lặp mãi mãi => led sáng nhất
      Nếu ta cho led sáng 1 micro giây và tắt trong vòng 200 micro giây
      cho vòng lặp mãi mãi => led mờ nhất

      => Vậy việc ta cần làm là, tăng giảm thời gian sáng và tắt thôi, sao cho thời gian sáng + thời gian tắt =1 hằng số (để không bị ảnh hưởng gì nhiều tới chương trình).
      Vâng em hiểu ý bác nói rồi.
      Em có ý tưởng dùng Timer 0 để tạo ra một chu kỳ T = 200ms chẳng hạn (trong đó: T = T_on + T_off, T_on là thời gian sáng của LED, T_off là thời gian tắt của LED trong 1 chu kỳ T). Ban đầu em mặc định cho T_on = 60ms => T_off = T - T_on = 140ms => Led sẽ sáng yếu và ta có thể tăng độ sáng cho LED bằng phím bấm UP.
      Nhưng vấn đề em rối nhất là chưa biết lập trình thế nào để khi ấn phím UP thì T_on sẽ tăng lên (giả sử mỗi lần ấn thì T_on tăng thêm 10ms chẳng hạn), T_on tăng cực đại bằng T thì đèn sáng nhất.
      Cũng tương tự như vậy khi ấn phím DOWN thì T_on giảm (mỗi lần ấn giảm 10ms), => T_on nhỏ nhất là = 0 ms => đèn LED tắt.
      Bác biết ý tưởng nào hay hơn hay thuật toán để lập trình cho ý tưởng trên thì cho em xin ý kiến với?

      Comment


      • #4
        Nguyên văn bởi Ck33spkt Xem bài viết
        Vâng em hiểu ý bác nói rồi.
        Em có ý tưởng dùng Timer 0 để tạo ra một chu kỳ T = 200ms chẳng hạn (trong đó: T = T_on + T_off, T_on là thời gian sáng của LED, T_off là thời gian tắt của LED trong 1 chu kỳ T). Ban đầu em mặc định cho T_on = 60ms => T_off = T - T_on = 140ms => Led sẽ sáng yếu và ta có thể tăng độ sáng cho LED bằng phím bấm UP.
        Nhưng vấn đề em rối nhất là chưa biết lập trình thế nào để khi ấn phím UP thì T_on sẽ tăng lên (giả sử mỗi lần ấn thì T_on tăng thêm 10ms chẳng hạn), T_on tăng cực đại bằng T thì đèn sáng nhất.
        Cũng tương tự như vậy khi ấn phím DOWN thì T_on giảm (mỗi lần ấn giảm 10ms), => T_on nhỏ nhất là = 0 ms => đèn LED tắt.
        Bác biết ý tưởng nào hay hơn hay thuật toán để lập trình cho ý tưởng trên thì cho em xin ý kiến với?
        T=200ms => f= 5Hz
        Tần số PWM tối thiểu phải lớn hơn ít nhất là 30Hz mới có khả năng thay đổi độ sáng tối của led.
        Sử dụng ngắt timer để tạo PWM,dùng biến trung gian để nạp cho timer, chương trình chính quản lý kiểm tra phím và tăng giảm biến trung gian.

        Comment


        • #5
          Nguyên văn bởi chung1608 Xem bài viết
          T=200ms => f= 5Hz
          Tần số PWM tối thiểu phải lớn hơn ít nhất là 30Hz mới có khả năng thay đổi độ sáng tối của led.
          Sử dụng ngắt timer để tạo PWM,dùng biến trung gian để nạp cho timer, chương trình chính quản lý kiểm tra phím và tăng giảm biến trung gian.
          Em cám ơn bác đã chỉ giúp.
          Giả sử như bác nói là tần số PWM tối thiểu là 30Hz, vậy bây giờ em cho PWM ở tần số là 50Hz chẳng hạn => T = 20ms. Giả sử ban đầu em mặc đinh T_on = 6ms => T_off = 14ms. Mỗi lần ấn phím UP hoặc DOWN thi T_on tăng hoặc giảm 1ms.
          Về việc tạo T_on, T_off thì không vấn đề gì, nhưng vấn đề em vẫn chưa rõ là mình phải làm thế nào để mỗi lần ấn phím UP hoặc DOWN thì có thể cộng thêm hoặc bớt đi 1ms ở T_on ?
          Bác có thể chỉ rõ giúp em được không?

          Comment


          • #6
            Nguyên văn bởi Ck33spkt Xem bài viết
            Em cám ơn bác đã chỉ giúp.
            Giả sử như bác nói là tần số PWM tối thiểu là 30Hz, vậy bây giờ em cho PWM ở tần số là 50Hz chẳng hạn => T = 20ms. Giả sử ban đầu em mặc đinh T_on = 6ms => T_off = 14ms. Mỗi lần ấn phím UP hoặc DOWN thi T_on tăng hoặc giảm 1ms.
            Về việc tạo T_on, T_off thì không vấn đề gì, nhưng vấn đề em vẫn chưa rõ là mình phải làm thế nào để mỗi lần ấn phím UP hoặc DOWN thì có thể cộng thêm hoặc bớt đi 1ms ở T_on ?
            Bác có thể chỉ rõ giúp em được không?
            cái đó phụ thuộc timer của chú tràn sau bao nhiêu uS. Nếu tràn sau 1mS thì biến trung gian sẽ có giá trị #20, mỗi 1 đơn vị là 1mS. Vấn để còn lại là dùng lệnh ADD hoặc SUBB

            Comment


            • #7
              Nguyên văn bởi chung1608 Xem bài viết
              cái đó phụ thuộc timer của chú tràn sau bao nhiêu uS. Nếu tràn sau 1mS thì biến trung gian sẽ có giá trị #20, mỗi 1 đơn vị là 1mS. Vấn để còn lại là dùng lệnh ADD hoặc SUBB
              Có chỗ này em vẫn chưa rõ: Khi mình dùng timer 0 để tạo thời gian T = 20ms => T là cố định. Và mặc định ban đầu mình cho T_on = 6ms => cũng là cố định. Vậy thì khi mình dùng time 1 để tạo tràn sau mỗi 1ms thì mình làm cách nào có thể can thiệp vào time 0 (tức là thay đổi T_on)khi T_on đã cố định từ khi mình bật nguồn ?

              Comment


              • #8
                Nguyên văn bởi Ck33spkt Xem bài viết
                Có chỗ này em vẫn chưa rõ: Khi mình dùng timer 0 để tạo thời gian T = 20ms => T là cố định. Và mặc định ban đầu mình cho T_on = 6ms => cũng là cố định. Vậy thì khi mình dùng time 1 để tạo tràn sau mỗi 1ms thì mình làm cách nào có thể can thiệp vào time 0 (tức là thay đổi T_on)khi T_on đã cố định từ khi mình bật nguồn ?
                đã nói dùng biến trung gian. Ví dụ:
                Code:
                	MOV	R0,R1
                LOOP:	MOV	TH0,#HIGH(-1000)
                	MOV	TL0,#LOW(-1000)
                	SETB	TR0
                	JNB	TF0,$
                	CLR	TF0
                	DJNZ	R0,LOOP
                T on hoặc T off sẽ phụ thuộc biến trung gian R1. Cần thiết thì sài 2 biến trung gian, 1 cho T_on 1 cho T_off

                Comment


                • #9
                  ok
                  cái này là pwm mà
                  cũng không có gì khó lắm
                  nói chung dùng timer tạo ra thời gian chuẩn
                  dùng biến đếm để lưu xem ton toff là bao nhiêu cho phù hợp
                  chiến thôi

                  Comment


                  • #10
                    Em đã viết xong code theo như ý tưởng của các bác chỉ cho. Nhưng vấn đề em gặp phải là khi mô phỏng bằng Protues thì Led nháy loạn.
                    Em không có điều kiện làm mạch test mà chỉ mô phỏng thôi, bác nào có test board thì test hộ em với, xem code của em sai hay mô phỏng sai mà không điều khiển được LED như ý muốn.
                    Code em viết đây:

                    Code:
                    ;==============================================
                    ; Ten chuong trinh	: DK do sang den LED bang nut bam.
                    ; Nguoi thuc hien	        : Kyle Ray
                    ; Ngay thuc hien   	: 01/05/2012 - 20h18'
                    ; Phien ban		        : 1.0
                    ; Mo ta phan cung	: Dung AT89C51 - thach anh 12MHz
                    ;	: LED noi voi P2
                    ;       : Nut UP		<=> p1.1
                    ;       : Nut DOWN	<=> p1.2
                    ;       : Nut ON/OFF	<=> p1.0
                    ; Yeu cau: 	An ON/OFF DC hoat dong.
                    ; 		An UP LED sang tang dan.
                    ; 		An DOWN LED sang giam dan.
                    ;----------------------------------------------------------------
                    ; Hoan thanh	: 01/05/2012 - 20h48'
                    ; Kiem tra	        : ...
                    ; Nguoi kiem tra	: ...
                    ;----------------------------------------------------------------
                    ; Chu thich		: Bam xung o tan so 500Hz. Mac dinh
                    ;			ban dau xung muc cao (30%) t_on = 600us.
                    ;Sau moi lan an UP hoac DOWN thi t_on tang hoac giam 50us.
                    ;==============================================
                    ;
                    ;-----------------------------------------------
                    ;         DINH NGHIA CAC KY HIEU				;
                    ;-----------------------------------------------
                    LED		data	p2
                    ON_OFF	bit	p1.0
                    UP		bit	p1.1
                    DOWN	bit	p1.2
                    VAR		equ	30h
                    value	equ	-39
                    ;-----------------------------------------------
                    ;-----------------------------------------------
                    org	0h
                    main:						;bat dau chuong trinh
                    	mov	p2,	#0h			;tat LED
                    	mov r1,	#28
                    	mov	VAR,	#12			;nap gia tri t_on ban dau = 6ms
                    	acall	kt_on			        ;goi ct cho phim ON/OFF duoc an
                    t_on:
                    	mov	LED,	#0ffh
                    	jb	UP,	next			;ko an UP => nhay den next
                    	acall	delay_100ms		;goi ct tao tre 100ms de chong rung phim
                    	jnb	UP,	$			;cho nha phim
                    	inc	VAR				;tang bien dem
                    	mov	r0,	VAR
                    	cjne	r0,	#40,	next	        ;VAR<20 => nhay den next
                    	mov	VAR,	#39			;giu khong cho VAR vuot qua 20
                    	acall	delay_50us
                    next:	jb	ON_OFF,	next_1	;ko an ON_OFF => nhay den next_1
                    	acall	delay_100ms
                    	jnb	ON_OFF,	$
                    	sjmp	main
                    next_1:
                    	acall	delay_50us
                    	djnz	VAR,	next
                    ;-----------------------------------------------
                    t_off:
                    	mov LED,	#0h
                    	clr	c				;xoa co nho
                    	mov	a,	#40
                    	subb	a,	VAR			;thoi gian t_off duoc luu vao acc
                    	jnc	next_2			;nhay den next_2 neu khong nho (c=0)
                    	cpl	a				;lay bu 1 acc
                    	inc	a				;tang acc len 1 de tao bu 2
                    next_2:
                    	jb	DOWN,	next_3	;nhay den next_3 neu DOWN ko dc an
                    	acall	delay_100ms
                    	jnb	DOWN,	$
                    	dec	VAR				;giam VAR di 1 dv de T = const = 20ms
                    	inc	a
                    	mov	r1,	a
                    	mov	r0,	VAR
                    	cjne	r0,	#0,	next_3
                    	inc	VAR				;giu cho VAR ko bi am
                    next_3:
                    	jb	ON_OFF,	next_4
                    	acall	delay_100ms
                    	jnb	ON_OFF,	$
                    	sjmp	main
                    next_4:
                    	acall	delay_50us
                    	djnz	r1,	next_3
                    	sjmp	t_on
                    ;-----------------------------------------------
                    ;	CHUONG TRINH CON							;
                    ;-----------------------------------------------
                    kt_on:
                    	jb	ON_OFF,	$		;cho den khi ON_OFF dc bam
                    	acall	delay_100ms
                    	jnb	ON_OFF,	$
                    	ret
                    ;----------------
                    delay_50us:
                    	mov	tmod,	#01h		        ;chon timer 0, che do 16 bits
                    	mov	th0,	#high	value
                    	mov	tl0,	#low	value
                    	setb	tr0
                    	jnb	tf0,	$			;cho o day den khi tran
                    	clr	tr0
                    	clr	tf0
                    	ret
                    ;----------------
                    delay_100ms:
                    	push	5
                    	push	6
                    	push	7
                    	mov	r7,	#100
                    	mov	r6,	#2
                    	mov	r5,	#248
                    	djnz	r5,	$
                    	djnz	r6,	$-4
                    	djnz	r7,	$-8
                    	pop	7
                    	pop	6
                    	pop	5
                    	ret
                    ;-----------------------------------------------
                    ;-----------------------------------------------
                    end
                    P/S: Dưới đây là file mô phỏng dùng phần mềm Protues v7.8
                    Attached Files

                    Comment


                    • #11
                      Bác nào có code PWM viết bằng ASM thì cho em xin về em nghiên cứu với !

                      Comment


                      • #12
                        Nguyên văn bởi Ck33spkt Xem bài viết
                        Em đã viết xong code theo như ý tưởng của các bác chỉ cho. Nhưng vấn đề em gặp phải là khi mô phỏng bằng Protues thì Led nháy loạn.
                        Em không có điều kiện làm mạch test mà chỉ mô phỏng thôi, bác nào có test board thì test hộ em với, xem code của em sai hay mô phỏng sai mà không điều khiển được LED như ý muốn.
                        Code em viết đây:

                        Code:
                        ;==============================================
                        ; Ten chuong trinh	: DK do sang den LED bang nut bam.
                        ; Nguoi thuc hien	        : Kyle Ray
                        ; Ngay thuc hien   	: 01/05/2012 - 20h18'
                        ; Phien ban		        : 1.0
                        ; Mo ta phan cung	: Dung AT89C51 - thach anh 12MHz
                        ;	: LED noi voi P2
                        ;       : Nut UP		<=> p1.1
                        ;       : Nut DOWN	<=> p1.2
                        ;       : Nut ON/OFF	<=> p1.0
                        ; Yeu cau: 	An ON/OFF DC hoat dong.
                        ; 		An UP LED sang tang dan.
                        ; 		An DOWN LED sang giam dan.
                        ;----------------------------------------------------------------
                        ; Hoan thanh	: 01/05/2012 - 20h48'
                        ; Kiem tra	        : ...
                        ; Nguoi kiem tra	: ...
                        ;----------------------------------------------------------------
                        ; Chu thich		: Bam xung o tan so 500Hz. Mac dinh
                        ;			ban dau xung muc cao (30%) t_on = 600us.
                        ;Sau moi lan an UP hoac DOWN thi t_on tang hoac giam 50us.
                        ;==============================================
                        ;
                        ;-----------------------------------------------
                        ;         DINH NGHIA CAC KY HIEU				;
                        ;-----------------------------------------------
                        LED		data	p2
                        ON_OFF	bit	p1.0
                        UP		bit	p1.1
                        DOWN	bit	p1.2
                        VAR		equ	30h
                        value	equ	-39
                        ;-----------------------------------------------
                        ;-----------------------------------------------
                        org	0h
                        main:						;bat dau chuong trinh
                        	mov	p2,	#0h			;tat LED
                        	mov r1,	#28
                        	mov	VAR,	#12			;nap gia tri t_on ban dau = 6ms
                        	acall	kt_on			        ;goi ct cho phim ON/OFF duoc an
                        t_on:
                        	mov	LED,	#0ffh
                        	jb	UP,	next			;ko an UP => nhay den next
                        	acall	delay_100ms		;goi ct tao tre 100ms de chong rung phim
                        	jnb	UP,	$			;cho nha phim
                        	inc	VAR				;tang bien dem
                        	mov	r0,	VAR
                        	cjne	r0,	#40,	next	        ;VAR<20 => nhay den next
                        	mov	VAR,	#39			;giu khong cho VAR vuot qua 20
                        	acall	delay_50us
                        next:	jb	ON_OFF,	next_1	;ko an ON_OFF => nhay den next_1
                        	acall	delay_100ms
                        	jnb	ON_OFF,	$
                        	sjmp	main
                        next_1:
                        	acall	delay_50us
                        	djnz	VAR,	next
                        ;-----------------------------------------------
                        t_off:
                        	mov LED,	#0h
                        	clr	c				;xoa co nho
                        	mov	a,	#40
                        	subb	a,	VAR			;thoi gian t_off duoc luu vao acc
                        	jnc	next_2			;nhay den next_2 neu khong nho (c=0)
                        	cpl	a				;lay bu 1 acc
                        	inc	a				;tang acc len 1 de tao bu 2
                        next_2:
                        	jb	DOWN,	next_3	;nhay den next_3 neu DOWN ko dc an
                        	acall	delay_100ms
                        	jnb	DOWN,	$
                        	dec	VAR				;giam VAR di 1 dv de T = const = 20ms
                        	inc	a
                        	mov	r1,	a
                        	mov	r0,	VAR
                        	cjne	r0,	#0,	next_3
                        	inc	VAR				;giu cho VAR ko bi am
                        next_3:
                        	jb	ON_OFF,	next_4
                        	acall	delay_100ms
                        	jnb	ON_OFF,	$
                        	sjmp	main
                        next_4:
                        	acall	delay_50us
                        	djnz	r1,	next_3
                        	sjmp	t_on
                        ;-----------------------------------------------
                        ;	CHUONG TRINH CON							;
                        ;-----------------------------------------------
                        kt_on:
                        	jb	ON_OFF,	$		;cho den khi ON_OFF dc bam
                        	acall	delay_100ms
                        	jnb	ON_OFF,	$
                        	ret
                        ;----------------
                        delay_50us:
                        	mov	tmod,	#01h		        ;chon timer 0, che do 16 bits
                        	mov	th0,	#high	value
                        	mov	tl0,	#low	value
                        	setb	tr0
                        	jnb	tf0,	$			;cho o day den khi tran
                        	clr	tr0
                        	clr	tf0
                        	ret
                        ;----------------
                        delay_100ms:
                        	push	5
                        	push	6
                        	push	7
                        	mov	r7,	#100
                        	mov	r6,	#2
                        	mov	r5,	#248
                        	djnz	r5,	$
                        	djnz	r6,	$-4
                        	djnz	r7,	$-8
                        	pop	7
                        	pop	6
                        	pop	5
                        	ret
                        ;-----------------------------------------------
                        ;-----------------------------------------------
                        end
                        P/S: Dưới đây là file mô phỏng dùng phần mềm Protues v7.8
                        Đã test chương trình của bạn nhưng up down ko tác dụng,chỉ nháy nháy thôi chứ ko tăng giảm gì cả,on/off thì ok
                        ĐT: 0972 20 58 68
                        Gmail:

                        Comment


                        • #13
                          Nguyên văn bởi hoangnam555 Xem bài viết
                          Đã test chương trình của bạn nhưng up down ko tác dụng,chỉ nháy nháy thôi chứ ko tăng giảm gì cả,on/off thì ok
                          Đây là code mình mới viết để mọi người trợ giúp nên chưa hoàn thiện, nó chỉ mới thể hiện ý tưởng của việc làm thôi. Giờ máy tính mình đang bị bad ổ cứng, phải mượn máy bạn. Đợi khi nào sửa xong mình sẽ up code đầy đủ lên cho bạn và mọi người tham khảo!

                          Comment


                          • #14
                            Chào anh,em cũng mới bắt đầu học về thiết kế mạch và gặp một bài tập giống như của anh.anh có thể cho em xin code và sơ đồ mạch nguyên lý được không ạ? Nếu được thì anh gửi vào mail chutrieudung@gmail.com giúp em với nhé.Thanks

                            Comment


                            • #15
                              Chào anh,em cũng mới bắt đầu học về thiết kế mạch và gặp một bài tập giống như của anh.anh có thể cho em xin code và sơ đồ mạch nguyên lý được không ạ? Nếu được thì anh gửi vào mail chutrieudung@gmail.com giúp em với nhé.Thanks

                              Comment

                              Về tác giả

                              Collapse

                              Ck33spkt Tìm hiểu thêm về Ck33spkt

                              Bài viết mới nhất

                              Collapse

                              Đang tải...
                              X