硬件设计

  • 基于C51作为MCU
  • 一块8X8点阵作为游戏的显示器
  • 四个按键作为操控按键

仿真图:

程序设计


#include <at89x51.h>
#include "18b20.h"
#include "1302.h"
#include "12864.h"
#include "zifu.h"
uchar k,direction;
bit flag;
bit flag5=0;              //flag5是外部中断1的标志位 flag1是步进标志
uchar p,dengji;               //定时次数
bit flag1=0;
systemtime realtime;
bit first=1;                  //中断次数控制
void dingshi() interrupt 1  using 1  //定时程序.产生步进时间
{if(p--){TL0=0;TH0=0xa0;flag1=0;}else{flag1=1;TL0=0;TH0=0x00;p=20-(dengji>>1);}}
/*开始确认暂停键的判断*/
void zhongduan1() interrupt 2 using 2
{if(!flag5){flag5=1;}else{flag5=0;}
}
void zhongduan() interrupt 0 using 0 {uchar i=0;if(first)         //FIRST=1;打开方向按键判断标志{first=0;      k=(P2>>6);      k=k&0x03;               if(flag){if(k==1)     direction=3;//左if(k==2)   direction=1;//右}else{if(k==0)    direction=4;//上if(k==3)  direction=2;//下}}}/*显示四个小格的方块*/
void playbuf(uchar buff,char offsetx,char offsety)
{//i=(moxing+((dat&0xf0)|((dat&0x0f)<<2)));change1((((*(moxing+((buff&0xf0)+((buff&0x0f)<<2))))&0xf0)>>4)+offsetx,((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))))&0x0f)+offsety);change1((((*((moxing+((buff&0xf0)+((buff&0x0f)<<2))+1)))&0xf0)>>4)+offsetx,((*(((moxing+((buff&0xf0)|((buff&0x0f)<<2))))+1))&0x0f)+offsety);change1((((*(((moxing+((buff&0xf0)|((buff&0x0f)<<2))))+2))&0xf0)>>4)+offsetx,((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0x0f)+offsety);change1((((*(((moxing+((buff&0xf0)|((buff&0x0f)<<2))))+3))&0xf0)>>4)+offsetx,((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0x0f)+offsety);}
/*判断方块停止向下运动*/
bit tingzhixia(uchar buff,char offsetx,char offsety)
{char x0,y0,x1,y1,x2,y2,x3,y3;bit tz=0;x0=(((*(moxing+((buff&0xf0)|((buff&0x0f)<<2))))&0xf0)>>4)+offsetx;x1=(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2))+1)))&0xf0)>>4)+offsetx;x2=(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0xf0)>>4)+offsetx;x3=(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0xf0)>>4)+offsetx;y2=((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0x0f)+offsety;y3=((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0x0f)+offsety;y0=((*(moxing+((buff&0xf0)|((buff&0x0f)<<2))))&0x0f)+offsety;y1=((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+1))&0x0f)+offsety;if(readfk(x0+1,y0)){if(!((((x0+1)==x1)&&(y0==y1))|(((x0+1)==x2)&&(y0==y2))|(((x0+1)==x3)&&(y0==y3)))){ tz=1;}}if(readfk(x1+1,y1)){if(!((((x1+1)==x0)&&(y1==y0))|(((x1+1)==x2)&&(y1==y2))|(((x1+1)==x3)&&(y1==y3)))){ tz=1;}}if(readfk(x2+1,y2)){if(!((((x2+1)==x0)&&(y2==y0))|(((x2+1)==x1)&&(y2==y1))|(((x2+1)==x3)&&(y2==y3)))){tz=1;}}if(readfk(x3+1,y3)){if(!((((x3+1)==x0)&&(y3==y0))|(((x3+1)==x1)&&(y3==y1))|(((x3+1)==x2)&&(y3==y2)))){tz=1;}}return(tz);
}
/*判断一行是否可以消除*/
bit hangman(uchar x)
{uchar i;bit   man=1;for(i=0;i<15;i++){man=man&(readfk(x,i));if(!man)break;}return(man);
}
/*消除一行*/
void xiaohang(uchar x)
{uchar i,j;for(i=0;i<15;i++){clear1(x,i);}for(i=1;i<=x;i++){for(j=0;j<15;j++){if(readfk(x-i,j)){change1(x-i+1,j);clear1(x-i,j);}}}
}
/*判断是否停止向右*/
bit tingzhiyou(uchar buff,char offsetx,char offsety)
{char x0,y0,x1,y1,x2,y2,x3,y3;bit tz=0;x0=(((*(moxing+((buff&0xf0)|((buff&0x0f)<<2))))&0xf0)>>4)+offsetx;x1=(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2))+1)))&0xf0)>>4)+offsetx;x2=(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0xf0)>>4)+offsetx;x3=(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0xf0)>>4)+offsetx;y2=((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0x0f)+offsety;y3=((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0x0f)+offsety;y0=((*(moxing+((buff&0xf0)|((buff&0x0f)<<2))))&0x0f)+offsety;y1=((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+1))&0x0f)+offsety;if(readfk(x0,y0-1)){if(!(((x0==x1)&&((y0-1)==y1))|((x0==x2)&&((y0-1)==y2))|((x0==x3)&&((y0-1)==y3)))){ tz=1;}}if(readfk(x1,y1-1)){if(!(((x1==x0)&&((y1-1)==y0))|((x1==x2)&&((y1-1)==y2))|((x1==x3)&&((y1-1)==y3)))){ tz=1;     }}if(readfk(x2,y2-1)){if(!(((x2==x0)&&((y2-1)==y0))|((x2==x1)&&((y2-1)==y1))|((x2==x3)&&((y2-1)==y3)))){tz=1;}}if(readfk(x3,y3-1)){if(!(((x3==x0)&&((y3-1)==y0))|((x3==x1)&&((y3-1)==y1))|((x3==x2)&&((y3-1)==y2)))){tz=1;}}return(tz);
}
/*判断是否停止向左*/
bit tingzhizuo(uchar buff,char offsetx,char offsety)
{char x0,y0,x1,y1,x2,y2,x3,y3;bit tz=0;x0=(((*(moxing+((buff&0xf0)|((buff&0x0f)<<2))))&0xf0)>>4)+offsetx;x1=(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2))+1)))&0xf0)>>4)+offsetx;x2=(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0xf0)>>4)+offsetx;x3=(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0xf0)>>4)+offsetx;y2=((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0x0f)+offsety;y3=((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0x0f)+offsety;y0=((*(moxing+((buff&0xf0)|((buff&0x0f)<<2))))&0x0f)+offsety;y1=((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+1))&0x0f)+offsety;if(readfk(x0,y0+1)){if(!(((x0==x1)&&((y0+1)==y1))|((x0==x2)&&((y0+1)==y2))|((x0==x3)&&((y0+1)==y3)))){ tz=1;}}if(readfk(x1,y1+1)){if(!(((x1==x0)&&((y1+1)==y0))|((x1==x2)&&((y1+1)==y2))|((x1==x3)&&((y1+1)==y3)))){ tz=1;     }}if(readfk(x2,y2+1)){if(!(((x2==x0)&&((y2+1)==y0))|((x2==x1)&&((y2+1)==y1))|((x2==x3)&&((y2+1)==y3)))){tz=1;}}if(readfk(x3,y3+1)){if(!(((x3==x0)&&((y3+1)==y0))|((x3==x1)&&((y3+1)==y1))|((x3==x2)&&((y3+1)==y2)))){tz=1;}}return(tz);
}
/*清除一个方块*/
void clearbuf(uchar dat,char setx,char sety)
{uchar *i;i=(moxing+((dat&0xf0)|((dat&0x0f)<<2)));clear1(((((*i)&0xf0)>>4)+setx),(((*i)&0x0f)+sety));clear1(((((*(i+1))&0xf0)>>4)+setx),(((*(i+1))&0x0f)+sety));clear1(((((*(i+2))&0xf0)>>4)+setx),(((*(i+2))&0x0f)+sety));clear1(((((*(i+3))&0xf0)>>4)+setx),(((*(i+3))&0x0f)+sety));
}
/*俄罗斯方块子程序*/
void fangkuai(void)
{uchar fenshu=0;char offsety,offsetx;char offsety_buff,offsetx_buff;uchar buff=0x10;       bit ting=0;                               uchar i;//flag5=1;TMOD=1;   //定时器工作方式IT0=1;    //边延有效IT1=1;EA=1;         //开CPU中断ET0=1;     //开定时器中断EX0=1;     //开外部中断EX1=1;TL0=0x00;TH0=0x00;      //定时器初值TR0=1;      //启动定时器k=5;choose12864(2);clear12864();play16(0,0,0,els);play16(0,0,1,els+32);play16(0,0,2,els+64);play16(0,2,0,els+96);play16(0,2,1,els+128);play8(0,0,3,shu0);play8(0,1,3,shu0);vertical(1,60,30);vertical(1,60,127);for(i=0;i<98;i++){dot(30+i,1);dot(30+i,62);}offsety=7;offsetx=-3;for(;;){if(P3&0x04)first=1;if((k==0x02)&&((P3&0x04)==0x04)){offsety_buff=offsety;ting=tingzhiyou(buff,offsetx,offsety);if(!ting){if(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0x0f)+offsety)offsety--;clearbuf(buff,offsetx_buff,offsety_buff);playbuf(buff,offsetx,offsety);offsety_buff=offsety;}k=5;}if((k==0x01)&&((P3&0x04)==0x04)){offsety_buff=offsety;ting=tingzhizuo(buff,offsetx,offsety);if(!ting){if(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0x0f)+offsety<=13)offsety++;k=5;clearbuf(buff,offsetx_buff,offsety_buff);playbuf(buff,offsetx,offsety);offsety_buff=offsety;}}if((k==0x03)&&((P3&0x04)==0x04)){dengji=36;/k=5;}if((k==0x00)&&((P3&0x04)==0x04)){uchar i;k=5;i=buff;buff++;if((buff&0x0f)>=4)buff=buff&0xf0;//change1(0,14);if(((*(((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0x0f)+offsety)>14){do{offsety--;}while((((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0x0f)+offsety)>14);}if(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0x0f)+offsety<0){do{offsety++;}while(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0x0f)+offsety);}clearbuf(i,offsetx_buff,offsety_buff);playbuf(buff,offsetx,offsety);}ting=tingzhixia(buff,offsetx,offsety);while(flag5);if(flag1){offsetx_buff=offsetx;offsety_buff=offsety;offsetx++;clearbuf(buff,offsetx_buff,offsety_buff);playbuf(buff,offsetx,offsety);offsetx_buff=offsetx;flag1=0;}if((((((*((moxing+((buff&0xf0)+((buff&0x0f)<<2))+1)))&0xf0)>>4)+offsetx)>22)|ting){ uchar i=0;if(hangman((((*((moxing+((buff&0xf0)+((buff&0x0f)<<2))+1)))&0xf0)>>4)+offsetx)){xiaohang((((*((moxing+((buff&0xf0)+((buff&0x0f)<<2))+1)))&0xf0)>>4)+offsetx);fenshu++;i++;}if((((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0xf0)>>4)+offsetx>=(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0xf0)>>4)+offsetx)    //x2>=x3{if((((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0xf0)>>4)+offsetx<(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2))+1)))&0xf0)>>4)+offsetx)    //x2<x1{if(hangman((((*((moxing+((buff&0xf0)+((buff&0x0f)<<2))+2)))&0xf0)>>4)+offsetx+i)){xiaohang((((*((moxing+((buff&0xf0)+((buff&0x0f)<<2))+2)))&0xf0)>>4)+offsetx+i);fenshu++;i++;}}if((((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0xf0)>>4)+offsetx<(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0xf0)>>4)+offsetx)  //x3<x2{if(hangman((((*((moxing+((buff&0xf0)+((buff&0x0f)<<2))+3)))&0xf0)>>4)+offsetx+i)){xiaohang((((*((moxing+((buff&0xf0)+((buff&0x0f)<<2))+3)))&0xf0)>>4)+offsetx+i);fenshu++;i++;}}if((((*(moxing+((buff&0xf0)|((buff&0x0f)<<2))))&0xf0)>>4)+offsetx<(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0xf0)>>4)+offsetx)  //x0<x3{if(hangman((((*(moxing+((buff&0xf0)+((buff&0x0f)<<2))))&0xf0)>>4)+offsetx+i)){xiaohang((((*(moxing+((buff&0xf0)+((buff&0x0f)<<2))))&0xf0)>>4)+offsetx+i);fenshu++;i++;}}}if((((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0xf0)>>4)+offsetx<(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0xf0)>>4)+offsetx) //x2<x3{if((((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+3))&0xf0)>>4)+offsetx<(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2))+1)))&0xf0)>>4)+offsetx){if(hangman((((*((moxing+((buff&0xf0)+((buff&0x0f)<<2))+3)))&0xf0)>>4)+offsetx+i)){xiaohang((((*((moxing+((buff&0xf0)+((buff&0x0f)<<2))+3)))&0xf0)>>4)+offsetx+i);fenshu++;i++;}}if(hangman((((*((moxing+((buff&0xf0)+((buff&0x0f)<<2))+2)))&0xf0)>>4)+offsetx+i)){xiaohang((((*((moxing+((buff&0xf0)+((buff&0x0f)<<2))+2)))&0xf0)>>4)+offsetx+i);fenshu++;i++;}if((((*(moxing+((buff&0xf0)|((buff&0x0f)<<2))))&0xf0)>>4)+offsetx<(((*((moxing+((buff&0xf0)|((buff&0x0f)<<2)))+2))&0xf0)>>4)+offsetx){if(hangman((((*(moxing+((buff&0xf0)+((buff&0x0f)<<2))))&0xf0)>>4)+offsetx+i)){xiaohang((((*(moxing+((buff&0xf0)+((buff&0x0f)<<2))))&0xf0)>>4)+offsetx+i);fenshu++;i++;}}}play8(0,0,3,shu0+((fenshu/10)<<4));play8(0,1,3,shu0+((fenshu%10)<<4));dengji=fenshu/5;if(((((*(moxing+((buff&0xf0)+((buff&0x0f)<<2))))&0xf0)>>4)+offsetx)<1){delay1ms(450);delay1ms(450);choose12864(2);clear12864();play16(0,4,1,over);play16(0,6,1,over+32);play16(1,0,1,over+64);play16(1,2,1,over+96);delay1ms(450);delay1ms(450);break;}   buff=(((TL0%7)<<4)|(TH0%4));//buff=0x11;offsety=7;offsetx=-3;offsetx_buff=-9;offsety_buff=-9;} } }                    /*万年历子程序*/
void wannianli(void)
{uchar i;uchar count1=0;k=0;choose12864(2);init12864();clear12864();play8(0,0,0,shu2);         //屏,列,页,地址play8(0,1,0,shu0);play16(0,4,0,nian);play16(1,0,0,yue);play16(1,4,0,ri);play16(0,2,1,shi);play16(0,6,1,fen);play16(1,2,1,miao);play16(1,0,2,xing);play16(1,2,2,qi);vertical(3,63,127);vertical(3,63,126);vertical(3,63,122);vertical(3,63,121);for(i=0;i<7;i++){dot(121+i,3);dot(121+i,63);}for(i=0;i<12;i++){dot(123,8+5*i);}for(i=0;i<7;i++){if(i<4){play16(0,i<<1,3,yanyu+(i<<5));}if(i>=4){play16(1,(i-4)<<1,3,yanyu+(i<<5));}}

原文:http://www.jh-tec.cn/archives/8283

.

基于51单片机的贪吃蛇小游戏8X8点阵 proteus仿真原理图程序相关推荐

  1. 基于51单片机的贪吃蛇小游戏

    #include <reg52.h>// 点阵寄存器定义 sbit LOAD = P1 ^ 0; sbit CLK = P1 ^ 1; sbit DATA = P1 ^ 2;sbit mK ...

  2. 基于51单片机的贪吃蛇小程序(8*8LED点阵实现)by_jy

    ** 基于51单片机的贪吃蛇小程序(8*8LED点阵实现)by_jy ** 一直很想写一个贪吃蛇的小程序,这两天终于抽空完成了,这里把我的思路分享给大家,仅供参考! 代码如下: 先放段主函数压压惊 v ...

  3. 51制作贪吃蛇小游戏,附带Proteus仿真

    一.代码解读 一个按钮来启动游戏的开始,开始以后LCD1602上显示当前的关卡和得分,当长到一定长度后会进入下一个关卡,每个关卡移动的速度不一样(越到后面速度越快,用到定时器) 有关蛇和食物里的属性都 ...

  4. 基于51单片机的数字电容容值测量仪proteus仿真原理图PCB

    功能介绍: 0.本系统采用STC89C52作为单片机 1.系统支持15pF~450uF电容测量 2.按键可更改测量量程 3.除了采用LCD1602可以实时显示测量参数,同时具有LED可以显示各个档位 ...

  5. 基于51单片机的万年历(带温湿度)带闹钟功能proteus仿真原理图PCB

    功能介绍: 0.本系统采用STC89C52作为单片机 1.LCD1602液晶显示当前时间和温湿度 2.按键可切换页面,显示农历,显示闹钟设置 3.当时间到达设定闹钟时间时,蜂鸣器报警 原理图: PCB ...

  6. 基于51单片机的三路超声测距仪设计wifi通信proteus仿真原理图PCB

    功能介绍: 0.本系统采用STC89C52作为单片机 1.LCD1602液晶实时循环显示3路超声波探测距离,同时WIFI串口上报 2.带有WiFi模块,可与手机实现数据交互,WiFi模块型号采用是常见 ...

  7. 基于51单片机的温度甲烷监测报警串口上报proteus仿真原理图PCB

    功能介绍: 0.本系统采用STC89C52作为单片机 1.LCD1602液晶实时显示当前温度和甲烷浓度 2.超过甲烷浓度阈值,蜂鸣器报警 3.按键可更改甲烷浓度阈值上限和启动/暂停检测 4.0`20% ...

  8. 基于51单片机的大棚环境土壤湿度光强监测系统proteus仿真原理图PCB

    功能介绍: 0.本系统采用STC89C52作为单片机 1.系统实时监测当前温湿度/土壤湿度/环境光强并显示 2.温湿度超过设定阈值范围,蜂鸣器响,同时开启对应控制继电器 3.土壤湿度低于设定下限,开启 ...

  9. 基于51单片机的水温水流量检测/智能水龙头控制系统proteus仿真原理图PCB

    功能: 0.本系统采用STC89C52作为单片机 1.液晶实时显示当前的设定温度/实际温度/水龙头状态和水流量 2.按键可开关水龙头,当温度低于设定温度时,启动加热控制继电器,给水加热, 当加热到(设 ...

最新文章

  1. VM虚拟机桥接模式无法联网解决办法
  2. python写计算器
  3. 逆向最大匹配分词算法C#
  4. 404. Sum of Left Leaves 左叶子之和
  5. Django 使用 HttpResponse 返回 json 字符串显示 Unicode 编码
  6. linux提示符目录变为~,Linux终端提示符路径长度的修改方法
  7. [蓝桥杯2019初赛]旋转-找规律
  8. cygwin和mingw的区别
  9. leetcode80. 删除排序数组中的重复项 II
  10. C# 2.0对现有语法的改进
  11. java传递实例_Java方法的参数传递机制实例详解
  12. Atitit 信息检索 v3 t55.docx Atitit 现代信息检索 目录 1.1. 信息检索(索引 索引 结构化文本 1 1.2. Atitit 重要章节 1 1.3. 息检索建模 1 1.
  13. 计算机组成原理的各种常见英文缩写介绍--<<方便复习的笔记>>
  14. CRM软件成功案例解析
  15. 面试题---测试用例设计
  16. 小爱同学指令大全_小爱同学指令
  17. 马云的妻子曝光,背景十分惊人!没有她就没有今天的阿里巴巴.....
  18. 重大利好,拥有HKICPA证书可申请南沙区人才绿卡
  19. 如何使用ArcGIS将Excel数据转换为shp格式
  20. mysql 1264_关于MySQL的1264错误处理及sql_mode设置

热门文章

  1. 闲置iPhone这么用
  2. 为什么学计算机的阳气重,养生:长期使用电脑+不运动的朋友---补阳气【转】...
  3. java中类成员的限定词_Java类中的限定词
  4. iOS 上架app的过程当中出现the Info.plist is missing or could not be parsed.经历
  5. 使用YOLOv5实现多摄像头实时目标检测
  6. 南洋理工大学招募本科生、硕士生和博士生、博士后、研究工程师和研究科学家​...
  7. 转载:物联网平台概述
  8. php身份证验证_PHP的身份验证和访问控制
  9. 基于人脸识别的门禁系统
  10. 第19天笔记,js(递增递减运算符、if语句)