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

  • #46
    Chả hiểu tại sao cứ phải là asm nhỉ )))))))))))))))))))))))))))))))))))))))

    Comment


    • #47
      Tai vi may ban ay muon tro thanh cracker.hi hi.Va may ban ay chua lam chuong trinh nao to.May ban ay ua toc do.Nhu em viet c ma cung thay chang khac asm.the nen cung chong ca mat.
      , , ,

      Comment


      • #48
        Nguyên văn bởi tienhuypro Xem bài viết
        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!
        ở cái đoạn này lấy gì để so sánh v a nhỉ?
        "c1=(pwm_c[0]>num_pwm)?1:0;"
        cái mảng "pwm_c[32] " mình chưa nạp giá trị nào vào đó mà? e k hiểu

        Comment


        • #49
          anh ơi? cho em hỏi toán tử ?: chính xác thì diễn giải như thế nào?

          Comment


          • #50
            he, theo tính toán trong code của bạn thì thực ra mới chỉ tạo đc ra 96 cấp sáng khác nhau, nên cái biến num_pwm ko bh lên đc 100 cả, có cần phải thay đổi lại thành giá trị 96 ở trong các vòng lặp và so sánh ko bạn?

            Comment


            • #51
              thật ko uổng công mấy cả 1 buổi sáng để nghiên cứu code của bạn, quả thật nó rất tuyệt! cảm ơn vì đã chia sẻ!

              Comment


              • #52
                Cảm ơn anh nhiều. Post tiếp các phần còn lại đi anh ơi

                Comment


                • #53
                  mình dân thường ngoại đạo . muốn làm cái viền 4 bit chạy vòng tròn hình sao băng viết code sao các bạn. ai rãnh giúp mình với. mình có cái mạch rồi của cái bảng qc lấy ra làm port P00,p01,p02,p03

                  Comment


                  • #54
                    a HUy có thể viết giúp e 1 đoạn code led sao băng 4 cổng dùng 892051 bằng asm dc hok .. thank a trước nhé e có xem qua toàn bộ bài viết của anh có hiểu dc chút ít nhưng viết thì hok đúng như ý mún @@ .. thank anh
                    đam mê là không sợ khó khăn

                    Comment


                    • #55
                      có thể up nốt phần còn lại không vậy bác.....
                      TÌNH YÊU KHÔNG TỰ SINH RA CŨNG KHÔNG TỰ MÂT ĐI
                      MÀ NÓ CHỈ CHUYỂN HÓA TỪ NGƯỜI NÀY SANG NGƯỜI KHÁC . . . ! ! ! !...

                      Comment


                      • #56
                        chủ đề này đang hot sao không thấy bác nào vào up tiếp hết vậy ???
                        TÌNH YÊU KHÔNG TỰ SINH RA CŨNG KHÔNG TỰ MÂT ĐI
                        MÀ NÓ CHỈ CHUYỂN HÓA TỪ NGƯỜI NÀY SANG NGƯỜI KHÁC . . . ! ! ! !...

                        Comment


                        • #57
                          chủ đề này có lẽ cũng tạm ổn rồi mà, pác cứ đọc hết từ đầu đến gần đây là dùng được ngay.

                          Comment


                          • #58
                            Nguyên văn bởi bienhou Xem bài viết
                            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 ạ
                            Bạn này có 2 câu hỏi hay liên tiếp nhé . Có điều trường hợp này do trong chưong trình phục vụ ngắt thì counter vẫn đếm thì phải là không có sai số đáng kể mới phải chứ? vì counter không bị ngừng. Nếu bạn cho TRx=0 để ngừng counter ở đầu chưong trình phục vụ ngắt và ở cuối TRx=1 thì có phải là thời gian thực thi của trình phục vụ ngắt chính là sai số thời gian cho ngắt không? Giả sử bạn setup thời gian là 1000 chu kì máy, thời gian thực thi chương trình phục vụ ngắt là 200 chu kỳ máy, thì trường hợp này ngắt sẽ xảy ra sau ~= 1200 chu kỳ máy 1 lần so với 1000 bạn setup ban đầu sai số là ~= 200 chu kỳ máy?

                            Comment


                            • #59
                              các bác có thể giúp mình lập trình cho 2port chạy độc lập k vậy ?

                              vd: port 1 chạy led sao băng (chạy viền).
                              port 2 chạy chữ
                              TÌNH YÊU KHÔNG TỰ SINH RA CŨNG KHÔNG TỰ MÂT ĐI
                              MÀ NÓ CHỈ CHUYỂN HÓA TỪ NGƯỜI NÀY SANG NGƯỜI KHÁC . . . ! ! ! !...

                              Comment


                              • #60
                                bạn nói rõ hơn về led full này được khô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

                                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