Vào thẳng vấn đề nhé. Mình có mạch như thế này
mình dự định dùng 1838 thu sóng từ chiếc remote, xung thu dc là xung đảo, đưa vào PIC 16F877a, dùng chức năng ccp bắt xung và đo độ rộng cả T on và T off lưu vào 1 biến mảng, khi hoàn thành sẽ có 1 led nhấp nháy 3 lần rồi xuất lần lượt ra 3 led 7 đoạn, mạch dùng thạch anh 20 MHz, đo dc từ 0.2 us -> 13 ms, trong mạch mình mô phỏng xung vào bằng 1 bộ phát 10 xung có T on=5ms, T off=2ms. Nhưng chưa thành công, mình code bằng CCS, các bác xem code giúp mình nhé
http://www.mediafire.com/download.php?79tkzhtxhpxkuk0
mình dự định dùng 1838 thu sóng từ chiếc remote, xung thu dc là xung đảo, đưa vào PIC 16F877a, dùng chức năng ccp bắt xung và đo độ rộng cả T on và T off lưu vào 1 biến mảng, khi hoàn thành sẽ có 1 led nhấp nháy 3 lần rồi xuất lần lượt ra 3 led 7 đoạn, mạch dùng thạch anh 20 MHz, đo dc từ 0.2 us -> 13 ms, trong mạch mình mô phỏng xung vào bằng 1 bộ phát 10 xung có T on=5ms, T off=2ms. Nhưng chưa thành công, mình code bằng CCS, các bác xem code giúp mình nhé
Code:
#include <main.h> #include <math.h> #include <def_877a.h> int16 on,off; //on: T on, off: T off int8 count=0; //bien dem xung (on: tang 1, off: tang 1, nghia la: moi chu ky xung tang 2) int8 a[]={}; //mang chua gia tri do rong xung int8 const b[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};// ma led 7 doan 0-9 void xuat7seg (int8 x, int8 y, int8 z) //ct con xuat 3 con so ra led 7 doan { int8 i; for(i=0;i<=25;i++) { PORTB=0b11111110; PORTD=b[z]; delay_ms(13); PORTD=255; PORTB=0b11111101; PORTD=b[y]; delay_ms(13); PORTD=255; PORTB=0b11111011; PORTD=b[x]; delay_ms(13); PORTD=255; } } #int_TIMER1 //khi xay ra ngat tmr1: xoa co ngat ->led o RA0 nhay 3 lan void TIMER1_isr(void) //->lan luot xuat cac gia tri da luu trong mang a ra { // theo thu tu, moi gia tri hien ra trong 1s tmr1if=0; //xuat lien tuc den khi gap ky tu "null" thi reset cpu int8 i,x,y,z; //tiep tuc do tim xung RA0=1; delay_ms(500); RA0=0; delay_ms(500); RA0=1; delay_ms(500); RA0=0; delay_ms(500); RA0=1; delay_ms(500); RA0=0; delay_ms(500); for(i=0;i!='\0';i++) { x=a[i]/100; y=(a[i]%100)/10; z=(a[i]%100)%10; xuat7seg(x,y,z); } reset_cpu(); } #int_CCP1 //ngat ccp1 do tim canh xuong (do T on) void CCP1_isr(void) //khi xay ra ngat: { ccp1if=0; //xoa co ngat on=get_timer1(); //lay gia tri tu tmr1 (gia tri tu 0-65535) count++; //tang bien dem a[count]=on/500; //luu gia tri do, tmr1 tang 1dv sau 0.2us nen lay gia tri *0.2, /1000 ra ms, *10 de lay them 1 so thap phan sau dau "," set_timer1(0); //reset tmr1 do T off } #int_CCP2 //ngat ccp1 do tim canh len (do T off) void CCP2_isr(void) //cach do tuong tu nhu tren { ccp2if=0; off=get_timer1(); count++; a[count]=off/500; set_timer1(0); } void main() { setup_adc_ports(NO_ANALOGS); setup_adc(ADC_CLOCK_DIV_2); setup_spi(SPI_SS_DISABLED); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); setup_timer_2(T2_DISABLED,0,1); setup_ccp1(CCP_CAPTURE_FE); setup_ccp2(CCP_CAPTURE_RE); setup_comparator(NC_NC_NC_NC); enable_interrupts(INT_TIMER1); enable_interrupts(INT_CCP1); enable_interrupts(INT_CCP2); enable_interrupts(GLOBAL); //TODO: User Code while(1) { TRISA0=0; RA0=0; TRISB=0; TRISD=0; PORTB=0xff; PORTD=0xff; } }
Comment