非标准武术擂台1V1机器人示例程序

/*******************************************************************

** 文件名:擂台赛非标准平台1V1程序_检测原理AVR单片机示例程序,详细资料请购买产品后索要

** Copyright (c) KXCT雷電科技 技术部 

** 创建人:KXCT

** 日 期:2015年11月

** 修改人:

** 日 期:

** 描 述:仅供参考,擂台机器人调试能用的程序,包含了上台、边缘检测、推棋子、检测对手等功能

** 版 本:V1.0.1

**********************************************************************/
#include<iom128v.h>
#include<macros.h>
#include<math.h>
#define uint unsigned int
#define uchar unsigned char
#define IN1 {PORTC&=~BIT(0);}
#define _IN1 {PORTC|=BIT(0);}
#define IN2 {PORTC&=~BIT(1);}
#define _IN2 {PORTC|=BIT(1);}
int abs(int);
char key=0,tim=0,dat,a;
void delay_1ms(void)                 //1ms延时函数
  {
   unsigned int i;
   for (i=0;i<1140;i++);
  }
void delay(uint n)       //N ms延时函数
  {
   unsigned int i=0;
   for (i=0;i<n;i++)
   {
   delay_1ms();
   if(key!=0)break;
   }
  }
void delay_1(uint n)       //N ms延时函数
  {
   unsigned int i=0;
   for (i=0;i<n;i++)
   {
   delay_1ms();
   if(key!=a)break;
   if((PIND&0x0f)==0)
   if(!((PINA&0x7f)==0x7f))break;
   }
  }
void delay_2(uint n)       //N ms延时函数
  {
   unsigned int i=0;
   for (i=0;i<n;i++)
   {
   delay_1ms();
   if(key!=0)break;
   if((PINA&0x7f)!=0x7f)break;
   }
  }
void init(void)
{
 	DDRC|=0x03;//电机控制IO口初始化
	DDRB|=0x60;//电机PWMIO口初始化
	PORTB&=~0x60;
	DDRA&=0x80;//周边红外检测IO输入初始化
	PORTA|=0x7f;
	DDRD&=0xf0;//红外边缘检测IO输入初始化
	PORTD|=0x0f;
	DDRC&=~0xf0;//检测棋子端口
	PORTC|=0xf0;
}
void zhongduan_init(void)/***************外部中断初始化****************/
{
	CLI(); //disable all interrupts
	EICRA = 0xFF; //extended ext ints
	EIMSK = 0x0F;
	SEI(); //re-enable interrupts
}
void Dj(int m,int n)
{
	 if((m)>0){IN1}//电机方向控制
	 else {_IN1}

	 if((n)>0){IN2}
	 else {_IN2}

	 TCCR1A=0xa1;
	 TCCR1B=0x09;

	 m=abs(m);
	 n=abs(n);

	 OCR1A=m;
	 OCR1B=n;
}
void bianyuan(void)
{
 	 uint s2;
	 s2=PIND|0xf0;
	 switch(s2)
	 {
	  	case 0xf1:Dj(-180,-90);//1检测到;动作:右转后退
			  delay(1000);
			  Dj(180,-180);
			  delay(800);
			  break;
		case 0xf2:Dj(-90,-180);//2检测到;动作:右转后退
			  delay(1000);
			  Dj(-180,180);
			  delay(800);
			  break;
		case 0xf4:Dj(180,100);//3检测到;动作:右转前进
			  delay(1000);
			  Dj(-180,180);
			  delay(800);
			  break;
		case 0xf8:Dj(180,100);//4检测到;动作:右转前进
			  delay(1000);
			  Dj(-180,180);
			  delay(800);
			  break;
		case 0xf3:Dj(-150,-150);//1、2检测到;动作:后退
			  delay(1000);
			  break;
		case 0xf9:Dj(180,100);//1、4检测到;动作:右转前进
			  delay(2000);
			  break;
		case 0xfc:Dj(150,150);//3、4检测到;动作:前进
			  delay(1000);
			  break;
		case 0xf6:Dj(100,180);//2、3检测到;动作:左转前进
			  delay(2000);
			  break;
		default :Dj(150,150);
		break;
	 }
}
void qizi(void)
{
 	 uint s3,n;
	 s3=PINC&0xf0;
	 if((PINC&0x30)!=0x30)//1或2检测到;动作:全速前进
	 		Dj(220,220);
	 else if((PINC&0x40)!=0x40)//3检测到;动作:右转检测
	 	  	{
			 	Dj(-180,-180);
				for(n=150;n>0;n--)
				{
   					if(key!=0)break;
				}
				Dj(220,-220);
				for(n=400;n>0;n--)
				{
				 	if((PINC&0x30)!=0x30)break;
   					if(key!=0)break;
					delay_1ms();
				}
			}
	 else if((PINC&0x80)!=0x80)//4检测到;动作:左转检测
	 	  	{
			 	Dj(-180,-180);
				for(n=150;n>0;n--)
				{
   					if(key!=0)break;
				}
			 	Dj(-220,220);
				for(n=400;n>0;n--)
				{
				 	if((PINC&0x30)!=0x30)break;
   					if(key!=0)break;
					delay_1ms();
				}
			}
	else Dj(200,200);
}
void qidong(void)
{
 	 Dj(0,0);
	 delay(200);
	 Dj(-240,-240);
	 delay(300);
	 Dj(-200,-210);
	 delay(300);
	 Dj(-200,-220);
	 delay(300);
	 delay(300);
	 delay(300);

	 Dj(-210,-230);
	 delay(300);

	 Dj(-220,220);
	 delay(300);
	 Dj(180,180);
}
void ruanqidong(void)
{
 	 uint s1;
	 do
	 {
	   s1=PINA;
	   s1=s1&0x20;
	 }while(!(s1==0));
}
int zhoubian_scan(void)
{
 	 uint s1;
	 s1=PINA;
	 s1=s1&0x7f;
	 if(s1==0x7f)
	 	return 0;
	else return 1;
}
#pragma interrupt_handler int0_isr:iv_INT0
void int0_isr(void)
{
 	 uint s1;
	 s1=PINA;
	 s1=s1&0x7f;
	 key=10;
}

