资源简介

基于红外线的单片机贪吃蛇,51单片机系列,需要红外遥控器和接收器,开发板

资源截图

代码片段和文件信息

#include “reg51.h“      
#include 
#include 

typedef unsigned int u16;
typedef unsigned char u8;

sbit IRIN=P3^2;
sbit SRCLK=P3^6;
sbit RCLK=P3^5;
sbit SER=P3^4;

u8 IrValue[6];
u8 Time;

u8 see[]={00000000};
u8 t = 2; //记录当前运动方向初始为1向上
u8 she[64] = {0};
u8 count;
u8 ledwei[]={0x7f0xbf0xdf0xef0xf70xfb0xfd0xfe};
void init(){ //头插初始化链表开始蛇的位置在22
IT0=1;//下降沿触发
EX0=1;//打开中断0允许
EA=1; //打开总中断
IRIN=1;//初始化端口
for(count = 0;count<64;count++) she[count] = 0;
count = 1;
count++;
count++;
count++;
she[63] = 77;
she[62] = 24;
she[61] = 23;
she[60] = 22;

}


void delay(u16 i)
{
while(i--); 
}

void show(){
u8 i x yk=0;
u8 j tf[20];
for(i = 63;i > 43;i--){
tf[63-i] = she[i];
}

    for(i=0;i<20;++i)//i用来遍历数组
    {
        for(j=i+1;j<20 && tf[i]-tf[j];++j);
        if(!(j-20))//没有重复元素
            tf[k++]=tf[i];//可将date[]看作两个数组
    }

for(j = 0; j < 8; j++) see[j] = 0;
j = 0;
for(i = 0; i < 20; i++){
x = tf[i]/10;
y = tf[i]%10;
j = 1 << y-1;
see[x-1] += j;
}
}


void Hc595SendByte(u8 dat)
{
u8 a;
SRCLK=0;
RCLK=0;
for(a=0;a<8;a++)
{
SER=dat>>7;
dat<<=1;

SRCLK=1;
_nop_();
_nop_();
SRCLK=0;
}

RCLK=1;
_nop_();
_nop_();
RCLK=0;
}
void DigDisplay()
{
u8 i = 0;
P0=0x7f;
for (i = 0; i < 8; ++i)
{
P0 =ledwei[i];
Hc595SendByte(see[i]);
delay(100);
Hc595SendByte(0x00);  //消隐 
}
}

/*
启动:
1:上 2:左 3:下 4:右
*/
void run(u8 t){
u8 i; 
for(i =64-count;i < 62; i++){
she[i] = she[i+1];
}
switch(t){
case 1: she[62] += 1; if((she[62]%10)>8) she[62] = (she[62]/10)*10+1; break;
case 2: she[62] -= 10; if((she[62]/10)<1) she[62] = (she[62]%10)+80; break;
case 3: she[62] -= 1; if((she[62]%10)<1) she[62] = (she[62]/10)*10+8; break;
case 4: she[62] += 10; if((she[62]/10)>8) she[62] = (she[62]%10)+10; break;
}
if(she[62]==she[63]){
she[63] = (((rand()%8)+1)*10)+((rand()%8)+1);
count++;
for(i =64-count;i < 62; i++){
she[i] = she[i+1];
}
switch(t){
case 1: she[62] += 1; if((she[62]%10)>8) she[62] = (she[62]/10)*10+1; break;
case 2: she[62] -= 10; if((she[62]/10)<1) she[62] = (she[62]%10)+80; break;
case 3: she[62] -= 1; if((she[62]%10)<1) she[62] = (she[62]/10)*10+8; break;
case 4: she[62] += 10; if((she[62]/10)>8) she[62] = (she[62]%10)+10; break;
}
for(i = 0;i < 5;i++){
show();
DigDisplay();
}
}

}


void main(){
u16 i = 0;
init();
show();
while(1){
DigDisplay();
i++;
show();
if(i>40){
if(IrValue[2]==24){
t = 1;
}else if(IrValue[2]==8){
t = 2;
}else if(IrValue[2]==82){
t = 3;
}else{
t = 4;
}
run(t);
i = 0;
}
}
}

void ReadIr() interrupt 0
{
u8 jk;
u16 err;
Time=0;          
delay(700); //7ms
if(IRIN==0)   //确认是否真的接收到正确的信号
{  

err=1000;       //1000*10us=10ms超过说明接收到错误的信号
/*当两个条件都为真是循环,如果

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        4385  2019-05-26 22:52  shank.c
     文件      458240  2019-07-11 19:43  单片机课设报告.doc

评论

共有 条评论