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
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • [TUT] Lý thuyết về code LED sao băng bằng ASM và KeilC cho 8051

    Thân chào tất cả các bạn!
    Hôm nay mình sẽ chỉ cho các bạn tất tần tật từ lý thuyết đến làm 1 mạch LED sao băng 32 cổng bằng vi điều khiển 8051.
    Nội dung mình viết sẽ gồm các phần sau:
    1. Lý thuyết căn bản về PWM ( Pulse - Width - Modulation) hay còn gọi là điều chế độ rộng xung;
    2. Code PWM = ASM và C đơn giản bằng vòng lặp, hình ảnh chạy thực tế và xem độ rộng xung trên proteus;
    3. Code PWM = ASM và C trên ngắt timer của 8051, hình ảnh chạy thực tế và xem độ rộng xung trên proteus;
    4. Code mẫu PWM = ASM và C 32 cổng bằng ngắt timer của 8051, hình ảnh chạy thực tế và xem độ rộng xung trên proteus.

    Phần 1:
    -Phần lý thuyết PWM thì có rất nhiều tài liệu trên mạng nhưng mình tóm tắt lại là: cùng 1 tần số F hay chu kỳ T không đổi nhưng khác nhau về độ rộng của sườn dương hoặc sườn âm thì điện áp trung bình trên tải sẽ khác nhau --> dòng trung bình chảy qua tải cũng sẽ thay đổi (cụ thể là dòng chảy qua LED thay đổi nên độ sáng LED cũng thay đổi theo).
    *Ví dụ: trong chu kỳ T=1/60(s) nếu T(+)=0.5T(s) và T(-)=0.5T(s) thì điện áp trung bình = U1(V). Nếu T(+)=0.1T(s) và T(-)=0.9T(s) thì điện áp trung bình = U2(V). Ta sẽ có U1>U2 --> I1>I2 nên cường độ sáng LED1 > LED2.
    - Gửi các bạn link hay về PWM: Nguyên tắc điều chế PWM - Pulse - Width-Modulation - Hội Quán Điện Tử - Hội Quán Điện Tử
    Last edited by tienhuypro; 31-10-2012, 13:38.

    Email:
    Tel: 0983.497.310

  • #2
    Phần 2 [TUT]

    Phần 2:
    - Phần này chúng ta sẽ viết code PWM để thay đổi độ sáng của 1 led.
    - Để thực tế và nhanh khi thực hành thì mình sẽ cắm mạch trên test bo: nguyên liệu cần là 1-89S52, 2-LED đỏ, 3-trở 220 Ôm, 4-thạch anh 24Mhz, 5-2 tụ 22pF, 6-tụ 104(0.1uF), 7-nguồn 5V(có thể lấy từ nguồn USB)
    - Như đã nói là code sẽ được thực hiện trên cả ASM và C nhưng để nhanh mình sẽ viết C trước, còn code ASM mình sẽ đóng gói thành File gửi các bạn sau nha.
    - Đầu tiên mình sẽ xây dựng hàm delay_ms(unsigned char time) trong Keil C
    Code
    Code:
    void delay_ms(unsigned char time){
    	unsigned char temp;
    	while(time--){
    		temp = 250;
    		while(temp--); 
    		temp = 62;
    		while(temp--); 
    	};
    }
    Giải thích: Mình dùng thạch anh là 24Mhz nên thời gian chu kỳ máy là 1/(24/12) =1/2 (us)--> muốn delay 1s thì cần 2*10^6 chu kỳ máy --> delay 1ms cần 2000 chu kỳ máy
    - Chúng ta chạy debug hàm delay_ms(unsigned char time) trong ASM thì được như sau
    Code:
         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,#0xFA   ; 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,#0x3E    ;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 hàm delay_ms(1) thành ASM thì tốn số chu kỳ máy là: 6 + 2 + 250*6 + 2 + 62*8 = 2004 (ckm)
    Vậy là OK rồi từ nay các bạn muốn delay số ms thì dùng hàm này nhé, các bạn có thể kiểm chứng trên Proteus thử nha.
    Ví dụ: delay 100ms thì gọi hàm delay_ms(100);
    Hình mô phỏng:
    Click image for larger version