#pragma interrupt_handler int1_isr:iv_INT1
void int1_isr(void)
{
 	 uint s1;
	 s1=PINA;
	 s1=s1&0x7f;
	 key=20;
}

#pragma interrupt_handler int2_isr:iv_INT2
void int2_isr(void)
{
 	 uint s1;
	 s1=PINA;
	 s1=s1&0x7f;
	 key=30;
}

#pragma interrupt_handler int3_isr:iv_INT3
void int3_isr(void)
{
 	 uint s1;
	 s1=PINA;
	 s1=s1&0x7f;
	 key=40;
}
void bianyuan_scan(void)
{
 	int s2;
	s2=PIND&0x0f;
	if(s2==0)
	key=0;
}
void main(void)
{
 	 init();
	 delay(2000);
	 ruanqidong();
	 qidong();
	 zhongduan_init();
 	 while(1)
	 {
		a=key;
		switch(key)
		{
		 	case 0 :
			        qizi();
				    break;
			case 10://1产生中断,四周未检测到,执行动作:后退+转向延时
					Dj(-200,-200);
					delay(300);
					Dj(-180,180);
					delay(300);
					Dj(180,-180);
					delay(300);
					Dj(-200,-200);
					delay_1(200);
					Dj(200,-200);
					delay_1(300);
					Dj(150,150);
					bianyuan_scan();
				 	break;
			case 20://2产生中断,四周未检测到,执行动作:后退+延时转向
					Dj(-200,-200);
					delay(300);
					Dj(180,-180);
					delay(300);
					Dj(-180,180);
					delay(300);
					Dj(-200,-200);
					delay_1(200);
					Dj(-200,200);
					delay_1(350);
					Dj(150,150);
					bianyuan_scan();
				 	break;
			case 30://3产生中断,四周未检测到,执行动作:前进+延时左转
					Dj(200,200);
					delay_1(300);
					Dj(-200,200);
					delay_1(350);
					Dj(150,150);
					bianyuan_scan();
				 	break;
			case 40://4产生中断,四周未检测到,执行动作:前进+延时转向
					Dj(200,200);
					delay_1(300);
					Dj(200,-200);
					delay_1(300);
					Dj(150,150);
					bianyuan_scan();
				 	break;
			default :
					bianyuan();
				    qizi();
					break;
		}
	 }
}

最后请允许我插入一则广告,本人开的网店:KXCT雷電科技  主要经营机器人和智能车相关的灰度传感器和直流电机以及直流电机驱动等相关配件,欢迎大家前来选购和交流。

淘宝店铺链接:https://shop128260623.taobao.com/?spm=2013.1.1000126.d21.tDinKz

数字灰度传感器链接:https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-11970373710.2.Eg1Umi&id=521915489173

模拟灰度传感器连接:https://item.taobao.com/item.htm?spm=2013.1.w4004-11970373722.23.D3sGjR&id=523220787646

经典版直流电机驱动:https://item.taobao.com/item.htm?spm=2013.1.20141003.5.D3sGjR&scm=1007.10011.31620.100200300000001&id=524008061227&pvid=6e2d69f3-44fe-4f88-b5dd-fc9a9f8bd4bb

KXCT雷電之驱 电机驱动:https://item.taobao.com/item.htm?spm=2013.1.20141002.6.D3sGjR&scm=1007.10009.31621.100200300000001&id=530892357664&pvid=50eb581f-a782-420a-bb56-977123306b01

时间: 2024-08-29 09:11:18

非标准武术擂台1V1机器人示例程序的相关文章

