#include <reg52.h>
#include <lcd.h>
#include <epprom.h>
unsigned int temp_low_pulse1;
unsigned int temp_low_pulse0;
unsigned int temp_high_pulse1;
unsigned int temp_high_pulse0;
unsigned int count;
unsigned char write_enable;
sbit led8=P0^7;
sbit key=P0^0;
sbit key1=P0^1;
sbit key2=P0^2;
/********* 延時1S ******************************************/
void delay_1s()
{
unsigned int i,j;
for(i=5;i>0;i--)
for(j=110;j>0;j--);
}
void initial()
{
EA=1; //開啟總中斷
EX1=1; //開啟外部中斷1
IT1=1; //外部中斷1為下降沿有效
TMOD=0x19; //定時器1,2 方式為1,且T0 GATE位有效
TH0=0x00;
TL0=0x00;
TH1=0x00;
TL1=0x00;
count=0;
}
void main()
{
unsigned char temp,temp_ge,temp_shi,temp_bai,num_ge,num_shi,num_bai,num_qian;
unsigned int count_qian,count_bai,count_shi,count_ge,num;
initial();
init();
lcd_int();
num=0;
while(1)
{
if(key==0)
{
num++;
if(num==2048)
num=0;
while(!key);
}
if(key1==0)
{
if(num==0)
num=2048;
num--;
while(!key1);
}
if(count>=2048)
count=0;
temp=read_add(num);
temp_bai=temp/100;
temp_shi=temp%100/10;
temp_ge=temp%10;
num_qian=num/1000;
num_bai=num%1000/100;
num_shi=num%100/10;
num_ge=num%10;
count_qian=count/1000;
count_bai=count%1000/100;
count_shi=count%100/10;
count_ge=count%10;
write_com(0x80);
write_date(0x30+temp_bai);
write_com(0x81);
write_date(0x30+temp_shi);
write_com(0x82);
write_date(0x30+temp_ge);
write_com(0x84);
write_date(0x30+num_qian);
write_com(0x85);
write_date(0x30+num_bai);
write_com(0x86);
write_date(0x30+num_shi);
write_com(0x87);
write_date(0x30+num_ge);
write_com(0x89);
write_date(0x30+count_qian);
write_com(0x8a);
write_date(0x30+count_bai);
write_com(0x8b);
write_date(0x30+count_shi);
write_com(0x8c);
write_date(0x30+count_ge);
if (write_enable==1)
{
write_add(count,5); //將紅外信號的低電平的值寫入儲存器COUNT地址內
delay_1s();
write_add(count+1,6); //將紅外信號的低電平的值寫入儲存器COUNT+1地址內
delay_1s();
write_add(count+2,7); //將紅外信號的高電平的值寫入儲存器COUNT+2地址內
delay_1s();
write_add(count+3,8); //將紅外信號的高電平的值寫入儲存器COUNT+3地址內
delay_1s();
write_enable=0;
}
}
}
void int1() interrupt 2
{
EX1=0; //關外部中斷1
TR0=0; //關閉定時器0
TR1=0; //關閉定時器1
temp_low_pulse1=TH1-TH0; //將TH1減去TL0的值(即紅外信號的低電平)賦予temp_low_pulse1
temp_low_pulse0=TL1-TL0; //將TL1減去TL0的值(即紅外信號的低電平)賦予temp_low_pulse0
temp_high_pulse1=TH0; //將TH0值(即紅外信號的高電平值)賦予temp_high_pulse1
temp_high_pulse0=TL0; //將TL0值(即紅外信號的高電平值)賦予temp_high_pulse0
write_enable=1;
TH0=0x00; //TH0清零
TL0=0x00; //TL0清零
TH1=0x00; //TH1清零
TL1=0x00; //TL1清零
TR0=1; //啟動定時器0
TR1=1; //啟動定時器1
led8=!led8;
count=count+4;
EX1=1; //開外部中斷1
}
本人編寫了一個紅外接收的程序,紅外接收管接收端接單片機中斷1,接收的紅外波形以后,開啟T0,T1定時器,對紅外波形的高低電平及時,其中中斷下降沿開啟T1計時,電平升高后開啟T0計時,T1-T0的時間就是紅外波形的低電平時間,我利用AT24C16芯片保存定時時間,根據寫的程序,在兩次中斷間隙時間過短了,沒有足夠的時間寫進存儲芯片,怎么解決啊?
頂
歡迎光臨 (http://m.zg4o1577.cn/bbs/) | Powered by Discuz! X3.1 |