Name:	Hinh xung 100ms.jpg
Views:	1
Size:	119.0 KB
ID:	1368963
    Bây giờ ta vào hàm main() để viết vòng lặp PWM cho LED nha:
    - Có 1 chú ý khi PWM cho LED là : tần số F luôn đảm bảo >=60 Hz thì LED sáng mịn và không có cảm giác bị giật
    Nếu f=60Hz --> T = 1/60 ~= 16ms.
    - Một điều chú ý nữa là cường độ sáng cua LED bạn muốn bao nhiêu mức.
    Ví dụ: Muốn có độ phân giải là 16 mức sáng khác nhau cho LED thì trong chu kỳ T=16ms ta chia ra 16 mức. Nghĩa là mỗi mức giữ 1ms ở sường dương hoặc sườn âm tùy vào thiết kế mạch kích LED.
    - Code mình 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.
    Code:
    /*Thach anh su dung f=24Mhz*/
    #include "regx52.h"
    sbit led = P0^0;
    
    void led_dimmer();
    
    void delay_ms(unsigned char time){
    	unsigned char temp;
    	while(time--){
    		temp = 250;
    		while(temp--); 
    		temp = 62;
    		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*5 = 80 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*5 = 80ms
    			led = 1;
    			delay_ms(16-i);	
    			led = 0;
    			delay_ms(i);
    		}		
    	}
    }
    Đây là hình mô phỏng chạy trên proteus.
    Click image for larger version

Name:	Hinh1.jpg
Views:	1
Size:	116.3 KB
ID:	1368962
    Sơ đồ mạch thật tế cắm trên test board
    Click image for larger version

Name:	Mach dimmer 1c thuc te.jpg
Views:	1
Size:	103.8 KB
ID:	1368979
    Video chạy trên test board

    Phần 3 mai mình sẽ viết tiếp, Các bạn có ý kiến gì thì đóng góp nha. Còn bài viết của mình nếu có ý nghĩa với bạn thì THANKS cho mình cái để tối ngủ khỏi gặp ác quỷ (vì mới đi halloween)
    Last edited by tienhuypro; 31-10-2012, 21:54. Lý do: Upload video và code mới

    Email:
    Tel: 0983.497.310

    Comment


    • #3
      Oh, hay quá, tiếp đi bạn
      - Mạch nạp vdk 8051, AVR, PIC, EEPROM
      - Linh kiện điện tử cho sinh viên


      Comment


      • #4
        anh Huy dạo này rảnh rỗi ghê ta

        Comment


        • #5
          Nguyên văn bởi chjpchjp1991
          Không thấy bạn Huy update tiếp nhỉ
          Hj! sorry các bạn vì hôm qua có cv bận quá nên không viết tiếp đươc. Có gì tối nay mình sẽ chỉ cho các bạn PWM trên timer và demo led GRB cho bạn nào thích full color luôn.

          Email:
          Tel: 0983.497.310

          Comment


          • #6
            xóa code bằng ASM rùi hả bạn

            Comment


            • #7
              Nguyên văn bởi longdtskn Xem bài viết
              xóa code bằng ASM rùi hả bạn
              Như mình đã nói ở đầu tiên, mình sẽ xây dựng luôn code bằng ASM nhưng khi nào mình hoàn thành phần code C đã nha bạn.

              Email:
              Tel: 0983.497.310

              Comment


              • #8
                Phần 3 [TUT]

                Phầ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
                Code:
                	TMOD=0x10; /*timer 1 16bit*/
                	TR1=1;
                	TH1=0xFE;
                	TL1=0xB3;
                	IE=0x88;  /*Ket thuc khoi dong timer1*/
                * Mình giải thích vì sao TH1=0xFE, TL1=0xB3;
                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
                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);
                		}
                	}	
                }
                * Giải thích hàm delay_ms(uchar time) :
                - 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:
                Code:
                void delay_ms(uchar time){	
                	delay_in_t1 = 0;
                	while(delay_in_t1 <= time*6);	// time*6 = 1ms
                }
                - Còn hàm led_dim_ti() các bạn tự hiểu nha.
                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ế.
                Click image for larger version

