#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芯片保存定时时间,根据写的程序,在两次中断间隙时间过短了,没有足够的时间写进存储芯片,怎么解决啊?
|