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