把发射机程序修改了一下,加上了锁存,接收机的也做了。
目前接收机程序还差信号错误时的中断返回和停止动作没做。
(程序新手,欢迎老手拍砖。)
//遥控发射器端
//NO1,测试(Testing)
//1CH输出 ---串行---
#include<reg51.h>
//定义行走与炮塔转动信号脚,
sbit IN0=P0^0;
sbit IN1=P0^1;
sbit IN2=P0^2;
sbit IN3=P0^3; //CH0.0
sbit IN4=P0^4;
sbit IN5=P0^5;
sbit IN6=P0^6;
sbit IN7=P0^7; //CH0.1
//定义小工具信号脚。
sbit LIGHT0=P1^0;
sbit LIGHT1=P1^1;
sbit LAMB=P1^2;
sbit SPEAKER=P1^3;
sbit OTHER0=P1^4;
sbit OTHER1=P1^5;
sbit OTHER2=P1^6;
sbit OTHER3=P1^7; //CH0.2
//定义武器信号脚。
sbit LOCK0=P2^0;
sbit LOCK1=P2^1;
sbit READY=P2^2;
sbit FIRE=P2^3;
sbit LED0=P2^4;
sbit LED1=P2^5;
sbit LED2=P2^6;
sbit LED3=P2^7; //CH0.3
//定义编码输出信号脚。
sbit RELAY=P3^3;
sbit OUT=P3^4;
sbit C573=P3^5;//C573锁存器
//延时申明。
void main ()
{
unsigned int i;//定义延时函数i。
//unsigned int a;//定义延时函数a。
//准备工作。
P0=0x00;
P1=0x00;
P2=0x00;
P3=0x00;
LED0=1;
for(i=0;i<25000;i++);
LED1=1;
for(i=0;i<25000;i++);
LED2=1;
for(i=0;i<25000;i++);
LED3=1;
for(i=0;i<25000;i++);
LED0=0;
LED1=0;
LED2=0;
LED3=0;
for(i=0;i<15000;i++);
LED0=1;
LED1=1;
LED2=1;
LED3=1;
SPEAKER=1;
for(i=0;i<25000;i++);
P0=0x00;
P1=0x00;
P2=0x00;
P3=0x00;
RELAY=1;
for(i=0;i<5000;i++); //继电器自锁(OUT输出)
RELAY=0; //系统信号有效。
//All ready.
//主程序
while(1)
{
//CH0.0,1,2计算
OUT=1;
for(i=0;i<2000;i++);
OUT=0;
for(i=0;i<750;i++);//引导码
C573=0;//锁存
OUT=IN0; //编码开始
for(i=0;i<50;i++);
OUT=IN1;
for(i=0;i<50;i++);
OUT=IN2;
for(i=0;i<50;i++);
OUT=IN3;
for(i=0;i<50;i++);
OUT=IN4;
for(i=0;i<50;i++);
OUT=IN5;
for(i=0;i<50;i++);
OUT=IN6;
for(i=0;i<50;i++);
OUT=IN7;
for(i=0;i<50;i++);
OUT=LIGHT0;
for(i=0;i<50;i++);
OUT=LIGHT1;
for(i=0;i<50;i++);
OUT=LAMB;
for(i=0;i<50;i++);
OUT=SPEAKER;
for(i=0;i<50;i++);
OUT=OTHER0;
for(i=0;i<50;i++);
OUT=OTHER1;
for(i=0;i<50;i++);
OUT=OTHER2;
for(i=0;i<50;i++);
OUT=OTHER3;
for(i=0;i<50;i++); //编码结束
C573=1;//锁存结束,开始输入
OUT=1;
for(i=0;i<200;i++);
OUT=0;
for(i=0;i<750;i++);//结束识别码。
//CH4计算 --FIRE专用--(所有结果延时相同(1000))
if(LOCK0==1&&LOCK1==1)//LOCK1,2打开
{
if(FIRE==1)//若开火
{
LED0==1;
for(i=0;i<200;i++);
LED1==1;
for(i=0;i<200;i++);
LED2==1;
for(i=0;i<200;i++);
LED3==1;
for(i=0;i<200;i++);//延时,LED倒计时
if(FIRE==1)//若开火
{
OUT=1;
for(i=0;i<200;i++);//FIRE!
LED0=0;
LED1=0;
LED2=0;
LED3=0;//LED复原
}
if(FIRE==0)//开火键松开
{
OUT=0;
for(i=0;i<200;i++);//无FIRE信号发出
LED0=0;
LED1=0;
LED2=0;
LED3=0;//LED复原
}
}
if(FIRE==0)//保险打开,但未开火
{
OUT=0;
for(i=0;i<1000;i++);//无FIRE信号发出
}
}
if(LOCK0==0&&LOCK1==1)//保险LOCK未全开
{
OUT=0;
for(i=0;i<1000;i++);//无FIRE信号发出
}
if(LOCK0==1&&LOCK1==0)//保险LOCK未全开
{
OUT=0;
for(i=0;i<1000;i++);//无FIRE信号发出
}
if(LOCK0==0&&LOCK1==0)//保险LOCK未全开
{
OUT=0;
for(i=0;i<1000;i++);//无FIRE信号发出
}
}
}
//遥控接受器端
//NO1,测试(Testing)
//1CH输出 ---串行---
#include<reg51.h>
//定义行走与炮塔转动信号脚,
sbit MOTOR0=P0^0;
sbit MOTOR1=P0^1;
sbit MOTOR2=P0^2;
sbit MOTOR3=P0^3; //CH0.0
sbit MOTOR4=P0^4;
sbit MOTOR5=P0^5;
sbit MOTOR6=P0^6;
sbit MOTOR7=P0^7; //CH0.1
//定义小工具信号脚。
sbit LIGHT0=P1^0;
sbit LIGHT1=P1^1;
sbit LAMB=P1^2;
sbit SPEAKER=P1^3;
sbit OTHER0=P1^4;
sbit OTHER1=P1^5;
sbit OTHER2=P1^6;
sbit OTHER3=P1^7; //CH0.2
//定义武器信号脚。
sbit LOCK0=P2^0;
sbit LOCK1=P2^1;
sbit READY=P2^2;
sbit FIRE=P2^3;
sbit LED0=P2^4;
sbit LED1=P2^5;
sbit LED2=P2^6;
sbit LED3=P2^7; //CH0.3
//定义编码输出信号脚。
sbit C573=P3^3;
sbit IN=P3^4;
sbit HELPOUT=P3^5;
void main ()
{
unsigned int i;
C573=1;//锁存
if(IN==1)
{
for(i=0;i<200;i++);//Check0
if(IN==1)
{
for(i=0;i<200;i++);//Check1
if(IN==1)
{
for(i=0;i<200;i++);//Check2
if(IN==1)
{
for(i=0;i<200;i++);//Check3
if(IN==1)
{
for(i=0;i<200;i++);//Check4
if(IN==1)
{
for(i=0;i<200;i++);//Check5
if(IN==1)
{
for(i=0;i<200;i++);//Check6
if(IN==1)
{
for(i=0;i<200;i++);//Check7
if(IN==1)
{
for(i=0;i<200;i++);//Check8
if(IN==1)
{
for(i=0;i<200;i++);//Check9
if(IN==0)
{
for(i=0;i<400;i++);//Check10
if(IN==0)
{
for(i=0;i<200;i++);//Check11
//All Checked, begin!
//数据检查完毕,此时应为MOTOR0(发射机IN0)的第25/50处
MOTOR0=IN;
for(i=0;i<50;i++);//#0
MOTOR1=IN;
for(i=0;i<50;i++);//#1
MOTOR2=IN;
for(i=0;i<50;i++);//#2
MOTOR3=IN;
for(i=0;i<50;i++);//#3
MOTOR4=IN;
for(i=0;i<50;i++);//#4
MOTOR5=IN;
for(i=0;i<50;i++);//#5
MOTOR6=IN;
for(i=0;i<50;i++);//#6
MOTOR7=IN;
for(i=0;i<50;i++);//#7
LIGHT0=IN;
for(i=0;i<50;i++);//#8
LIGHT1=IN;
for(i=0;i<50;i++);//#9
LAMB=IN;
for(i=0;i<50;i++);//#10
SPEAKER=IN;
for(i=0;i<50;i++);//#11
OTHER0=IN;
for(i=0;i<50;i++);//#12
OTHER1=IN;
for(i=0;i<50;i++);//#13
OTHER2=IN;
for(i=0;i<50;i++);//#14
OTHER3=IN;
for(i=0;i<50;i++);//#15
if(IN=1);
{
for(i=0;i<200;i++);
if(IN=0);
{
for(i=0;i<425;i++);
if(IN=0);
{
for(i=0;i<100;i++);
C573=1;//锁存解锁
for(i=0;i<100;i++);//数据输入锁存
C573=1;//锁存
for(i=0;i<100;i++);
}
}
}
for(i=0;i<900;i++);
FIRE=1;
for(i=0;i<100;i++);
}
}
}
}
}
}
}
}
}
}
}
}
}
|