找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10663|回复: 8
打印 上一主题 下一主题
收起左侧

proteus仿真单片机贪吃蛇的详细教程

  [复制链接]
跳转到指定楼层
楼主

一个“贪吃蛇”带你进入proteus的世界.rar (993.14 KB, 下载次数: 105)
一个“贪吃蛇”带你进入proteus的世界
首先我也是一个单片机和proteus的菜鸟,初识proteus,完全不知道如何下手,从网上找到一些教程,又觉得特别扯淡,没有实际用途,没办法很快上手。无意中从网上看到了一个贪吃蛇的例程,一下子来了兴趣,就在完成这个电路仿真的过程中也慢慢学会了proteus基本的操作。也希望分享给和我一样刚开始使用的proteus的菜鸟们。
话不多说!开始吧!
首先你得拥有一个proteus,开始我使用的是8.0版本,但是经常会出现自动退出现象,查了很多资料都没能解决 , 现在使用的是较为稳定的7.5版本。
8.0版本进入后点击上排的 ISIS图样进入原理图绘制,而7.5版本打开后直接进入原理图绘制:
圈起来的是重点哦!
那个向右边的三角是元器件放置,点击它再点击P即可进入元器件选择界面
在搜索框中输入你想放置的器件名称就可以搜索到,我也给大家附上了常用器件的名称对照表。

这个图标是放置接地 和电源等等的

了解这些后你就可以开始绘制一张贪吃蛇的原理图了,如下(proteus仿真是可以不用接入单片机最小系统的)

双击单片机,添入hex文件


好啦 现在点击右下角的 仿真开始咯?
贪吃蛇走起!

  1.   //proteus仿真论坛:proteus.5d6d.com
  2. #include <reg51.h>
  3. #define uchar unsigned char
  4. #define SNAKE 20                 //最大长度
  5. #define TIME 50                 //显示延时时间
  6. #define SPEED 71               //速度控制

  7. sbit up=P3^3;       //down
  8. sbit down=P3^1;
  9. sbit right=P3^2;
  10. sbit left=P3^4;
  11. uchar x[SNAKE+1];
  12. uchar y[SNAKE+1];         
  13. uchar time,n,i,e;              //延时时间,当前蛇长,通用循环变量,当前速度               
  14. char addx,addy;                //位移偏移量
  15. /********************
  16. 延时程序
  17. *********************/
  18. void delay(char MS)
  19. {
  20. char us,usn;
  21. while(MS!=0)
  22. {
  23. usn = 0;
  24. while(usn!=0)
  25. {
  26. us=0xff;
  27. while (us!=0){us--;};
  28. usn--;
  29. }
  30. MS--;
  31. }
  32. }
  33. /*******************************************
  34. 判断碰撞
  35. *******************************************/
  36. bit knock()
  37. {bit k;
  38. k=0;
  39. if(x[1]>7||y[1]>7)k=1;                             //撞墙
  40. for(i=2;i<n;i++)if((x[1]==x[i])&(y[1]==y[i]))k=1;  //撞自己
  41. return k;
  42. }
  43. /*****************
  44. 上下左右键位处理
  45. *****************/
  46. void turnkey()// interrupt 0 using 2  
  47. {//up=1;
  48. if(!left){addy=0;if(addx!=1)addx=-1; else addx=1;}
  49. if(!right){addy=0;if(addx!=-1)addx=1; else addx=-1;}
  50. if(!up){addx=0;if(addy!=-1)addy=1; else addy=-1;}
  51. if(!down){addx=0;if(addy!=1)addy=-1; else addy=1;}
  52. }
  53. /*****************
  54. 乘方程序
  55. *****************/
  56. uchar mux(uchar temp)
  57. {
  58. if(temp==7)return 128;
  59. if(temp==6)return 64;
  60. if(temp==5)return 32;
  61. if(temp==4)return 16;
  62. if(temp==3)return 8;
  63. if(temp==2)return 4;
  64. if(temp==1)return 2;
  65. if(temp==0)return 1;
  66. return 0;
  67. }
  68. /*****************
  69. 显示时钟 显示程序
  70. *****************/
  71. void timer0(uchar k)
  72. {while(k--)
  73. {for(i=0;i<SNAKE+1;i++)
  74. {P2=mux(x[i]);P1=255-mux(y[i]);
  75. turnkey();                     //上下左右键位处理
  76. delay(TIME);                   //显示延迟
  77. P2=0x00;P1=0xff;
  78. }}
  79. }
  80. /*****************
  81. 主程序
  82. *****************/       
  83. void main(void)
  84. {e=SPEED;
  85. P0=0x00;
  86. P1=0xff;
  87. P2=0x00;
  88. P3=0xff;
  89. while(1)      
  90. {
  91. for(i=3;i<SNAKE+1;i++)x[i]=100;for(i=3;i<SNAKE+1;i++)y[i]=100;//初始化
  92. x[0]=4;y[0]=4;                                                //果子                           
  93. n=3;                                                          //蛇长 n=-1
  94. x[1]=1;y[1]=0;                                                //蛇头
  95. x[2]=0;y[2]=0;                                                //蛇尾1
  96. addx=0;addy=0;                                                //位移偏移

  97. while(1){if(!left||!right||!up||!down)break;timer0(1);}
  98. while(1)         
  99.   {timer0(e);
  100.    if(knock()){e=SPEED;break;}                          //判断碰撞
  101.         if((x[0]==x[1]+addx)&(y[0]==y[1]+addy))         //是否吃东西
  102.            {n++;
  103.                    if(n==SNAKE+1)
  104.                    {n=3;e=e-10;
  105.                    for(i=3;i<SNAKE+1;i++)x[i]=100;
  106.            for(i=3;i<SNAKE+1;i++)y[i]=100;
  107.                    }
  108.            x[0]=x[n-2];
  109.            y[0]=y[n-2];
  110.            }
  111.     for(i=n-1;i>1;i--){x[i]=x[i-1];y[i]=y[i-1];}        
  112.    
  113.     x[1]=x[2]+addx;y[1]=y[2]+addy;                     //移动
  114.   }                                               
  115. }                       
  116. }
复制代码

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏7 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:148153 发表于 2016-11-15 22:39 | 只看该作者
请问我把这个代码生成hex文件下载到单片机 单片机会什么没任何反应呀--;求指导
回复

使用道具 举报

板凳
ID:202508 发表于 2017-5-30 23:25 | 只看该作者
这个代码不对
回复

使用道具 举报

地板
ID:89286 发表于 2017-5-31 07:42 | 只看该作者
thanks for sharing
回复

使用道具 举报

5#
ID:424770 发表于 2018-11-12 00:12 | 只看该作者
帮大忙了
回复

使用道具 举报

6#
ID:421481 发表于 2020-4-5 11:51 | 只看该作者
按键上接电阻是为什么?
回复

使用道具 举报

7#
ID:774404 发表于 2020-6-10 20:36 | 只看该作者
2992179673 发表于 2020-4-5 11:51
按键上接电阻是为什么?

上拉电阻
回复

使用道具 举报

8#
ID:641349 发表于 2020-11-3 20:36 来自手机 | 只看该作者
warriors 发表于 2017-5-30 23:25
**** 作者被禁止或删除 内容自动屏蔽 ****

我也没搞出来
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表