Chả hiểu tại sao cứ phải là asm nhỉ )))))))))))))))))))))))))))))))))))))))
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
-
Nguyên văn bởi tienhuypro Xem bài viếtPhầ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){ } }
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: }
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: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
Chu kỳ máy PWM 1 cổng
Code C:Code:c1=(pwm_c[0]>num_pwm)?1:0;
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ổ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: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
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){ } }
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!
"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
-
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
-
Nguyên văn bởi bienhou Xem bài viếttrong 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 ạ
Comment
-
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
Bài viết mới nhất
Collapse
-
Trả lời cho Hỏi về bơm màng bldcbởi nhathung1101Thì đây là 4r điên nặng điện mà, nên họ show phần điện thôi. Phần "cốt lõi" có cái tay biên chắc sang Văn Môn rồi....
-
Channel: Điện tử dành cho người mới bắt đầu
30-11-2024, 18:54 -
-
Trả lời cho Chọn dây dẫn cho điện DC?bởi nhathung1101Điện DC đương nhiên là khác với AC rồi. Chỉ cần biết mặt chữ là thấy khác như gà trống với gà mái mà.
Còn về bản chất, AC là dòng điện hoạt động theo tần số. Tần số càng cao thì dây dẫn càng mỏng, nhẹ, vì hiệu ứng...-
Channel: Điện tử dành cho người mới bắt đầu
30-11-2024, 18:46 -
-
Trả lời cho Công thức điện tửbởi nhathung1101Ăn ít => Nói nhiều.
Nói nhiều => Làm ít.
Làm ít => Vợ mắng.
Vợ mắng => Cáu nhiều.
Cáu nhiều => Ngủ ít.
Ngủ ít => Râu nhiều.
Râu nhiều =>...-
Channel: Tâm tình dân kỹ thuật
30-11-2024, 18:39 -
-
Trả lời cho Chọn dây dẫn cho điện DC?bởi mèomướpDạ vài chục mét thì chú tính như vậy được ạ. Chứ chuẩn thì phải tính cả điện trở của toàn bộ chiều dài dây dẫn nhân với dòng điện xem sụt áp có trong khoảng chấp nhận đc hông ạ. Trong mạch điện tử khoảng cách ngắn và mạch...
-
Channel: Điện tử dành cho người mới bắt đầu
30-11-2024, 14:49 -
-
bởi vietroadTheo mình biết thì chọn dây dẫn dựa vào dòng tải. Thường thì tiết diện 1mm2 cho dòng 6A. Nhưng trong các mạch điện tử, như mạch nguồn tổ ong chẳng hạn, dòng đến vài chục Ampe mà đường mạch mỏng dính. Phải chăng điện DC nó khác với...
-
Channel: Điện tử dành cho người mới bắt đầu
30-11-2024, 14:19 -
-
Trả lời cho Hỏi về bơm màng bldcbởi vi van phamPhải xem cơ cấu bơm, chứ xem cơ cấu rotor, thì chỉ làm thầy bói xem voi.
-
Channel: Điện tử dành cho người mới bắt đầu
29-11-2024, 08:19 -
-
Trả lời cho Xin hỏi về màn hình laptopbởi yname11vg, cám ơn bác...........
-
Channel: Thiết bị điện tử cá nhân
28-11-2024, 14:37 -
-
bởi khoine9899
Em chào các anh và mọi người.
Hiện em đang có 1 con bơm màng trong thiết bị y tế đang gặp tình trạng yếu dần hoặc ngừng hoạt động sau thời gian sử dụng
Sau khi tìm hiểu về thông tin của bơm trên mạng thì em được biết...-
Channel: Điện tử dành cho người mới bắt đầu
28-11-2024, 11:22 -
-
Trả lời cho Cần mọi người giúp mạch tạo sóng siêu âm máy rửabởi bqviet
-
Channel: Điện tử công suất
27-11-2024, 20:26 -
-
bởi Minhdai95Em chào mọi người, e đang sửa mạch tạo sóng siêu âm cho máy rửa mà chưa có tài liệu để tham khảo sửa, mọi người cho e xin tài liệu ạ...
-
Channel: Điện tử công suất
27-11-2024, 11:37 -
Comment