您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 基于51单片机的贪吃蛇c51程序
/*-----------------------------------------------名称:基于51单片机8x8点阵显示的贪吃蛇游戏编写:储浙荣时间:2013.4.26--2013.5.4说明:使用hc595驱动双色点阵使用德飞莱51单片机开发板(DOFLY-V2.3)依据程序中的管脚定义用杜邦线接好管脚程序可以直接使用。程序部分参考自网上和学习板配套资料------------------------------------------------*/#includereg52.h//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#includeintrins.h/*------------------------------------------------硬件端口定义------------------------------------------------*/sbitLATCH=P1^0;//锁存sbitSRCLK=P1^1;//时钟sbitSER=P1^2;//数据sbitLATCH_B=P2^2;//锁存sbitSRCLK_B=P2^1;//时钟sbitSER_B=P2^0;//锁存sbitLED=P1^3;//结束提示灯//sbitkey1=P3^0;//上//sbitkey2=P3^1;//下//sbitkey3=P3^2;//左//sbitkey4=P3^3;//右//sbitkey5=P3^4;//暂停/*------------------------------------------------全局变量定义------------------------------------------------*/unsignedcharx[30],y[30];//蛇身坐标unsignedcharspeed=10;//控制速度变量unsignedchardx=0,dy=1;//控制转向变量,初始化为向左运动bitstop_start,inverse;//开始/暂停标志位,颜色显示标志位bitup=1,down=1,left=1,right=1;//上下左右使能控制位unsignedchartab[8];//显示缓冲数组unsignedcharsegout[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//8列扫描/*------------------------------------------------uS延时函数,含有输入参数unsignedchart,无返回值unsignedchar是定义无符号字符变量,其值的范围是0~255这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5uS------------------------------------------------*/voidDelayUs2x(unsignedchart){while(--t);}/*------------------------------------------------mS延时函数,含有输入参数unsignedchart,无返回值unsignedchar是定义无符号字符变量,其值的范围是0~255这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/voidDelayMs(intt)//大致延时1mS{while(t--){DelayUs2x(245);DelayUs2x(245);}}/*------------------------------------------------发送字节程序------------------------------------------------*/voidSendByte(unsignedchardat){unsignedchari;for(i=0;i8;i++){SRCLK=0;SER=dat&0x80;dat=1;SRCLK=1;}}/*------------------------------------------------发送双字节程序595级联,n个595,就需要发送n字节后锁存------------------------------------------------*/voidSend2Byte(unsignedchardat1,unsignedchardat2){SendByte(dat1);SendByte(dat2);}/*------------------------------------------------595锁存程序595级联发送数据后,锁存有效------------------------------------------------*/voidOut595(void){LATCH=0;_nop_();LATCH=1;}/*------------------------------------------------发送位码字节程序使用另外一片单独595------------------------------------------------*/voidSendSeg(unsignedchardat){unsignedchari;for(i=0;i8;i++)//发送字节{SRCLK_B=0;SER_B=dat&0x80;dat=1;SRCLK_B=1;}LATCH_B=0;//锁存_nop_();LATCH_B=1;}/*--------------------------------------------------------------按键扫描函数--------------------------------------------------------------*/voidkey_scan(){switch(P3){case0xfe:if(up)//up{dx=-1;dy=0;//执行向上功能down=0;left=1;right=1;//向下功能失效,其他功能可用}break;case0xfd:if(down)//down{dx=1;dy=0;up=0;left=1;right=1;}//break;case0xfb:if(left)//left{dx=0;dy=1;down=1;up=1;right=0;}//break;case0xf7:if(right)//right{dx=0;dy=-1;down=1;left=1;up=1;}//break;case0xef://暂停/开始键DelayMs(10);//延时去抖if(P3==0xef)//再次确认按键是否按下stop_start=~stop_start;//暂停/开始标志位取反(按一下暂停再按一下开始)while(P3==0xef);//等待按键释放break;case0xbf:DelayMs(10);//延时去抖if(P3==0xbf)//再次确认按键是否按下speed+=2;//速度增大while(P3==0xbf);//等待按键释放break;case0x7f:DelayMs(10);//延时去抖if(P3==0x7f)//再次确认按键是否按下speed-=2;//速度减小while(P3==0x7f);//等待按键释放break;default:break;}}/*--------------------------------------------------------------清除显示缓冲区,即清屏--------------------------------------------------------------*/voidclr_ram(void){unsignedchari;for(i=0;i8;i++)tab[i]=0x00;//逐个清除数组内容}/*--------------------------------------------------------------画点函数,擦点或者绘点点阵左上角坐标为(0,0)右下角坐标为(7,7)横坐标为x:0~7纵坐标为y:0~7k=1--绘点k=0--擦点-------------------------------------------------------------*/voidpoint1(unsignedcharx,unsignedchary,bitk){if(k)tab[y]|=0x01x;//保留原始点,绘制新点elsetab[y]&=~(0x01x);//保留其它点,只擦其中一个点}/*------------------------------------------------------------定时器0初始化--------------------------------------------------------------*/voidT0_init(void){TMOD|=0x01;TH0=0xf8;//2msTL0=0x36;IE|=0x82;TR0=1;}/*--------------------------------------------------------------定时器1初始化--------------------------------------------------------------*/voidT1_init(void){TMOD|=0x01;TH1=0x00;//65msTL1=0x00;IE|=0x88;TR1=1;}/*------------------------------------------------主程序------------------------------------------------*/voidmain(){unsignedchari=0,foodx,foody;//食物坐标unsignedcharnum=2;//蛇长度bitfood,over;//食物和结束标志位IT0=1;//外部中断0(即P3^2脚)选择边沿触发,下降沿有效EX0=1;//打开外部中断0T0_init();//定时器0初始化T1_init();//定时器1初始化stop_start=0;//开始/暂停标志位置为开始while(1){x[0]+=dx;y[0]+=dy;//根据dxdy不同的值来使蛇头移动x[0]&=0x07;y[0]&=0x07;//作用穿墙,x或y加到8时变为7if(!food)//放置食物{again:foodx=TL0&0x07;//随机取食物坐标,0~7,但不会超过7foody=TH0&0x07;for(i=0;inum;i++){if(foodx==x[i]&&foody==y[i])//若食物与蛇身重叠,gotoagain;//则重放食物。}//inverse=0;//颜色标志位置0,显示红色point1(foodx,foody,1);//显示食物food=1;//置食物标志位}if(x[0]==foodx&&y[0]==foody)//吃到食物{num++;//蛇长增加1节food=0;//清食物标志位}for(;stop_start;);//按下暂停键程序在此进入死循环//inverse=1;//颜色标志位置1,显示绿色for(i=0;inum;i++)//显示蛇身point1(x[i],y[i],1);point1(x[i],y[i],0);//清蛇尾for(i=1;inum;i++)//判断是否自撞{if((x[0]==x[i])&&(y[0]==y[i]))over=1;//置结束标志位}for(i=0;ispeed;i++)DelayMs(15);//蛇运动速度for(i=0;inum;i+
本文标题:基于51单片机的贪吃蛇c51程序
链接地址:https://www.777doc.com/doc-6126824 .html