制作出來的實物圖如下:
88efcac40cccc2ae9c4204df86cae84.jpg (125.68 KB, 下載次數: 50)
下載附件
2020-5-2 09:44 上傳
bbf785d391f593c10f628eb8580af9c.jpg (127.39 KB, 下載次數: 70)
下載附件
2020-5-2 09:44 上傳
88efcac40cccc2ae9c4204df86cae84.jpg (125.68 KB, 下載次數: 78)
下載附件
2020-5-2 09:44 上傳
單片機源程序如下:
#include <reg52.h>
typedef unsigned int u16;
typedef unsigned char u8;
sbit l1=P0^0;
sbit l2=P0^1;
sbit l3=P0^2;
sbit l4=P0^3;
sbit l5=P0^4;
sbit l6=P0^5;
sbit l7=P1^0;
sbit l8=P1^1;
sbit l9=P1^2;
sbit l10=P1^3;
sbit l11=P1^4;
sbit l12=P1^5;
sbit IRIN=P3^2;
u8 IrValue[14];
u8 Time;a;z1;z2;s1;s2;s3;s4;s5;s6;s7;s8;s9;s10;s11;s12;
u8 DisplayData[14];
u8 code smgduan[17]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0X76};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F、H的顯示碼
void delay(u16 i)
{
while(i--);
}
void xs()
{
if(z1==0x06&&z2==0x7d&&s1==1)
{
l1=0;
}
if(z1==0x06&&z2==0x7d&&s1==2)
{
l1=1;
s1=0;
}
if(z1==0x06&&z2==0x6f&&s2==1)
{
l2=0;
}
if(z1==0x06&&z2==0x6f&&s2==2)
{
l2=1;
s2=0;
}
if(z1==0x3f&&z2==0x5e&&s3==1)
{
l3=0;
}
if(z1==0x3f&&z2==0x5e&&s3==2)
{
l3=1;
s3=0;
}
if(z1==0x3f&&z2==0x39&&s4==1)
{
l4=0;
}
if(z1==0x3f&&z2==0x39&&s4==2)
{
l4=1;
s4=0;
}
if(z1==0x06&&z2==0x7f&&s5==1)
{
l5=0;
}
if(z1==0x06&&z2==0x7f&&s5==2)
{
l5=1;
s5=0;
}
if(z1==0x6d&&z2==0x79&&s6==1)
{
l6=0;
}
if(z1==0x6d&&z2==0x79&&s6==2)
{
l6=1;
s6=0;
}
if(z1==0x3f&&z2==0x7f &&s7==1)
{
l7=0;
}
if(z1==0x3f&&z2==0x7f &&s7==2)
{
l7=1;
s7=0;
}
if(z1==0x06&&z2==0x39&&s8==1)
{
l8=0;
}
if(z1==0x06&&z2==0x39&&s8==2)
{
l8=1;
s8=0;
}
if(z1==0x6d&&z2==0x77&&s9==1)
{
l9=0;
}
if(z1==0x6d&&z2==0x77&&s9==2)
{
l9=1;
s9=0;
}
if(z1==0x66&&z2==0x5b&&s10==1)
{
l10=0;
}
if(z1==0x66&&z2==0x5b&&s10==2)
{
l10=1;
s10=0;
}
if(z1==0x6d&&z2==0x5b&&s11==1)
{
l11=0;
}
if(z1==0x6d&&z2==0x5b&&s11==2)
{
l11=1;
s11=0;
}
if(z1==0x66&&z2==0x77&&s12==1)
{
l12=0;
}
if(z1==0x66&&z2==0x77&&s12==2)
{
l12=1;
s12=0;
}
if(z1==0x66&&z2==0x6d)
{
P0=0xff;
P1=0xff;
}
if(z1==0x66&&z2==0x66)
{
P0=0x00;
P1=0x00;
}
}
void IrInit()
{
IT0=1;//下降沿觸發
EX0=1;//打開中斷0允許
EA=1; //打開總中斷
IRIN=1;//初始化端口
}
void main()
{
IrInit();
while(1)
{
xs();
}
}
void ReadIr() interrupt 0
{
u8 j,k;
u16 err;
Time=0;
delay(700); //7ms
if(IRIN==0) //確認是否真的接收到正確的信號
{
err=1000; //1000*10us=10ms,超過說明接收到錯誤的信號
/*當兩個條件都為真是循環,如果有一個條件為假的時候跳出循環,免得程序出錯的時
侯,程序死在這里*/
while((IRIN==0)&&(err>0)) //等待前面9ms的低電平過去
{
delay(1);
err--;
}
if(IRIN==1) //如果正確等到9ms低電平
{
err=500;
while((IRIN==1)&&(err>0)) //等待4.5ms的起始高電平過去
{
delay(1);
err--;
}
for(k=0;k<4;k++) //共有4組數據
{
for(j=0;j<8;j++) //接收一組數據
{
err=60;
while((IRIN==0)&&(err>0))//等待信號前面的560us低電平過去
{
delay(1);
err--;
}
err=500;
while((IRIN==1)&&(err>0)) //計算高電平的時間長度。
{
delay(10); //0.1ms
Time++;
err--;
if(Time>30)
{
return;
}
}
IrValue[k]>>=1; //k表示第幾組數據
if(Time>=8) //如果高電平出現大于565us,那么是1
{
IrValue[k]|=0x80;
}
Time=0; //用完時間要重新賦值
}
}
}
if(IrValue[2]!=~IrValue[3])
{
return;
}
z1 = smgduan[IrValue[2]/16];
z2= smgduan[IrValue[2]%16];
if(z1==0x06&&z2==0x7d)
{
s1++;
}
if(z1==0x06&&z2==0x6f)
{
s2++;
}
if(z1==0x3f&&z2==0x5e)
{
s3++;
}
if(z1==0x3f&&z2==0x39)
{
s4++;
}
if(z1==0x06&&z2==0x7f)
{
s5++;
}
if(z1==0x6d&&z2==0x79)
{
s6++;
}
if(z1==0x3f&&z2==0x7f )
{
s7++;
}
if(z1==0x06&&z2==0x39)
{
s8++;
}
if(z1==0x6d&&z2==0x77)
{
s9++;
}
if(z1==0x66&&z2==0x5b)
{
s10++;
}
if(z1==0x6d&&z2==0x5b)
{
s11++;
}
if(z1==0x66&&z2==0x77)
{
s12++;
}
}
}
|