Name:	Dimmer ngat timer1.jpg
Views:	1
Size:	109.6 KB
ID:	1369121Click image for larger version

Name:	Dimmer ngat timer1.1.jpg
Views:	1
Size:	109.9 KB
ID:	1369122
                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
                Last edited by tienhuypro; 04-11-2012, 00:50.

                Email:
                Tel: 0983.497.310

                Comment


                • #9
                  Mạch nạp ISP 89S51,89S52...

                  Nguyên văn bởi chjpchjp1991
                  Bạn Huy dùng mạch nap ISP ak..bạn dùng mạch tự làm hay mua thế..^^
                  Mình dùng mạch ISP mua của tme.vn. Lúc trước khi thiết kế mạch hay đưa cái mạch nạp vào mạch chính luôn vì giá nó rẻ. Bạn có thể tham khảo sơ đồ mạch và firmware của nó nè.
                  Click image for larger version

Name:	ISP89S_sch.GIF
Views:	3
Size:	23.4 KB
ID:	1369118
                  Bạn có thể thay cổng COM bằng IC USB-Serial PL2303 để kết nối và lấy nguồn 5V trực tiếp từ USB.
                  Click image for larger version

Name:	pl2303.JPG
Views:	1
Size:	35.5 KB
ID:	1369123
                  File Hex và chương trình nạp kèm theo luôn nè.
                  *Lưu ý: Tụ reset nên chọn 102 thì mới nạp được OK
                  Last edited by tienhuypro; 04-11-2012, 00:54.

                  Email:
                  Tel: 0983.497.310

                  Comment


                  • #10
                    Nguyên văn bởi chjpchjp1991
                    Thanks Huy nhé..Huy biết lập trình mấy phần mềm đơn giản hỗ trợ cho ngành điện tử như này không[ATTACH=CONFIG]54952[/ATTACH] Huy biết chỉ tớ với nhé..dùng công cụ gì?Tớ biết lập trình C++ cậu ak...nghe bảo dùng VB nhưng làm sao để ra được PM hay hay như thế nhỉ.
                    Bạn có thể mở một chủ đề mới để hỏi đi. MÌnh đang viết TUT led sao băng nên nếu bạn có hỏi gì về cái nì thì mình sẽ chỉ cho bạn những gì mà mình biết. Thanks bạn!

                    Email:
                    Tel: 0983.497.310

                    Comment


                    • #11
                      Tiếp [TUT] phần 3: LED RGB dimmer

                      Phần 3b:
                      - Phần này mình dùng 1 module LED RGB .
                      - Phần cứng thì PORT0.0 - LED ĐỎ, PORT0.1 - LED XANH LÁ, PORT0.2 - LED XANH DƯƠNG
                      - Code thì tương tự phần 3a, mình chỉ viết thêm hàm PWM kết hợp các cổng LED RGB lại để điều chỉnh độ sáng từng LED --> cho ra màu tương ứng.
                      Code:
                      /*Thach anh su dung f=24Mhz*/
                      #include "regx52.h"
                      
                      typedef unsigned char uchar;
                      typedef unsigned int  uint;
                      
                      sbit led_r = P0^0;
                      sbit led_g = P0^1;	
                      sbit led_b = P0^2;											
                      
                      uchar num_pwm;
                      uchar pwm_r,pwm_g,pwm_b;
                      uint 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_r =(pwm_r>num_pwm)?1:0;
                      	led_g =(pwm_g>num_pwm)?1:0;
                      	led_b =(pwm_b>num_pwm)?1:0;
                      
                      	if(++num_pwm==100){			
                      		num_pwm=0;
                      	}
                      	++delay_in_t1; 
                      }
                      void delay_ms(uint time){	
                      	delay_in_t1 = 0;
                      	while(delay_in_t1 <= time*6);	
                      }
                      	
                      void led_dim_rgb(uchar red, uchar green, uchar blue);
                      void full_color1(void);
                      void full_color2(void);
                      
                      
                      void main(){
                      	TMOD=0x10; /*timer 1 16bit*/
                      	TR1=1;
                      	TH1=0xFE;
                      	TL1=0xB3;
                      	IE=0x88;  /*Ket thuc khoi dong timer1*/
                      	
                      	P0 = 0;
                      	delay_ms(3000);	
                      	full_color1();
                      	while(1){
                      		 full_color2();
                      	}
                      }
                      
                      void led_dim_rgb(uchar red, uchar green, uchar blue){
                      	pwm_r = 	red;
                      	pwm_g = 	green;
                      	pwm_b = 	blue;
                      }
                      
                      void full_color2(void){
                      	uchar i;	
                      	//0,0,1
                      	for(i=0;i<=100;i++){
                      		led_dim_rgb(i,0,0);	
                      		num_pwm = 0;
                      		delay_ms(16);
                      	}
                      	//0,1,0
                      	for(i=0;i<=100;i++){
                      		led_dim_rgb(100-i,i,0);	
                      		num_pwm = 0;
                      		delay_ms(16);
                      	}
                      	//0,1,1
                      	for(i=0;i<=100;i++){
                      		led_dim_rgb(i,100,0);	
                      		num_pwm = 0;
                      		delay_ms(16);
                      	}
                      	//1,0,0
                      	for(i=0;i<=100;i++){
                      		led_dim_rgb(100-i,100-i,i);	
                      		num_pwm = 0;
                      		delay_ms(16);
                      	}
                      	//1,0,1
                      	for(i=0;i<=100;i++){
                      		led_dim_rgb(i,0,100);	
                      		num_pwm = 0;
                      		delay_ms(16);
                      	}
                      	//1,1,0
                      	for(i=0;i<=100;i++){
                      		led_dim_rgb(100-i,i,100);	
                      		num_pwm = 0;
                      		delay_ms(16);
                      	}	
                      	//1,1,1
                      	for(i=0;i<=100;i++){
                      		led_dim_rgb(i,100,100);	
                      		num_pwm = 0;
                      		delay_ms(16);
                      	}
                      	//0,0,0
                      	for(i=0;i<=100;i++){
                      		led_dim_rgb(100-i,100-i,100-i);	
                      		num_pwm = 0;
                      		delay_ms(16);
                      	}
                      }
                      
                      void full_color1(void){
                      	uchar i;	
                      	//pwm led do
                      	for(i=0;i<=100;i++){
                      		led_dim_rgb(i,0,0);	
                      		num_pwm = 0;
                      		delay_ms(16);
                      	}
                      	for(i=0;i<=100;i++){
                      		led_dim_rgb(100-i,0,0);	
                      		num_pwm = 0;
                      		delay_ms(16);
                      	}
                      
                      	//pwm led xanh la
                      	for(i=0;i<=100;i++){
                      		led_dim_rgb(0,i,0);	
                      		num_pwm = 0;
                      		delay_ms(16);
                      	}
                      	for(i=0;i<=100;i++){
                      		led_dim_rgb(0,100-i,0);	
                      		num_pwm = 0;
                      		delay_ms(16);
                      	}
                      
                      	//pwm led xanh duong
                      	for(i=0;i<=100;i++){
                      		led_dim_rgb(0,0,i);	
                      		num_pwm = 0;
                      		delay_ms(16);
                      	}
                      	for(i=0;i<=100;i++){
                      		led_dim_rgb(0,0,100-i);	
                      		num_pwm = 0;
                      		delay_ms(16);
                      	}
                      
                      	//pwm led do + xanh la
                      	for(i=0;i<=100;i++){
                      		led_dim_rgb(i,i,0);	
                      		num_pwm = 0;
                      		delay_ms(16);
                      	}
                      	for(i=0;i<=100;i++){
                      		led_dim_rgb(100-i,100-i,0);	
                      		num_pwm = 0;
                      		delay_ms(16);
                      	}
                      
                      	//pwm led do + xanh duong
                      	for(i=0;i<=100;i++){
                      		led_dim_rgb(i,0,i);	
                      		num_pwm = 0;
                      		delay_ms(16);
                      	}
                      	for(i=0;i<=100;i++){
                      		led_dim_rgb(100-i,0,100-i);	
                      		num_pwm = 0;
                      		delay_ms(16);
                      	}
                      
                      	//pwm led xanh la	+ xanh duong
                      	for(i=0;i<=100;i++){
                      		led_dim_rgb(0,i,i);	
                      		num_pwm = 0;
                      		delay_ms(16);
                      	}
                      	for(i=0;i<=100;i++){
                      		led_dim_rgb(0,100-i,100-i);	
                      		num_pwm = 0;
                      		delay_ms(16);
                      	}
                      }
                      Mạch kết nối phần cứng:
                      Click image for larger version

