[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
-
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.
-
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 youNguyên văn bởi tienhuypro Xem bài viếtMì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
Leave a comment:
-
Code C thì mình chịu rùiNguyên văn bởi tienhuypro Xem bài viếtHj 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.
Leave a comment:
-
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.
Leave a comment:
-
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.
Leave a comment:
-
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.Nguyên văn bởi chjpchjp1991Huy 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/
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.
Leave a comment:
-
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:
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:/*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:Mình tính chu kỳ máy từng lệnh trong timer1 thế nào nha: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 ASM: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*/T1= 2+2+2+2 = 8ckmCode: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 ASM:Code:c1=(pwm_c[0]>num_pwm)?1:0;
T= 1+1+1+2+1+2+1+2 = 11ckmCode: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 ASM:Code:if(++num_pwm==100){ num_pwm=0; } ++delay_in_t1;T3 = 1+1+2+2+1+1+2+1+2+2+2 = 17ckmCode: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:Vậy là xong phần 4a rồi, các bạn có thắc mắc gì thì hỏi nha.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!Last edited by tienhuypro; 10-11-2012, 23:16.
Leave a comment:
-
-
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.Nguyên văn bởi lenhoc91 Xem bài viếtanh Huy hay wa. làm PWM lun cho 1 port đi anh
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, 20:18.
Leave a comment:
dự án của bạn Tra theo mã, xem datasheet và đặt hàng trực tuyến. MicrochipROHMEpsonTaejin
Đặt hàng & tư vấn
Hà Nội024.3640 8561
TP.HCM028.3811 9870
Quét mã hoặc bấm để chat Zalo với R&PChat Zalo
Quét mã hoặc bấm để chat Zalo với R&PChat Zalo
Bài viết mới nhất
Collapse
-
Trả lời cho Tìm bạn thân quen cũ.bởi thuaimiVẫn nhớ và kính trọng Bác cũng các cao nhân trên dientuvietnam.net. Tính từ ngày tham gia trên này cũng đã hơn 20 năm rồi. Quá nhiều thay đổi cả trong công việc và cuộc sống. Nhưng được thấy lại các nick cũ vẫn sáng đèn là thấy vui rồi....-
Channel: Tâm tình dân kỹ thuật
26-10-2026, 16:33 -
-
Trả lời cho Tìm bạn thân quen cũ.bởi nhathung1101Còn sống không lão??? Mất một thời gian chữa bệnh nên quên hỏi thăm.......
-
Channel: Tâm tình dân kỹ thuật
25-10-2026, 03:09 -
-
Trả lời cho Công suất truyền qua lõi máy biến ápbởi nhathung1101Thời buổi năng lượng xanh, nhất là xanh cả mặt... Thì Điện mặt giời, điện gió, sẽ lên ngôi.
Nếu không nắm bắt được cái cơ bản đó thì đi làm coder à? Mà coder giờ thất nghiệp cả lũ vì AI rồi!!!









...
-
Channel: Điện tử công suất
25-10-2026, 03:03 -
-
Trả lời cho Công suất truyền qua lõi máy biến ápbởi quangdonguehChà, lâu lắm rồi nhưng diễn đàn vẫn còn những chủ đề cốt lõi của điện tử công suất...-
Channel: Điện tử công suất
24-10-2026, 07:53 -
-
bởi bqvietNếu muốn tăng công suất cần tăng con chip và tăng biến áp lên lớn hơn. Thiết kế ban đầu dùng TNY25x và biến áp EE16 hoặc EE13. Tăng con chip lên TNY268 vẫn mạch nguyên lý đó và biến áp lên EE19 sẽ nâng công suất ra thêm nhiều. Tăng tối đa...-
Channel: Điện tử công suất
24-10-2026, 02:14 -
-
bởi Nexus 6PMạch này chỉ chạy cho LED 10W trở xuống, còn muốn chạy Led công suất cao thì sao bác thớt ơi?-
Channel: Điện tử công suất
22-10-2026, 14:33 -
-
bởi Nexus 6PMạch này chỉ chạy cho LED 10W trở xuống, còn muốn chạy Led công suất cao thì sao bác thớt ơi?-
Channel: Điện tử công suất
22-10-2026, 10:49 -
-
Trả lời cho Tìm VR 5 chânbởi dinhthuong80Cảm ơn bác bqviet . Nhưng hình như các VR 5 chân của linhkienchatluong là loại có 2 chân là công tắc đóng mở. Thấy trên Shopee có chỗ bán linh kiện đàn Organ, mà không biết đúng loại không, với lại sao ... mắc dữ dội luôn ấy!!!
...-
Channel: Hướng dẫn tìm thông tin linh kiện
19-10-2026, 11:30 -
Leave a comment: