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

  • #16
    Nguyên văn bởi lenhoc91 Xem bài viết
    anh Huy hay wa. làm PWM lun cho 1 port đi anh
    Uhm, như tiều đề của [TUT] là PWM 32 cổng tức là 4Port luôn đó bạn. Nhưng mấy hôm nay đi rông ngoài đường hoài nên chưa viết tiếp phần4 cho các bạn được.
    Giới thiệu sơ qua về phần 4:
    - Tính số mức sáng tối đa có thể làm được cho 32 cổng PWM với 89S52
    - Code led kiểu sao băng 32 cổng.
    - Code led kiểu sóng biển xô bờ
    - Code led kết hợp vừa sao băng vừa sáng tắt led bình thường (Kiểu này thường dùng trong mấy bảng LED quảng cáo: LED sao băng cho viền bảng LED, chớp sáng cho các chữ cái).
    Video LED trái tim 32 cổng demo đã làm nè:
    Last edited by tienhuypro; 08-11-2012, 21:18.

    Email:
    Tel: 0983.497.310

    Comment


    • #17
      ai có tài liệu lập trình asembly cho e với. gmail của e nè? daisoai1593@gmail.com

      Comment


      • #18
        Xem của chipchip xong mà ko thấy cái nào có sao băng cả.

        Email:
        Tel: 0983.497.310

        Comment


        • #19
          mong code ASM của bạn từng giờ , từng phút

          Comment


          • #20
            Phần 4 [TUT] Led sao băng 32 cổng 8051

            Phần 4:
            Như mình đã nói phần này gồm các phần như sau:
            a. Tính số mức sáng tối đa có thể làm được cho 32 cổng PWM với 89S52
            b. Code led kiểu sao băng 32 cổng.
            c. Code led kiểu sóng biển xô bờ
            d. Code led kết hợp vừa sao băng vừa sáng tắt led bình thường (Kiểu này thường dùng trong mấy bảng LED quảng cáo: LED sao băng cho viền bảng LED, chớp sáng cho các chữ cái).

            Phần 4a:
            - Phần này hơi khó giải thích vì vậy mình sẽ đưa code ra trước rồi chỉ cách tính số mức tối đa có thể dùng để PWM 32 cổng cho 89S52.
            * Các bạn nên đọc từ đầu bài viết để biết vì sao mình viết đoạn code PWM 32 cổng dưới đây nha.
            Code PWM 32 cổng 100 mức sáng khác nhau trên timer1:
            Code:
            /*Thach anh su dung f=24Mhz*/
            #include "regx52.h"
            
            typedef unsigned char uchar;
            typedef unsigned int  uint;
            
            sbit c1=P0^0;
            sbit c2=P0^1;
            sbit c3=P0^2;
            sbit c4=P0^3;
            sbit c5=P0^4;
            sbit c6=P0^5;
            sbit c7=P0^6;
            sbit c8=P0^7;
            sbit c9=P2^7;
            sbit c10=P2^6;
            sbit c11=P2^5;
            sbit c12=P2^4;
            sbit c13=P2^3;
            sbit c14=P2^2;
            sbit c15=P2^1;
            sbit c16=P2^0;
            sbit c17=P3^7;
            sbit c18=P3^6;
            sbit c19=P3^5;
            sbit c20=P3^4;
            sbit c21=P3^3;
            sbit c22=P3^2;
            sbit c23=P3^1;
            sbit c24=P3^0;
            sbit c25=P1^7;
            sbit c26=P1^6;
            sbit c27=P1^5;
            sbit c28=P1^4;
            sbit c29=P1^3;
            sbit c30=P1^2;
            sbit c31=P1^1;
            sbit c32=P1^0;											
            
            uchar num_pwm;
            uchar pwm_c[32];
            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*/		
            	
            	c1=(pwm_c[0]>num_pwm)?1:0;
            	c2=(pwm_c[1]>num_pwm)?1:0;
            	c3=(pwm_c[2]>num_pwm)?1:0;
            	c4=(pwm_c[3]>num_pwm)?1:0;
            	c5=(pwm_c[4]>num_pwm)?1:0; 
            	c6=(pwm_c[5]>num_pwm)?1:0;
            	c7=(pwm_c[6]>num_pwm)?1:0;
            	c8=(pwm_c[7]>num_pwm)?1:0;
            	c9=(pwm_c[8]>num_pwm)?1:0;
            	c10=(pwm_c[9]>num_pwm)?1:0;
            	c11=(pwm_c[10]>num_pwm)?1:0;
            	c12=(pwm_c[11]>num_pwm)?1:0;
            	c13=(pwm_c[12]>num_pwm)?1:0;
            	c14=(pwm_c[13]>num_pwm)?1:0;
            	c15=(pwm_c[14]>num_pwm)?1:0;
            	c16=(pwm_c[15]>num_pwm)?1:0;
            	c17=(pwm_c[16]>num_pwm)?1:0;
            	c18=(pwm_c[17]>num_pwm)?1:0;
            	c19=(pwm_c[18]>num_pwm)?1:0;
            	c20=(pwm_c[19]>num_pwm)?1:0;
            	c21=(pwm_c[20]>num_pwm)?1:0;
            	c22=(pwm_c[21]>num_pwm)?1:0;
            	c23=(pwm_c[22]>num_pwm)?1:0;
            	c24=(pwm_c[23]>num_pwm)?1:0;
            	c25=(pwm_c[24]>num_pwm)?1:0;
            	c26=(pwm_c[25]>num_pwm)?1:0;
            	c27=(pwm_c[26]>num_pwm)?1:0;
            	c28=(pwm_c[27]>num_pwm)?1:0;
            	c29=(pwm_c[28]>num_pwm)?1:0;
            	c30=(pwm_c[29]>num_pwm)?1:0;
            	c31=(pwm_c[30]>num_pwm)?1:0;
            	c32=(pwm_c[31]>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 main(){
            	TMOD=0x10; /*timer 1 16bit*/
            	TR1=1;
            	TH1=0xFE;
            	TL1=0xB3;
            	IE=0x88;  /*Ket thuc khoi dong timer1*/
            	
            	P0 = 0;
            	P1 = 0;
            	P2 = 0;
            	P3 = 0;
            	delay_ms(3000);	
            	while(1){
            	}
            }
            Tiếp tục chúng ta chạy debug đoạn code trên trong ASM của KeilC để xem tổng thời gian xử lý trên ngắt timer1 tốn bao nhiêu chu kỳ máy nha.
            Code ASM:
            Code:
                43: void isr_timer1() interrupt 3 using 2{ 
            C:0x001E    C0E0     PUSH     ACC(0xE0)
            C:0x0020    C0D0     PUSH     PSW(0xD0)
                44:         TH1=0xFE;       /* -24000000/12/60/100 ~= -333 ->0xfeb3        (100 nghia la 100 muc sang)*/ 
            C:0x0022    758DFE   MOV      TH1(0x8D),#0xFE
                45:         TL1=0xB3;       /* chu ky ngat timer1 T=(333/2)us --> T*6 = 999 us ~= 1ms*/         
                46:          
            C:0x0025    758BB3   MOV      TL1(0x8B),#0xB3
                47:         c1=(pwm_c[0]>num_pwm)?1:0; 
            C:0x0028    E509     MOV      A,pwm_c(0x09)
            C:0x002A    D3       SETB     C
            C:0x002B    9508     SUBB     A,num_pwm(0x08)
            C:0x002D    4003     JC       C:0032
            C:0x002F    D3       SETB     C
            C:0x0030    8001     SJMP     C:0033
            C:0x0032    C3       CLR      C
            C:0x0033    9280     MOV      c1(0x80.0),C
                48:         c2=(pwm_c[1]>num_pwm)?1:0; 
            C:0x0035    E50A     MOV      A,0x0A
            C:0x0037    D3       SETB     C
            C:0x0038    9508     SUBB     A,num_pwm(0x08)
            C:0x003A    4003     JC       C:003F
            C:0x003C    D3       SETB     C
            C:0x003D    8001     SJMP     C:0040
            C:0x003F    C3       CLR      C
            C:0x0040    9281     MOV      c2(0x80.1),C
                49:         c3=(pwm_c[2]>num_pwm)?1:0; 
            C:0x0042    E50B     MOV      A,0x0B
            C:0x0044    D3       SETB     C
            C:0x0045    9508     SUBB     A,num_pwm(0x08)
            C:0x0047    4003     JC       C:004C
            C:0x0049    D3       SETB     C
            C:0x004A    8001     SJMP     C:004D
            C:0x004C    C3       CLR      C
            C:0x004D    9282     MOV      c3(0x80.2),C
                50:         c4=(pwm_c[3]>num_pwm)?1:0; 
            C:0x004F    E50C     MOV      A,0x0C
            C:0x0051    D3       SETB     C
            C:0x0052    9508     SUBB     A,num_pwm(0x08)
            C:0x0054    4003     JC       C:0059
            C:0x0056    D3       SETB     C
            C:0x0057    8001     SJMP     C:005A
            C:0x0059    C3       CLR      C
            C:0x005A    9283     MOV      c4(0x80.3),C
                51:         c5=(pwm_c[4]>num_pwm)?1:0;  
            C:0x005C    E50D     MOV      A,0x0D
            C:0x005E    D3       SETB     C
            C:0x005F    9508     SUBB     A,num_pwm(0x08)
            C:0x0061    4003     JC       C:0066
            C:0x0063    D3       SETB     C
            C:0x0064    8001     SJMP     C:0067
            C:0x0066    C3       CLR      C
            C:0x0067    9284     MOV      c5(0x80.4),C
                52:         c6=(pwm_c[5]>num_pwm)?1:0; 
            C:0x0069    E50E     MOV      A,0x0E
            C:0x006B    D3       SETB     C
            C:0x006C    9508     SUBB     A,num_pwm(0x08)
            C:0x006E    4003     JC       C:0073
            C:0x0070    D3       SETB     C
            C:0x0071    8001     SJMP     C:0074
            C:0x0073    C3       CLR      C
            C:0x0074    9285     MOV      c6(0x80.5),C
                53:         c7=(pwm_c[6]>num_pwm)?1:0; 
            C:0x0076    E50F     MOV      A,0x0F
            C:0x0078    D3       SETB     C
            C:0x0079    9508     SUBB     A,num_pwm(0x08)
            C:0x007B    4003     JC       C:0080
            C:0x007D    D3       SETB     C
            C:0x007E    8001     SJMP     C:0081
            C:0x0080    C3       CLR      C
            C:0x0081    9286     MOV      c7(0x80.6),C
                54:         c8=(pwm_c[7]>num_pwm)?1:0; 
            C:0x0083    E510     MOV      A,0x10
            C:0x0085    D3       SETB     C
            C:0x0086    9508     SUBB     A,num_pwm(0x08)
            C:0x0088    4003     JC       C:008D
            C:0x008A    D3       SETB     C
            C:0x008B    8001     SJMP     C:008E
            C:0x008D    C3       CLR      C
            C:0x008E    9287     MOV      c8(0x80.7),C
                55:         c9=(pwm_c[8]>num_pwm)?1:0; 
            C:0x0090    E511     MOV      A,0x11
            C:0x0092    D3       SETB     C
            C:0x0093    9508     SUBB     A,num_pwm(0x08)
            C:0x0095    4003     JC       C:009A
            C:0x0097    D3       SETB     C
            C:0x0098    8001     SJMP     C:009B
            C:0x009A    C3       CLR      C
            C:0x009B    92A7     MOV      c9(0xA0.7),C
                56:         c10=(pwm_c[9]>num_pwm)?1:0; 
            C:0x009D    E512     MOV      A,0x12
            C:0x009F    D3       SETB     C
            C:0x00A0    9508     SUBB     A,num_pwm(0x08)
            C:0x00A2    4003     JC       C:00A7
            C:0x00A4    D3       SETB     C
            C:0x00A5    8001     SJMP     C:00A8
            C:0x00A7    C3       CLR      C
            C:0x00A8    92A6     MOV      c10(0xA0.6),C
                57:         c11=(pwm_c[10]>num_pwm)?1:0; 
            C:0x00AA    E513     MOV      A,0x13
            C:0x00AC    D3       SETB     C
            C:0x00AD    9508     SUBB     A,num_pwm(0x08)
            C:0x00AF    4003     JC       C:00B4
            C:0x00B1    D3       SETB     C
            C:0x00B2    8001     SJMP     C:00B5
            C:0x00B4    C3       CLR      C
            C:0x00B5    92A5     MOV      c11(0xA0.5),C
                58:         c12=(pwm_c[11]>num_pwm)?1:0; 
            C:0x00B7    E514     MOV      A,0x14
            C:0x00B9    D3       SETB     C
            C:0x00BA    9508     SUBB     A,num_pwm(0x08)
            C:0x00BC    4003     JC       C:00C1
            C:0x00BE    D3       SETB     C
            C:0x00BF    8001     SJMP     C:00C2
            C:0x00C1    C3       CLR      C
            C:0x00C2    92A4     MOV      c12(0xA0.4),C
                59:         c13=(pwm_c[12]>num_pwm)?1:0; 
            C:0x00C4    E515     MOV      A,0x15
            C:0x00C6    D3       SETB     C
            C:0x00C7    9508     SUBB     A,num_pwm(0x08)
            C:0x00C9    4003     JC       C:00CE
            C:0x00CB    D3       SETB     C
            C:0x00CC    8001     SJMP     C:00CF
            C:0x00CE    C3       CLR      C
            C:0x00CF    92A3     MOV      c13(0xA0.3),C
                60:         c14=(pwm_c[13]>num_pwm)?1:0; 
            C:0x00D1    E516     MOV      A,0x16
            C:0x00D3    D3       SETB     C
            C:0x00D4    9508     SUBB     A,num_pwm(0x08)
            C:0x00D6    4003     JC       C:00DB
            C:0x00D8    D3       SETB     C
            C:0x00D9    8001     SJMP     C:00DC
            C:0x00DB    C3       CLR      C
            C:0x00DC    92A2     MOV      c14(0xA0.2),C
                61:         c15=(pwm_c[14]>num_pwm)?1:0; 
            C:0x00DE    E517     MOV      A,0x17
            C:0x00E0    D3       SETB     C
            C:0x00E1    9508     SUBB     A,num_pwm(0x08)
            C:0x00E3    4003     JC       C:00E8
            C:0x00E5    D3       SETB     C
            C:0x00E6    8001     SJMP     C:00E9
            C:0x00E8    C3       CLR      C
            C:0x00E9    92A1     MOV      c15(0xA0.1),C
                62:         c16=(pwm_c[15]>num_pwm)?1:0; 
            C:0x00EB    E518     MOV      A,0x18
            C:0x00ED    D3       SETB     C
            C:0x00EE    9508     SUBB     A,num_pwm(0x08)
            C:0x00F0    4003     JC       C:00F5
            C:0x00F2    D3       SETB     C
            C:0x00F3    8001     SJMP     C:00F6
            C:0x00F5    C3       CLR      C
            C:0x00F6    92A0     MOV      c16(0xA0.0),C
                63:         c17=(pwm_c[16]>num_pwm)?1:0; 
            C:0x00F8    E519     MOV      A,0x19
            C:0x00FA    D3       SETB     C
            C:0x00FB    9508     SUBB     A,num_pwm(0x08)
            C:0x00FD    4003     JC       C:0102
            C:0x00FF    D3       SETB     C
            C:0x0100    8001     SJMP     C:0103
            C:0x0102    C3       CLR      C
            C:0x0103    92B7     MOV      c17(0xB0.7),C
                64:         c18=(pwm_c[17]>num_pwm)?1:0; 
            C:0x0105    E51A     MOV      A,0x1A
            C:0x0107    D3       SETB     C
            C:0x0108    9508     SUBB     A,num_pwm(0x08)
            C:0x010A    4003     JC       C:010F
            C:0x010C    D3       SETB     C
            C:0x010D    8001     SJMP     C:0110
            C:0x010F    C3       CLR      C
            C:0x0110    92B6     MOV      c18(0xB0.6),C
                65:         c19=(pwm_c[18]>num_pwm)?1:0; 
            C:0x0112    E51B     MOV      A,0x1B
            C:0x0114    D3       SETB     C
            C:0x0115    9508     SUBB     A,num_pwm(0x08)
            C:0x0117    4003     JC       C:011C
            C:0x0119    D3       SETB     C
            C:0x011A    8001     SJMP     C:011D
            C:0x011C    C3       CLR      C
            C:0x011D    92B5     MOV      c19(0xB0.5),C
                66:         c20=(pwm_c[19]>num_pwm)?1:0; 
            C:0x011F    E51C     MOV      A,0x1C
            C:0x0121    D3       SETB     C
            C:0x0122    9508     SUBB     A,num_pwm(0x08)
            C:0x0124    4003     JC       C:0129
            C:0x0126    D3       SETB     C
            C:0x0127    8001     SJMP     C:012A
            C:0x0129    C3       CLR      C
            C:0x012A    92B4     MOV      c20(0xB0.4),C
                67:         c21=(pwm_c[20]>num_pwm)?1:0; 
            C:0x012C    E51D     MOV      A,0x1D
            C:0x012E    D3       SETB     C
            C:0x012F    9508     SUBB     A,num_pwm(0x08)
            C:0x0131    4003     JC       C:0136
            C:0x0133    D3       SETB     C
            C:0x0134    8001     SJMP     C:0137
            C:0x0136    C3       CLR      C
            C:0x0137    92B3     MOV      c21(0xB0.3),C
                68:         c22=(pwm_c[21]>num_pwm)?1:0; 
            C:0x0139    E51E     MOV      A,0x1E
            C:0x013B    D3       SETB     C
            C:0x013C    9508     SUBB     A,num_pwm(0x08)
            C:0x013E    4003     JC       C:0143
            C:0x0140    D3       SETB     C
            C:0x0141    8001     SJMP     C:0144
            C:0x0143    C3       CLR      C
            C:0x0144    92B2     MOV      c22(0xB0.2),C
                69:         c23=(pwm_c[22]>num_pwm)?1:0; 
            C:0x0146    E51F     MOV      A,0x1F
            C:0x0148    D3       SETB     C
            C:0x0149    9508     SUBB     A,num_pwm(0x08)
            C:0x014B    4003     JC       C:0150
            C:0x014D    D3       SETB     C
            C:0x014E    8001     SJMP     C:0151
            C:0x0150    C3       CLR      C
            C:0x0151    92B1     MOV      c23(0xB0.1),C
                70:         c24=(pwm_c[23]>num_pwm)?1:0; 
            C:0x0153    E520     MOV      A,0x20
            C:0x0155    D3       SETB     C
            C:0x0156    9508     SUBB     A,num_pwm(0x08)
            C:0x0158    4003     JC       C:015D
            C:0x015A    D3       SETB     C
            C:0x015B    8001     SJMP     C:015E
            C:0x015D    C3       CLR      C
            C:0x015E    92B0     MOV      c24(0xB0.0),C
                71:         c25=(pwm_c[24]>num_pwm)?1:0; 
            C:0x0160    E521     MOV      A,0x21
            C:0x0162    D3       SETB     C
            C:0x0163    9508     SUBB     A,num_pwm(0x08)
            C:0x0165    4003     JC       C:016A
            C:0x0167    D3       SETB     C
            C:0x0168    8001     SJMP     C:016B
            C:0x016A    C3       CLR      C
            C:0x016B    9297     MOV      c25(0x90.7),C
                72:         c26=(pwm_c[25]>num_pwm)?1:0; 
            C:0x016D    E522     MOV      A,0x22
            C:0x016F    D3       SETB     C
            C:0x0170    9508     SUBB     A,num_pwm(0x08)
            C:0x0172    4003     JC       C:0177
            C:0x0174    D3       SETB     C
            C:0x0175    8001     SJMP     C:0178
            C:0x0177    C3       CLR      C
            C:0x0178    9296     MOV      c26(0x90.6),C
                73:         c27=(pwm_c[26]>num_pwm)?1:0; 
            C:0x017A    E523     MOV      A,0x23
            C:0x017C    D3       SETB     C
            C:0x017D    9508     SUBB     A,num_pwm(0x08)
            C:0x017F    4003     JC       C:0184
            C:0x0181    D3       SETB     C
            C:0x0182    8001     SJMP     C:0185
            C:0x0184    C3       CLR      C
            C:0x0185    9295     MOV      c27(0x90.5),C
                74:         c28=(pwm_c[27]>num_pwm)?1:0; 
            C:0x0187    E524     MOV      A,0x24
            C:0x0189    D3       SETB     C
            C:0x018A    9508     SUBB     A,num_pwm(0x08)
            C:0x018C    4003     JC       C:0191
            C:0x018E    D3       SETB     C
            C:0x018F    8001     SJMP     C:0192
            C:0x0191    C3       CLR      C
            C:0x0192    9294     MOV      c28(0x90.4),C
                75:         c29=(pwm_c[28]>num_pwm)?1:0; 
            C:0x0194    E525     MOV      A,0x25
            C:0x0196    D3       SETB     C
            C:0x0197    9508     SUBB     A,num_pwm(0x08)
            C:0x0199    4003     JC       C:019E
            C:0x019B    D3       SETB     C
            C:0x019C    8001     SJMP     C:019F
            C:0x019E    C3       CLR      C
            C:0x019F    9293     MOV      c29(0x90.3),C
                76:         c30=(pwm_c[29]>num_pwm)?1:0; 
            C:0x01A1    E526     MOV      A,0x26
            C:0x01A3    D3       SETB     C
            C:0x01A4    9508     SUBB     A,num_pwm(0x08)
            C:0x01A6    4003     JC       C:01AB
            C:0x01A8    D3       SETB     C
            C:0x01A9    8001     SJMP     C:01AC
            C:0x01AB    C3       CLR      C
            C:0x01AC    9292     MOV      c30(0x90.2),C
                77:         c31=(pwm_c[30]>num_pwm)?1:0; 
            C:0x01AE    E527     MOV      A,0x27
            C:0x01B0    D3       SETB     C
            C:0x01B1    9508     SUBB     A,num_pwm(0x08)
            C:0x01B3    4003     JC       C:01B8
            C:0x01B5    D3       SETB     C
            C:0x01B6    8001     SJMP     C:01B9
            C:0x01B8    C3       CLR      C
            C:0x01B9    9291     MOV      c31(0x90.1),C
                78:         c32=(pwm_c[31]>num_pwm)?1:0; 
                79:  
            C:0x01BB    E528     MOV      A,0x28
            C:0x01BD    D3       SETB     C
            C:0x01BE    9508     SUBB     A,num_pwm(0x08)
            C:0x01C0    4003     JC       C:01C5
            C:0x01C2    D3       SETB     C
            C:0x01C3    8001     SJMP     C:01C6
            C:0x01C5    C3       CLR      C
            C:0x01C6    9290     MOV      c32(0x90.0),C
                80:         if(++num_pwm==100){                
            C:0x01C8    0508     INC      num_pwm(0x08)
            C:0x01CA    E508     MOV      A,num_pwm(0x08)
            C:0x01CC    B46403   CJNE     A,#0x64,C:01D2
                81:                 num_pwm=0; 
            C:0x01CF    750800   MOV      num_pwm(0x08),#0x00
                82:         } 
                83:         ++delay_in_t1;  
            C:0x01D2    052A     INC      0x2A
            C:0x01D4    E52A     MOV      A,0x2A
            C:0x01D6    7002     JNZ      C:01DA
            C:0x01D8    0529     INC      delay_in_t1(0x29)
                84: }
            Mình tính chu kỳ máy từng lệnh trong timer1 thế nào nha:
            Code C:
            Code:
            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*/
            Code ASM:
            Code:
                43: void isr_timer1() interrupt 3 using 2{ 
            C:0x001E    C0E0     PUSH     ACC(0xE0)		;2ckm
            C:0x0020    C0D0     PUSH     PSW(0xD0)		;2ckm
                44:         TH1=0xFE;       /* -24000000/12/60/100 ~= -333 ->0xfeb3        (100 nghia la 100 muc sang)*/ 
            C:0x0022    758DFE   MOV      TH1(0x8D),#0xFE	;2ckm
                45:         TL1=0xB3;       /* chu ky ngat timer1 T=(333/2)us --> T*6 = 999 us ~= 1ms*/         
                46:          
            C:0x0025    758BB3   MOV      TL1(0x8B),#0xB3	;2ckm
            T1= 2+2+2+2 = 8ckm

            Chu kỳ máy PWM 1 cổng
            Code C:
            Code:
            c1=(pwm_c[0]>num_pwm)?1:0;
            Code ASM:
            Code:
                47:         c1=(pwm_c[0]>num_pwm)?1:0; 
            C:0x0028    E509     MOV      A,pwm_c(0x09)	;1ckm
            C:0x002A    D3       SETB     C			;1ckm
            C:0x002B    9508     SUBB     A,num_pwm(0x08)	;1ckm
            C:0x002D    4003     JC       C:0032		;2ckm
            C:0x002F    D3       SETB     C			;1ckm
            C:0x0030    8001     SJMP     C:0033		;2ckm
            C:0x0032    C3       CLR      C			;1ckm
            C:0x0033    9280     MOV      c1(0x80.0),C	;2ckm
            T= 1+1+1+2+1+2+1+2 = 11ckm
            --> tổng chu kỳ máy của 32 cổng T2 = T*32 = 11*32 = 352ckm

            Chu kỳ máy
            Code C:
            Code:
            	if(++num_pwm==100){			
            		num_pwm=0;
            	}
            	++delay_in_t1;
            Code ASM:
            Code:
                80:         if(++num_pwm==100){           
            C:0x01C8    0508     INC      num_pwm(0x08)		;1ckm
            C:0x01CA    E508     MOV      A,num_pwm(0x08)		;1ckm
            C:0x01CC    B46403   CJNE     A,#0x64,C:01D2		;2ckm
                81:                 num_pwm=0; 
            C:0x01CF    750800   MOV      num_pwm(0x08),#0x00	;2ckm
                82:         } 
                83:         ++delay_in_t1;  
            C:0x01D2    052A     INC      0x2A			;1ckm
            C:0x01D4    E52A     MOV      A,0x2A			;1ckm
            C:0x01D6    7002     JNZ      C:01DA			;2ckm
            C:0x01D8    0529     INC      delay_in_t1(0x29)		;1ckm
            C:0x01DA    D0D0     POP      PSW(0xD0)			;2ckm
            C:0x01DC    D0E0     POP      ACC(0xE0)			;2ckm
            C:0x01DE    32       RETI     				;2ckm
            T3 = 1+1+2+2+1+1+2+1+2+2+2 = 17ckm
            Vậy tổng số chu kỳ máy tiêu tốn khi vào ngắt timer1 là: T(timer1) = T1 + T2 +T3 = 8 + 352 + 17 = 377ckm
            Nhưng ta đã thiết lập ngắt timer1 là cứ 333 chu kỳ máy thì ngắt 1 lần. Do 333<377 --> không thể đảm bảo 100 mức sáng khác nhau cho LED. Ngoài ra để đảm bảo số mức sáng cho LED thì ta phải đảm bảo rằng tổng chu kỳ máy thực hiện trên ngắt timer1 và tổng chu kỳ máy các lệnh thực hiện trong hàm main() kể cả hàm con phải nhỏ hơn hoặc bằng tổng số chu kỳ máy để xảy ra ngắt timer1.
            Ví dụ: Số chu kỳ máy thực hiện PWM 32 cổng trong ngắt timer1 là 377ckm, giả sử số chu kỳ máy tốn cho các lệnh thực hiện chuyển đổi trong hàm main() là 100ckm thì số chu kỳ máy để xảy ra ngắt timer1 phải đảm bảo T >= (377+100) hay T >= 477ckm.
            - Để đảm bảo chắc chắn đạt các yêu cầu như trên mình chọn số mức sáng cho LED lần này là 50 mức sáng khác nhau. --> số chu kỳ máy để xảy ra ngắt timer là:
            T= 24000000/12/60/50 ~= 666ckm. Vậy ta có code mới để PWM cho 32 LED như sau
            Code C:
            Code:
            /*Thach anh su dung f=24Mhz*/
            #include "regx52.h"
            
            typedef unsigned char uchar;
            typedef unsigned int  uint;
            
            sbit c1=P0^0;
            sbit c2=P0^1;
            sbit c3=P0^2;
            sbit c4=P0^3;
            sbit c5=P0^4;
            sbit c6=P0^5;
            sbit c7=P0^6;
            sbit c8=P0^7;
            sbit c9=P2^7;
            sbit c10=P2^6;
            sbit c11=P2^5;
            sbit c12=P2^4;
            sbit c13=P2^3;
            sbit c14=P2^2;
            sbit c15=P2^1;
            sbit c16=P2^0;
            sbit c17=P3^7;
            sbit c18=P3^6;
            sbit c19=P3^5;
            sbit c20=P3^4;
            sbit c21=P3^3;
            sbit c22=P3^2;
            sbit c23=P3^1;
            sbit c24=P3^0;
            sbit c25=P1^7;
            sbit c26=P1^6;
            sbit c27=P1^5;
            sbit c28=P1^4;
            sbit c29=P1^3;
            sbit c30=P1^2;
            sbit c31=P1^1;
            sbit c32=P1^0;											
            
            uchar num_pwm;
            uchar pwm_c[32];
            uint delay_in_t1;
            void isr_timer1() interrupt 3 using 2{
            	TH1=0xFD;	/* -24000000/12/60/50 ~= -666 ->0xFD66	(50 nghia la 50 muc sang)*/
            	TL1=0x66;	/* chu ky ngat timer1 T=(666/2)us --> T*3 = 999 us ~= 1ms*/		
            	
            	c1=(pwm_c[0]>num_pwm)?1:0;
            	c2=(pwm_c[1]>num_pwm)?1:0;
            	c3=(pwm_c[2]>num_pwm)?1:0;
            	c4=(pwm_c[3]>num_pwm)?1:0;
            	c5=(pwm_c[4]>num_pwm)?1:0; 
            	c6=(pwm_c[5]>num_pwm)?1:0;
            	c7=(pwm_c[6]>num_pwm)?1:0;
            	c8=(pwm_c[7]>num_pwm)?1:0;
            	c9=(pwm_c[8]>num_pwm)?1:0;
            	c10=(pwm_c[9]>num_pwm)?1:0;
            	c11=(pwm_c[10]>num_pwm)?1:0;
            	c12=(pwm_c[11]>num_pwm)?1:0;
            	c13=(pwm_c[12]>num_pwm)?1:0;
            	c14=(pwm_c[13]>num_pwm)?1:0;
            	c15=(pwm_c[14]>num_pwm)?1:0;
            	c16=(pwm_c[15]>num_pwm)?1:0;
            	c17=(pwm_c[16]>num_pwm)?1:0;
            	c18=(pwm_c[17]>num_pwm)?1:0;
            	c19=(pwm_c[18]>num_pwm)?1:0;
            	c20=(pwm_c[19]>num_pwm)?1:0;
            	c21=(pwm_c[20]>num_pwm)?1:0;
            	c22=(pwm_c[21]>num_pwm)?1:0;
            	c23=(pwm_c[22]>num_pwm)?1:0;
            	c24=(pwm_c[23]>num_pwm)?1:0;
            	c25=(pwm_c[24]>num_pwm)?1:0;
            	c26=(pwm_c[25]>num_pwm)?1:0;
            	c27=(pwm_c[26]>num_pwm)?1:0;
            	c28=(pwm_c[27]>num_pwm)?1:0;
            	c29=(pwm_c[28]>num_pwm)?1:0;
            	c30=(pwm_c[29]>num_pwm)?1:0;
            	c31=(pwm_c[30]>num_pwm)?1:0;
            	c32=(pwm_c[31]>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*3);	
            }
            
            
            void main(){
            	TMOD=0x10; /*timer 1 16bit*/
            	TR1=1;
            	TH1=0xFD;
            	TL1=0x66;
            	IE=0x88;  /*Ket thuc khoi dong timer1*/
            	
            	P0 = 0;
            	P1 = 0;
            	P2 = 0;
            	P3 = 0;
            	delay_ms(3000);	
            	while(1){
            	}
            }
            Vậy là xong phần 4a rồi, các bạn có thắc mắc gì thì hỏi nha.
            Hôm khác mình sẽ tiếp tục các phần còn lại. Giờ thì chúc các bạn ngủ ngon nha!
            Last edited by tienhuypro; 11-11-2012, 00:16.

            Email:
            Tel: 0983.497.310

            Comment


            • #21
              Nguyên văn bởi chjpchjp1991
              Huy nè...mạch led kết nối kiểu này http://www.dientuvietnam.net/forums/...grb-dimmer.jpg của cậu thì chân VDK tích cực dương ak...vậy led có sợ cháy không..nếu tớ tự làm led..32 con..còn nữa..cậu xem code c mà tớ post từng chia sẻ..chạy led sao băng..nhưng chỉ có 16 cổng..giờ phát triển lên 32 chân hơi khó so với cách cậu từng bit http://www.dientuvietnam.net/forums/...-chuan-140464/
              Mình đã chỉ cách tính PWM 32 cổng rồi kìa, giờ chjpchjp có thể phát triển code dựa trên code của Huy post rồi đó, hoặc có thể chờ Huy post code các phần sau nữa và test thế nào luôn.
              Code LED trái tim mình sẽ chỉ cho cách làm và up code lên full luôn mà, nhưng mình phải hoàn thành xong hướng dẫn code đã để sau này các bạn có thể phát triển dựa trên code Huy post luôn.

              Email:
              Tel: 0983.497.310

              Comment


              • #22
                up bạn ơi .........

                Comment


                • #23
                  Chờ mãi mà chưa thấy bác "tienhuypro" up code ASM lên!

                  Comment


                  • #24
                    bác tienhuypro ơi, cho e xin cái file asm của mạch trái tim bác làm đó với. có thể gửi qua mail vietchien123@gmail.com cho e được ko? thank bác nhiều nhiều. bọn e có bài tập lớn phần này. thầy kêu làm mạch thực tế bác nak, mạch của bác đẹp thiệt, cho e xin cái code nha. chân thành cảm ơn bác, bác gửi sớm sớm e mừng vì gần tới hạn nộp bài rồi. mà code asm bác hex, C e mù tịt.

                    Comment


                    • #25
                      Hj các bạn!
                      Có ai làm đc PWM từ hướng dẫn mình chưa, port vài cái hình hay video lên để động viên tinh thần mình viết tiếp cái nào.

                      Email:
                      Tel: 0983.497.310

                      Comment


                      • #26
                        Nguyên văn bởi tienhuypro Xem bài viết
                        Hj các bạn!
                        Có ai làm đc PWM từ hướng dẫn mình chưa, port vài cái hình hay video lên để động viên tinh thần mình viết tiếp cái nào.
                        Code C thì mình chịu rùi

                        Comment


                        • #27
                          Bạn ơi . Có thể up code asm lên cho mọi người k? Cảm ơn

                          Comment


                          • #28
                            Nguyên văn bởi tienhuypro Xem bài viết
                            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è.
                            [ATTACH=CONFIG]54908[/ATTACH]
                            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.
                            [ATTACH=CONFIG]54916[/ATTACH]
                            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
                            Huy ơi!!! cho mình hỏi mạch nạp này mình dùng dây USB ---> com có kết nối với mạch nạp này được ko vậy? Thanks you

                            Comment


                            • #29
                              up 1 cái code asm led sao băng cho ace tham khảo bác ơi
                              không thể làm những gì bạn muốn,hãy làm những gì bạn có thể làm .Đời không như mơ

                              Comment


                              • #30
                                bác tienhuypro ơi, up cái lên cho mọng người khỏi mong chờ. giờ thì chờ bác up lên làm thử coi thế nào thôi, chứ cũng chả thiết tha gì nữa.

                                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