Name:	Led GRB dimmer.jpg
Views:	1
Size:	107.4 KB
ID:	1369160
                      Video demo thực tế:

                      Code file kem theo:
                      Last edited by tienhuypro; 04-11-2012, 20:43.

                      Email:
                      Tel: 0983.497.310

                      Comment


                      • #12
                        Nguyên văn bởi chjpchjp1991
                        Huy thử băm xung qua 595 được không...^^ có vẽ khó..Tớ xem video..led RGB của cậu trông lại quá..cậu chế hay là mua vậy Huy.Mình chưa thấy kiểu mắc phần cứng led như bạn bao giờ..có phải là lấy tín hiệu của led đâu..lạ quá..hic
                        Hj chjpchip!
                        Led RGB này là module mà, cậu ghé chợ Nhật Tảo người ta bán quá trời. Phần cứng LED mắc thế cho 8051 là chuẩn rồi nếu cậu không tin thì ráp thử đi. Còn vì sao mình ráp thế thì cậu phải xem lại phần cứng PORT I/O của 8051 nha (Hjhj).
                        - Bạn muốn băm xung qua 595 thì cũng thế thôi. Thay vì xuất trực tiếp qua PORT thì bạn thay bằng 1 xung CLK là xong mừ.
                        Ví dụ:
                        Code:
                        sbit di_595 = P0^0;
                        sbit sck_595 = P0^1;	
                        sbit rck_595 = P0^2;
                        uchar num_pwm;
                        uchar pwm_r,pwm_g,pwm_b;
                        uint 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*/		
                        	di_595 =(pwm_r>num_pwm)?1:0;
                        	sck_595 = 1;
                        	sck_595 = 0;
                        	led_di =(pwm_g>num_pwm)?1:0;
                        	sck_595 = 1;
                        	sck_595 = 0;
                        	led_di =(pwm_b>num_pwm)?1:0;
                        	sck_595 = 1;
                        	sck_595 = 0;
                        
                        	rck_595 = 1;
                        	rck_595 = 0;
                        
                        	if(++num_pwm==100){			
                        		num_pwm=0;
                        	}
                        	++delay_in_t1; 
                        }

                        Email:
                        Tel: 0983.497.310

                        Comment


                        • #13
                          vậy là hoàn tất TUT rồi phải k sir .
                          Vậy sir up code ASM các phần cho bọn e đi , Code C e chả hiểu đc ... Thanks sir

                          Comment


                          • #14
                            anh Huy hay wa. làm PWM lun cho 1 port đi anh

                            Comment


                            • #15
                              ah anh H cho em hỏi tí về led full màu ấy, nó su dụng chíp 6803.e doc con này hoài mà chả hiểu a bik chỉ giúp e với

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X