Rất Cần Giúp Đỡ Về Code Làm Cho Led Sáng Dần Và Tắt Dần ...
Có thể bạn quan tâm
PIC Vietnam > Microchip PIC > Cơ bản về vi điều khiển và PIC > Rất Cần Giúp Đỡ Về Code Làm Cho Led Sáng Dần Và Tắt Dần !!!! PDA
View Full Version : Rất Cần Giúp Đỡ Về Code Làm Cho Led Sáng Dần Và Tắt Dần !!!!
tienchuan26-06-2009, 08:25 AMMình muốn viết 1 chương trình làm cho led sáng dần và tắt dần với pic16f877A (viết bằng CCS).Mình cũng đã thử coi qua mấy luồng trong diễn đàn về điều chế độ rộng xung ,nhưng chưa hiểu được (củ chuối quá!!!) Vậy,Nhờ các Anh/Bạn nào làm về vấn đề này rồi chỉ cho em với !!! Em cảm ơn mọi người trước nha !!!! jackiele27-06-2009, 08:53 AMMình muốn viết 1 chương trình làm cho led sáng dần và tắt dần với pic16f877A (viết bằng CCS).Mình cũng đã thử coi qua mấy luồng trong diễn đàn về điều chế độ rộng xung ,nhưng chưa hiểu được (củ chuối quá!!!) Vậy,Nhờ các Anh/Bạn nào làm về vấn đề này rồi chỉ cho em với !!! Em cảm ơn mọi người trước nha !!!! Nếu bạn điều khiển 2 con led thì bạn còn dùng CCP1 và CCP2 nhưng số led nhiều hơn thì sao. Đơn giản bạn tạo điện áp trung bình cho từng chân (giả lập PWM cho nhiều chân); tienchuan27-06-2009, 12:37 PMBạn có thể nói nói rõ hơn về phần này ko ? Mình chưa hiểu lắm ! Mình định làm cái mạch dùng led cho nó sáng đủ kiểu,thấy kiểu sáng dần ,tắt dàn cũng hay nên mình muốn làm về phần này ! Nếu có tài liệu về phần này thì bạn send cho mình với nhé ! Mail to: [email protected] Cảm ơn Bạn nhiều ! tuan100727-06-2009, 05:33 PMChiều nay cuối tuần nên được rảnh tí,Viết thử đoạn chương trình bạn yêu cầu. 20 phút sau cũng biên dịch ra được File .hex Lấy cái EasyPIC ra nạp thử. Kết quả OK. #INCLUDE<16F877A.H> #INCLUDE<KhaiBaoTGhi_16F877A.h> #FUSES HS,NOWDT,NOPROTECT,NOLVP #USE DELAY(CLOCK=20000000) #DEFINE Led PORTB #use fast_io(b) int8 sck,slx,bx,bl,gt; main() { trisb=0; while(true) { sck=8; bl=0; portb=0; delay_ms(100); while(sck>0) { bx=1; slx=sck; while(slx>0) { gt=bl|bx; portb=gt; delay_ms(100); bx=bx<<1; slx--; } bl=gt; sck--; } } } ---------------------------------------------------------------------------------------- Trong File đính kèm có File .c và .hex anh nhé! Cuối tuần rồi,Em có hẹn nên đi đây. jackiele27-06-2009, 06:04 PMBạn có thể nói nói rõ hơn về phần này ko ? Mình chưa hiểu lắm ! Mình định làm cái mạch dùng led cho nó sáng đủ kiểu,thấy kiểu sáng dần ,tắt dàn cũng hay nên mình muốn làm về phần này ! Nếu có tài liệu về phần này thì bạn send cho mình với nhé ! Mail to: [email protected] Cảm ơn Bạn nhiều ! Bạn muốn mỗi led sáng từ từ lên (tắt->sáng mờ mờ->sáng mờ->sáng) hay 1 dãy led sáng từng con con tăng lên? Bạn phải nói rõ. Chào bạn! tienchuan28-06-2009, 12:22 AMChiều nay cuối tuần nên được rảnh tí,Viết thử đoạn chương trình bạn yêu cầu. 20 phút sau cũng biên dịch ra được File .hex Lấy cái EasyPIC ra nạp thử. Kết quả OK. #INCLUDE<16F877A.H> #INCLUDE<KhaiBaoTGhi_16F877A.h> #FUSES HS,NOWDT,NOPROTECT,NOLVP #USE DELAY(CLOCK=20000000) #DEFINE Led PORTB #use fast_io(b) int8 sck,slx,bx,bl,gt; main() { trisb=0; while(true) { sck=8; bl=0; portb=0; delay_ms(100); while(sck>0) { bx=1; slx=sck; while(slx>0) { gt=bl|bx; portb=gt; delay_ms(100); bx=bx<<1; slx--; } bl=gt; sck--; } } } ---------------------------------------------------------------------------------------- Trong File đính kèm có File .c và .hex anh nhé! Cuối tuần rồi,Em có hẹn nên đi đây. Cảm ơn bạn,nhưng ở đây mình muốn làm cho led có độ sáng thay đổi từ mạnh dần đến yếu dần và ngược lại (led sáng dần lên rồi tắt từ từ) tienchuan28-06-2009, 12:27 AMBạn muốn mỗi led sáng từ từ lên (tắt->sáng mờ mờ->sáng mờ->sáng) hay 1 dãy led sáng từng con con tăng lên? Bạn phải nói rõ. Chào bạn! mình muốn làm cho một dãy led sáng từ từ lên và tắt dần,nếu dược bạn chỉ giúp mình lam tên một led dơn trước di, còn dãy led hay một số led bất kì thì mình nghĩ từ từ làm sau. Cảm ơn bạn trước nha ! socola28-06-2009, 08:34 PMint8 sck,slx,bx,bl,gt; Mấy từ khai báo này viết tắt bởi chữ nào vậy anh Tuấn, anh giải thích cụ thể được ko anh tuan100728-06-2009, 10:49 PM+ Int ( Viết tắc của chử integer ) : là lệnh khai báo,Kiểu dữ liệu là số nguyên. - Miền giá trị từ -32,768 đến +32,767. + int8 sck,slx,bx,bl,gt: Là tên biến ,Do người lập trình chọn(Chú ý :Không trùng với lệnh,). -Biến là một vị trí trong bộ nhớ dùng lưu trữ giá trị nào đó mà chương trình sẽ lấy sử dụng -Mổi biến phải thuộc một kiểu dữ liệu. Thường có các kiểu dữ liệu :char,int,float,double. +Bạn có thể khai báo các tên biến tùy bạn thích,bạn thấy dể kiển soát khi viết chương trinh,..............miển sao hợp cú pháp. Ví Dụ :Chường trình Led PORTB sáng dịch sau đây vẩn chạy ok. #include<16f877A.h> #fuses HS,NOLVP,NOWDT,PUT #use delay(clock=8000000) // defind crystal = 8MHz //****************************** // main program start here //****************************** void main() { int THIEN,MINH; while(TRUE) { MINH=1; for (THIEN=0;THIEN<=8;THIEN++) { output_b(MINH); delay_ms(100); MINH=MINH<<1; } }} Chúc vui!!! ------------------------------------------------------------------------- File đính kèm có file .c và file .hex. socola28-06-2009, 11:11 PM+ int8 sck,slx,bx,bl,gt: Là tên biến ,Do người lập trình chọn(Chú ý :Không trùng với lệnh,). Ý e hỏi là tên biến đó anh viết tắt cũng phải có ý nghĩa gì ấy VD: TMe : Thiên Minh e Theo e hiểu mấy từ anh viết tắt như vầy: gt: giá trị bx: biến xoay bl: biến lưu sck và slx nhờ anh giải nghĩa dùm Thank cuongthinh29-06-2009, 09:49 AMmuốn nó sáng dần rồi tắt dần bạn chỉ việc dùng một timer đếm, đồng thời tạo ngắt. Trong chương trình xử lý ngắt ban tăng dần giá trị thanh ghi duty cycle, đồn thời tạo một biến đếm, khi nào đếm đủ số lượng rồi thì giảm dần duty cycle và tạo biến đếm lùi. Cái này có khó mấy đâu. đấy chỉ là một trong nhiều thuật toán thôi. Tốt nhất bạn nên vẽ lưu đồ thuật toán ra rồi hãy lập trình. Mơi làm quen thì phải đi từng bước thôi ketxanh16-07-2009, 03:44 PM+ int8 sck,slx,bx,bl,gt: Là tên biến ,Do người lập trình chọn(Chú ý :Không trùng với lệnh,). Ý e hỏi là tên biến đó anh viết tắt cũng phải có ý nghĩa gì ấy VD: TMe : Thiên Minh e Theo e hiểu mấy từ anh viết tắt như vầy: gt: giá trị bx: biến xoay bl: biến lưu sck và slx nhờ anh giải nghĩa dùm Thank sck: số chu kỳ slx: số lần xoay thanhnam17-07-2009, 10:35 AMMình muốn viết 1 chương trình làm cho led sáng dần và tắt dần với pic16f877A (viết bằng CCS).Mình cũng đã thử coi qua mấy luồng trong diễn đàn về điều chế độ rộng xung ,nhưng chưa hiểu được (củ chuối quá!!!) Vậy,Nhờ các Anh/Bạn nào làm về vấn đề này rồi chỉ cho em với !!! Em cảm ơn mọi người trước nha !!!! Chào bạn! Bạn có thể viết CT dịch ngỏ ra RB0-RB7 xong dịch ngược lại từ RB7-RB0(cái này đã có trong diễn đàn), các ngỏ ra được gắng với các giá trị điện trở khác nhau (thứ tự tăng dần có kèm theo diod) để thay đổi điện áp điều khiển (vd điều khiển chân B của transistor) từ đó điều khiển được dòng điện ra tải làm cho đèn sáng dần hoặc tối dần. Nếu cần mịn hơn thì có thể dùng thêm Port khác. Chúc bạn thành công. tienchuan17-07-2009, 04:42 PMchà,ý tưởng của bạn đơn giản nhưng cũng đã giải quyết được vấn đề của mình. Nhưng ở đây,mình muốn thay đổi bằng phần mềm, mình đang đọc datasheet về PWM của Pic877a,với lại mấy ngày nay đi suốt nên ko theo dõi được. Cảm ơn tất cả mọi người ! nhanh011229-07-2009, 12:43 AMTheo tui bạn thử sử dụng PWM với duty cycle thay đổi dần với tần số cố định (Một số cái còi "ngân" của ô tô cũng sử dụng phương pháp này... tiếng nhỏ dần). Còn về nguyên lý hoạt động thì dutycle càng ngắn thì thời gian sáng của led càng ngắn (chớp nhanh) -> tối và ngược lại. Như vậy khoảng thời gian để đèn từ tắt hẳn đến sáng hoàn toàn thì cũng chính là thời gian để duty cycle chạy từ 0 đến max. Ví dụ: void main() { setup_ccp1(CCP_PWM); setup_timer_2(T2_DIV_BY_1,25,1); set_pwm1_duty(0); while(true) { for(i=0;i<25;i++) { set_pwm1_duty(i); delay_ms(200); } } } Như vậy để từ tắt hẳn đến sáng nhất là 200x25=5000ms (5s). Cái này tui chưa làm thử, nhưng đây là ý tưởng của tui... bạn tham khảo xem sao :) xalachxoan11-11-2009, 01:54 PMTheo tui bạn thử sử dụng PWM với duty cycle thay đổi dần với tần số cố định (Một số cái còi "ngân" của ô tô cũng sử dụng phương pháp này... tiếng nhỏ dần). Còn về nguyên lý hoạt động thì dutycle càng ngắn thì thời gian sáng của led càng ngắn (chớp nhanh) -> tối và ngược lại. Như vậy khoảng thời gian để đèn từ tắt hẳn đến sáng hoàn toàn thì cũng chính là thời gian để duty cycle chạy từ 0 đến max. Ví dụ: void main() { setup_ccp1(CCP_PWM); setup_timer_2(T2_DIV_BY_1,25,1); set_pwm1_duty(0); while(true) { for(i=0;i<25;i++) { set_pwm1_duty(i); delay_ms(200); } } } Như vậy để từ tắt hẳn đến sáng nhất là 200x25=5000ms (5s). Cái này tui chưa làm thử, nhưng đây là ý tưởng của tui... bạn tham khảo xem sao :) Mình thử code của bạn, biên dịch và mô phỏng nhưng led ở chân CCP1 không có tín hiệu gì cả. Mình mô phỏng bằng proteus. Mình thấy pic16f877a chỉ có 2 chân băm xung thôi nhưng mình muốn sử dụng 8 chân thì làm như thế nào mong được chỉ giáo! Trân trọng cảm ơn! nhanh011211-11-2009, 03:55 PMMình thử code của bạn, biên dịch và mô phỏng nhưng led ở chân CCP1 không có tín hiệu gì cả. Mình mô phỏng bằng proteus. Mình thấy pic16f877a chỉ có 2 chân băm xung thôi nhưng mình muốn sử dụng 8 chân thì làm như thế nào mong được chỉ giáo! Trân trọng cảm ơn! Nếu thử với Proteus thì mình đã thử với đoạn code này trên PIC12F683... và đèn led có nhấp nháy mà bạn #include <12F683.h> #FUSES NOWDT //No Watch Dog Timer #FUSES INTRC_IO //Internal RC Osc, no CLKOUT #FUSES NOCPD //No EE protection #FUSES NOPROTECT //Code not protected from reading #FUSES NOMCLR //Master Clear pin used for I/O #FUSES NOPUT //No Power Up Timer #FUSES BROWNOUT //Reset when brownout detected #FUSES IESO //Internal External Switch Over mode enabled #FUSES FCMEN //Fail-safe clock monitor enabled #use delay(clock=4000000) int i; void main() { setup_ccp1(CCP_PWM); setup_timer_2(T2_DIV_BY_1,25,1); set_pwm1_duty(0); while(true) { for(i=0;i<25;i++) { set_pwm1_duty(i); delay_ms(200); } } } Còn với việc làm PWM nhiều kênh thì theo mình ko thể sử dụng chân CCPX đc. Mà phải sử dụng phương pháp quét lần lượt theo chu kỳ thời gian thôi. Ai có cách hay hơn thì post lên cho anh em tham khảo với. xalachxoan12-11-2009, 09:10 AMChào bạn Nhanh0112! Mình đã thử mô phỏng lại với PIC2f683, led nhấp nháy rồi! Nếu mạch thực thì nó sáng dần phải không bạn? Mình đã thử lại với PiC6f877a nhưng vẫn không được. Bạn thử mô phỏng xem sao? Còn giả sữ mình muốn điều khiển 8 led đơn cho nó sáng dần từ con 1 đến con thứ 8 thì không sử dụng chân CCPx được rồi! Vậy mình lập trình ra sao? Mong được anh em post lên cho y kiến với! Trân trọng cảm ơn! xalachxoan12-11-2009, 08:32 PMCác bạn xem thử sự lợi hại của PWM để điều khiển led nhé! Xem xong cho ý kiến để làm nhé các bạn! http://www.youtube.com/watch?v=SKe67xZG8Sg Thân! nhanh011213-11-2009, 09:41 AMChào bạn Nhanh0112! Mình đã thử mô phỏng lại với PIC2f683, led nhấp nháy rồi! Nếu mạch thực thì nó sáng dần phải không bạn? Mình đã thử lại với PiC6f877a nhưng vẫn không được. Bạn thử mô phỏng xem sao? Còn giả sữ mình muốn điều khiển 8 led đơn cho nó sáng dần từ con 1 đến con thứ 8 thì không sử dụng chân CCPx được rồi! Vậy mình lập trình ra sao? Mong được anh em post lên cho y kiến với! Trân trọng cảm ơn! đây là đoạn code nhỏ đc viết trong ngắt timer (với khoảng thời gian tràn là 1 xung lấy mẫu) Ở đây viết là xung mẫu là 500us, và chiều dài của 1 xung đc băm ra là 100 khoảng (là độ phân giải của nó ấy). Thời gian của 1 xung là T=500x100=50ms Đoạn code đc viết cho 4 chân (bạn có thể mở rộng tùy thích) Các giá trị độ rộng xung đc nạp 1 lần vào mảng Pulse[] từ phần tử 0 đến phần tử 3 tương ứng từ kênh 1 đến kênh 4, với giá trị:0-100 ví dụ pulse[0]=20;//0=min,100=max pulse[1]=45; ..... #int_timer0 //overflow every 500us void decode() { set_timer0(0); xung++; if(xung<pulse[0])//1 {output_high(PIN_D0);} else {output_low(PIN_D0);} if(xung<pulse[1])//2 {output_high(PIN_D1);} else {output_low(PIN_D1);} if(xung<pulse[2])//3 {output_high(PIN_D2);} else {output_low(PIN_D2);} if(xung<pulse[3])//4 {output_high(PIN_D3);} else {output_low(PIN_D3);} if(xung>100){xung=0;}//end of pulse } đoạn code này tui lấy từ một ứng dụng khác của tui, và đã sửa sang lại chút để phù hợp với đầu bài, nên chưa kịp test. Bạn nào có dịp làm thì test dùm luôn. Ai có ý tưởng nào hay về PWM nhiều kênh thì post lên tham khảo với nha zero07a13-11-2009, 02:35 PMtrang web hay thật. Demostone12-11-2010, 03:12 PMMình đang học PIC và có 1 bài tập như thế này.Ai giúp mình..tham khảo với:).. 1.Cho LED sáng lần lượt từ Rb7-RD0 mà vẫn giữ cho các LED trước sáng và ngược lạo 2.Sử Dụng chức năng ngắt ngoài cho LED sáng lần lượt như câu 1 3.Tương tự câu 2 nhưng sử dụng ngắt Timer1 vinhphucbk0821-11-2010, 11:14 AMcó bạn nào có kit mô phỏng led chasing trên protues k? share cho mình với! mình đang cần! thanks mọi người nhiều!! cuongero201220-12-2011, 10:15 PMcho mình hỏi: mình muốn post B chạy riêng 5 kiểu có 8 con led đơn, đồng thời post C cũng chạy 3 kiểu có 8 con led đơn. 2 dãy chạy đồng thời. mình viết chương trình bằng CCS, mình viết cách: outputb,outputc,delay rất phúc tạp khi viết nhiều kiểu led chạy. bạn nào biết dùng lệnh gì để tách ra chạy riêng biệt 2 post ko vBulletin® v3.8.11, Copyright ©2000-2026, vBulletin Solutions Inc.Từ khóa » Code 8 Led Sáng Dần 16f887
-
Led, Vi điều Khiển – Lập Trình Pic16F877A Hiệu ứng Tắt Dần – Bài 6
-
BÀI 2 - ĐIỀU KHIỂN LED SÁNG DẦN - PIC16F887 - YouTube
-
Bài 2: Dùng Vi đk 16F887 điều Khiển 8 Led đơn Sáng Dần ... - YouTube
-
Mô Phỏng Hiệu ứng 8 LED đơn Với PIC16F877A XC8 (P2)
-
Code Led Sáng Dần Tắt Dần
-
Code Led Sáng Dần Tắt Dần Và Tắt Dần !!!!, Lập Trình Arduino Cơ ...
-
BÀI 3 : HIỆU ỨNG LED PIC16F877A XC8 (PART 2) - Lập Trình PIC
-
LẬP TRÌNH PIC16F887
-
Bài 4-5: Lập Trình Sáng Dồn 8 LED
-
Bài 4-3: Lập Trình LED Sáng Lần Lượt
-
Viết Chương Trình Cho 8 Led Sáng Dồn - Dien Tu Viet Nam
-
Lập Trình PIC16F877A/887: Bài 2: 8 Led Sáng Dần Tắt Dần. Code Và ...