Windows Socket编程示例-TCP示例程序

前面一部分是介绍,后面有示例 1.网络中进程之间如何通信? 首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的.其实TCP/IP协议族已经帮我们解决了这个问题,网络层的"ip地址"可以唯一标识网络中的主机,而传输层的"协议+端口"可以唯一标识主机中的应用程序(进程).这样利用三元组(ip地址,协议,端口)就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交互. 使用TCP

ABP示例程序-使用AngularJs,ASP.NET MVC,Web API和EntityFramework创建N层的单页面Web应用

本片文章翻译自ABP在CodeProject上的一个简单示例程序,网站上的程序是用ABP之前的版本创建的,模板创建界面及工程文档有所改变,本文基于最新的模板创建.通过这个简单的示例可以对ABP有个更深入的了解,每个工程里应该写什么样的代码,代码如何组织以及ABP是如何在工程中发挥作用的. 源文档地址:https://www.codeproject.com/Articles/791740/Using-AngularJs-ASP-NET-MVC-Web-API-and-EntityFram 源码可以

[Effective JavaScript 笔记]第29条:避免使用非标准的栈检查属性

许多js环境都提供检查调用栈的功能.调用栈是指当前正在执行的活动函数链.在某些旧的宿主环境中,每个arguments对象含有两个额外的属性:arguments.callee和arguments.caller.前者指向使用该arguments对象被调用的函数.后者指向调用该arguments对象被调用的函数的函数.许多环境支持arguments.callee,但它除了允许匿名函数递归地引用自身之外,没有更多的用途了.(高3中认为使用arguments.callee可以解除函数体内的代码和函数名之间

epub、ocf等常用电子书格式浅析----附JAVA示例程序

一. 电子书介绍 转载请注明http://www.cnblogs.com/xckk/p/6020324.html Epub(Electronic Publication)是一个完全开放和免费的电子书标准.是一个自由的开放标 准,属于一种可以“自动重新编排”的内容. “自动重新编排”的原因是内部使用XHTML来展现文件的内容,用一系列CSS来定义格式和版面设计,达到了内容和编排的分离. 现在EpubEpub包括三项主要规格: 开放出版结构(Open Publication Structure,OP

python入门示例程序

该实例是raspi和dsp电机运动控制板的串口uart通信: import serial class SerialHandler(): ''' raspi serial for communication ''' def __init__(self)://初始化一些默认参数,其它非初始化参数在方法中作为参数传入 self.serialdev = None//给参数赋初始值 def serial_open(self,serialdev,timeout)://用户可传入的参数,其它参数(如baudr

OpenGL入门和示例程序

大家好,今天雅乐网给大家介绍一下OpenGL的一些基本语法和一个简单的示例程序. OpenGL是什么呢?说简单一点,就是一个图形软件包,它提供了许多函数供我们调用.我们看看维基百科上的说法 开放图形库(英语:Open Graphics Library,缩写为OpenGL)是个定义了一个跨编程语言.跨平台的应用程序接口(API)的规范,它用于生成二维.三维图像.这个接口由近三百五十个不同的函数调用组成,用来从简单的图形比特绘制复杂的三维景象.而另一种程序接口系统是仅用于Microsoft Wind

Wireshark分析非标准端口号流量

Wireshark分析非标准端口号流量 2.2.2  分析非标准端口号流量Wireshark分析非标准端口号流量 应用程序运行使用非标准端口号总是网络分析专家最关注的.关注该应用程序是否有意涉及使用非标准端口,或暗中想要尝试通过防火墙本文选自WireShark数据包分析实战详解清华大学出版社. 1.分配给另一个程序的端口号 当某数据包使用非标准端口上,如果被Wireshark识别出是使用另一个程序,则说明Wireshark可能使用了错误的分析器,如图2.19所示本文选自WireShark数据包分

OSG中的示例程序简介

OSG中的示例程序简介 转自:http://www.cnblogs.com/indif/archive/2011/05/13/2045136.html 1.example_osganimate一)演示了路径动画的使用(AnimationPath.AnimationPathCallback),路径动画回调可以作用在Camera.CameraView.MatrixTransform.PositionAttitudeTransform等四种类型的节点上.二)演示了osgSim::OverlayNode

德卡Z90读卡器读取社保卡,德卡Z90读卡器CSharp示例程序源码

前言,最近学习调用 医保卡业务,使用德卡读卡器,主要就是调用一个DLL,动态库文件. 借着自学的机会把心得体会都记录下来,方便感兴趣的小伙伴学习与讨论. 内容均系原创,欢迎大家转载分享,但转载的同时别忘了注明作者和原文链接哦.本文内容和图片如果有侵犯您的权利,请联系[email protected]. 一,准备工作: 先到德卡官网下载相关资料,下载动态库.http://www.decard.com/download/downloadcategoryid=10&isMode=false.html下