#include<reg52.h>
#define uchar unsigned char
unsigned char code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0x0F8,0x80,0x90}; //数码管显示
uchar dispbuf[4]={0,0,0,0};//用于记录比分
uchar databuf[4]={0,0,0,0};//红外读入四组信号
void delay(unsigned char m);//延迟函数
void display(); //显示函数
void detect(); //红外读数据函数
void IR_goto(); //按键功能操作
sbit P32=P3^2;
sbit P25=P2^5;
void main()
{
P2=0x10; //打开74HC573锁存使能
display();//调用显示函数
while(1)
{
if(!P32) detect();//一直循环直到读到红外信号
display();
}
}
void display()
{
unsigned char dispdata; //数值数据
unsigned char i,j=0xFE; //j=11111110 让四个数码管循环显示
for(i=0;i<4;i++)
{
P2=j;
dispdata=dispbuf[i];
P0=table[dispdata];//显示数码管的数字
delay(200);//延时
j=(j<<1)|0x01; //j位左移与00000001或
if(j==0xEF)j=0xFE;
}
if(dispbuf[0]>dispbuf[2])
P1=0xBF; //甲队领先
else if(dispbuf[0]==dispbuf[2])
if(dispbuf[1]>dispbuf[3])
P1=0xBF; //甲队领先
else if(dispbuf[1]==dispbuf[3])
P1=0xFF; //平手
else
P1=0x7F; //乙队领先
else P1=0x7F; //乙队领先
}
void detect() //读取红外模块
{
uchar i;
delay(250);
if(P32) return;
delay(250);
if(P32) return;
delay(250);
if(P32) return;
delay(250);
if(P32) return;
delay(250);
if(P32) return;
delay(250);
if(P32) return;
delay(250);
if(P32) return;
delay(250);
if(P32) return;
delay(250);
if(P32) return;
delay(250);
if(P32) return;
delay(250);
if(P32) return; //一旦有高电平则退出
while(!P32) {} //等到p32是高电平,否则一直循环避开9ms脉冲
delay(250);
delay(250);
delay(250);
delay(250);
delay(200); //延时约4.5
if(!P32) //低电平认为是连发码
{
IR_goto();
display();
return;
}
delay(250);
delay(250);
delay(250);
delay(250);
delay(200); //延时约4.5避开结果码
while(!P32) {} //等待第一位高电平信号
for(i=0;i<4;i++) //以下为4组数据码读取
{
while(!P32) {}
delay(210);
delay(210);
if(P32)
{
databuf[i]=databuf[i]|0x01;
delay(250);
delay(250);
}
else
databuf[i]=databuf[i]&0xFE;
while(!P32) {}
delay(210);
delay(210);
if(P32)
{
databuf[i]=databuf[i]|0x02;
delay(250);
delay(250);
}
else
databuf[i]=databuf[i]&0xFD; //
while(!P32) {}
delay(210);
delay(210);
if(P32)
{
databuf[i]=databuf[i]|0x04;
delay(250);
delay(250);
}
else
databuf[i]=databuf[i]&0xFB; //
while(!P32) {}
delay(210);
delay(210);
if(P32)
{
databuf[i]=databuf[i]|0x08;
delay(250);
delay(250);
}
else
databuf[i]=databuf[i]&0xF7; //
while(!P32) {}
delay(210);
delay(210);
if(P32)
{
databuf[i]=databuf[i]|0x10;
delay(250);
delay(250);
}
else
databuf[i]=databuf[i]&0xEF; //
while(!P32) {}
delay(210);
delay(210);
if(P32)
{
databuf[i]=databuf[i]|0x20;
delay(250);
delay(250);
}
else
databuf[i]=databuf[i]&0xDF; //
while(!P32) {}
delay(210);
delay(210);
if(P32)
{
databuf[i]=databuf[i]|0x40;
delay(250);
delay(250);
}
else
databuf[i]=databuf[i]&0xBF; //
while(!P32) {}
delay(210);
delay(210);
if(P32)
{
databuf[i]=databuf[i]|0x80;
delay(250);
delay(250);
}
else
databuf[i]=databuf[i]&0x7F; //
}
IR_goto(); //判断键值判断
display(); //显示
}
void IR_goto()
{
uchar i;
databuf[2]=~databuf[2]; //与反码对比判断
if(databuf[2]!=databuf[3]) return;
P2=P2&0xEF;
delay(250);
P2=P2|0x10;
if(databuf[3]==0xE9) //按键"0"判断显示
{
for(i=0;i<4;i++)
dispbuf[i]=0x00; //显示全部清零
}
if(databuf[3]==0xF3) //按键"1"判断显示
{
dispbuf[1]=dispbuf[1]+1;
if(dispbuf[1]>=10)
{
dispbuf[0]=dispbuf[0]+1;
dispbuf[1]=dispbuf[1]-10;
}
P1=0xFE;
delay(250);
delay(250);
delay(250);
delay(250);
}
if(databuf[3]==0xE7) //按键"2"判断显示
{
dispbuf[1]=dispbuf[1]+2;
if(dispbuf[1]>=10)
{
dispbuf[0]=dispbuf[0]+1;
dispbuf[1]=dispbuf[1]-10;
}
P1=0xFD;
delay(250);
delay(250);
delay(250);
delay(250);
}
if(databuf[3]==0xA1) //按键"3"判断显示
{
dispbuf[1]=dispbuf[1]+3;
if(dispbuf[1]>=10)
{
dispbuf[0]=dispbuf[0]+1;
dispbuf[1]=dispbuf[1]-10;
}
P1=0xFB;
delay(250);
delay(250);
delay(250);
delay(250);
}
if(databuf[3]==0xF7) //按键"4"判断显示
{
dispbuf[3]=dispbuf[3]+1;
if(dispbuf[3]>=10)
{
dispbuf[2]=dispbuf[2]+1;
dispbuf[3]=dispbuf[3]-10;
}
P1=0xF7;
delay(250);
delay(250);
delay(250);
delay(250);
}
if(databuf[3]==0xE3) //按键"5"判断显示
{
dispbuf[3]=dispbuf[3]+2;
if(dispbuf[3]>=10)
{
dispbuf[2]=dispbuf[2]+1;
dispbuf[3]=dispbuf[3]-10;
}
P1=0xEF;
delay(250);
delay(250);
delay(250);
delay(250);
}
if(databuf[3]==0xA5) //按键"6"判断显示
{
dispbuf[3]=dispbuf[3]+3;
if(dispbuf[3]>=10)
{
dispbuf[2]=dispbuf[2]+1;
dispbuf[3]=dispbuf[3]-10;
}
P1=0xDF;
delay(250);
delay(250);
delay(250);
delay(250);
}
for(i=0;i<4;i++)
databuf[i]=0x00;
return;
}
void delay(unsigned char m)
{
while(--m);
}

鹰忍
- 粉丝: 95
最新资源
- 软件测试简历的自我评价(1).docx
- 互联网信息时代的人工智能应用(1).docx
- 第九章-软件测试(1).ppt
- 弹幕视频网站传播分析(1).docx
- 网络传媒推广系统软件设计文档(1)(1).doc
- 课程设计基于单片机红外防盗报警器的设计(1).doc
- 【推荐下载】宝马工厂里的智能机器人-高度自动化提升质量与效率(1).doc
- excel合并工作簿和工作表的代码(1).doc
- 基于互联网+视域下大学生创新创业教育路径研究(1).docx
- 塞曼效应计算机辅助软件设计论文(1)(1).docx
- 网站前台设计与实现(毕业论文)(1).doc
- 单片机电子称优秀课程设计.doc
- 2023年自考项目管理软件重点(1).docx
- 中职计算机教学实践中存在的问题和对策研究(1).docx
- 基于MATLAB的ASK调制解调实现(1).doc
- 企业信息化常见缩略语.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



评论4