📄 fpl032dj_v02.c
字号:
#include "iom16v.h"
#include <macros.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define enter 0x0d
//-------
#define djs_num 2
//#define dj_setnum1 780
//#define dj_setnum2 680
#define dj_setnum3 500
//#define dj_setnum4 320
//#define dj_setnum5 220
//-------------------------------------------------------------------
uchar serial_ok,rcvcom_ok,sending_ok,com_ask;
//--------------------串口
uchar ms,rcvnumber,sendnumber;
uchar sendbuffer[18],rcvbuf[10],usebuf[6];
uchar led_ms,ms50;
//---------------------电机输出
uchar out_temp,out_x,out2;
uchar dj_ms,dj_s;
uchar F_ok;
uint dj_number,dj_set;
//--------------------BUTTON PORT
uchar input1,input2,input3;
uchar b1[8],b1_old[8];
uchar b_ms,b0_ms,b2_ms,b4_ms,b6_ms;
uint b1_ms,b3_ms,b5_ms,b7_ms;
uchar b2[8],b2_old[8];
uchar b8_ms;
uint b9_ms;
uchar b3[8],b3_old[8];
uchar b16_ms;
//---------------------找零点
uchar reset_ok;
//---------------------自动放球 test
uchar test_ms,test_ok;
//---------------------控制
uchar con_x,b1_ok,b2_ok,b3_ok,b4_ok;
uchar con_ms,con_ok;
uint con1_ms,con2_ms,con3_ms,con4_ms,con5_ms,cona_ms;
uint c1_ms,c2_ms,c3_ms,c4_ms;
uchar error_x,origin_ms;
uchar out1,origin_ok;
uint cddj_ms;
//--------------------位置控制
uint dj_setnum1,dj_setnum2,dj_setnum4,dj_setnum5;
uint kq_ms;
uchar err_ok;
//uchar testgpx;
//*******************************************************************
// time0中断入口
//*******************************************************************
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void) //0.5ms中断1次 8分之1分频
{
TCNT0 = 0x06;
ms++;
b_ms++;
if (dj_s!=0x00)
dj_ms++;
else
dj_ms=0x00;
}
//*******************************************************************
// 串口中断接收函数
//*******************************************************************
#pragma interrupt_handler uart0_rx_isr:12
void uart0_rx_isr(void)
{
uchar temp;
temp=UDR;
if (serial_ok==1)
{
if (temp!=0x0D) //加&&temp!=0x0a时,必需"@"开头
{
rcvbuf[rcvnumber]=temp; //receive buffer
rcvnumber++;
if(rcvnumber>9) rcvnumber=9; //接收时超出buf的长度,错误时
}
else
{
rcvcom_ok=rcvnumber;
usebuf[0]=rcvbuf[0];
usebuf[1]=rcvbuf[1];
usebuf[2]=rcvbuf[2];
usebuf[3]=rcvbuf[3];
usebuf[4]=rcvbuf[4];
usebuf[5]=rcvbuf[5];
rcvnumber=0;
serial_ok=0;
}
}
else
{
if (temp=='@')
serial_ok=1;
}
}
//*******************************************************************
// 串口中断发送函数
//*******************************************************************
#pragma interrupt_handler uart0_tx_isr:14
void uart0_tx_isr(void)
{
if(sendnumber!=0)
{
sendnumber--;
UDR=sendbuffer[sendnumber];
}
else sending_ok=0;
}
//*******************************************************************
// A/D中断入口函数
//*******************************************************************
#pragma interrupt_handler adc_isr:15
void adc_isr()
{
}
//*******************************************************************
// 内部看门狗初始化并启动
//*******************************************************************
void WDT_init(void) // init watchdog
{
WDR();
WDTCR=0x08; // 0x08:16.3ms;0x09:32.5ms;0x0a:65ms
}
//*******************************************************************
// 关闭内部看门狗
//*******************************************************************
void WDT_off(void) // off watchdog
{
WDTCR=0x18;
WDTCR=0x00;
}
//*******************************************************************
// 初始化函数
//*******************************************************************
void init(void)
{
SREG = 0x00;
MCUCR = 0x50; // 外部SRAM设置
DDRD = 0xf3; /* int0、int1 input */
PORTD = 0xf3; /* all 0xff */
DDRB = 0xff; // 设置端口B为输出端口
PORTB = 0xff; // 端口B=0xff;
GICR = 0x40;
TIMSK = 0x01;
TCCR0 = 0x02; //T0设置;8分之1分频
//---------------------------------------串口初始化函数
UCSRB = 0x00;
UBRRH = 0x00;
UBRRL = 25; // UBRRL=25;9600,8,n,1。UBRRL=12;19200,8,n,1
UCSRB = 0xD8;
UCSRC = 0x86;
//---------------------------------------
sending_ok=1;
sendbuffer[5]='@';
sendbuffer[4]='I';
sendbuffer[3]='N';
sendbuffer[2]='I';
sendbuffer[1]='T';
sendbuffer[0]=enter;
sendnumber=5;
UDR=sendbuffer[sendnumber];
}
//*******************************************************************
// 输出函数及地址(被调用)74HC273-1
//*******************************************************************
void HC273_1(uchar hc273data)
{
DDRC=0xff;
PORTC=~hc273data;
PORTB=0xc3;
PORTB=0xc3;
PORTB=0xc7;
}
//*******************************************************************
// 输出函数及地址(被调用)74HC273-2
//*******************************************************************
void HC273_2(uchar hc273data)
{
DDRC=0xff;
PORTC=~hc273data;
PORTB=0xc4;
PORTB=0xc4;
PORTB=0xc7;
}
//*******************************************************************
// 输入函数及地址(被调用)74HC244-1
//*******************************************************************
uchar HC244_1(void)
{
uchar hc244data;
DDRC=0x00;
PORTC=0x00;
PORTB=0xc0;
PORTB=0xc0;
PORTB=0xc0; // 延时
hc244data=PINC;
PORTB=0xc7;
return hc244data;
}
//*******************************************************************
// 输入函数及地址(被调用)74HC244-2
//*******************************************************************
uchar HC244_2(void)
{
uchar hc244data;
DDRC=0x00;
PORTC=0x00;
PORTB=0xc1;
PORTB=0xc1;
PORTB=0xc1; // 延时
hc244data=PINC;
PORTB=0xc7;
return hc244data;
}
//*******************************************************************
// 输入函数及地址(被调用)74HC244-3
//*******************************************************************
uchar HC244_3(void)
{
uchar hc244data;
DDRC=0x00;
PORTC=0x00;
PORTB=0xc2;
PORTB=0xc2;
PORTB=0xc2; // 延时
hc244data=PINC;
PORTB=0xc7;
return hc244data;
}
//*******************************************************************
// 数据写入EEPROM
//*******************************************************************
void w_eeprom(uint w_Add,uchar w_data)
{
WDR(); // 喂内部看门狗
PORTD^=0x40; // 喂外部看门狗
while (EECR & (1<<EEWE));
EEAR=w_Add;
EEDR=w_data;
EECR |= (1<<EEMWE);
EECR |= (1<<EEWE);
}
//*******************************************************************
// 读出EEPROM数据
//*******************************************************************
uchar r_eeprom(uint r_Add)
{
while (EECR & (1<<EEWE));
EEAR=r_Add;
EECR |= (1<<EERE);
return EEDR;
}
//*******************************************************************
// 分频计时
//*******************************************************************
void clock(void)
{
if (ms>9) // 5ms
{
ms=0x00;
WDR(); // 喂内部看门狗
PORTD^=0x40; // 喂外部看门狗
//----------------------------------------------
led_ms++;
if(led_ms>99) // 0.5s
{
PORTD^=0X20;
led_ms=0x00;
test_ms++;
//-----------
if (reset_ok==1)
{
if (dj_set==dj_setnum3)
cddj_ms++;
else
{
cddj_ms=0;
out1=0xF0;
}
if (cddj_ms>240) // 240 2分钟
{
cddj_ms=0;
out1=0x00;
HC273_1(0x00);
}
}
//-----------出错自动校正数据
if (origin_ok==1)
origin_ms++;
else
origin_ms=0x00;
if (origin_ms>3)
{
dj_set=dj_number=dj_setnum3;
origin_ok=0;
con_x=0;
}
//-----------
}
//--------------------------------标记无球
if (b1_old[0]=='0' && b1_ok==0) // 1#炮 检测无球
{
con1_ms++;
if (con1_ms>300) // 1.5s
b1_ok=1; // 标记要球
}
else
con1_ms=0;
//------------------
if (b1_old[2]=='0' && b2_ok==0) // 2#炮 检测无球
{
con2_ms++;
if (con2_ms>300) // 1.5s
b2_ok=1; // 标记要球
}
else
con2_ms=0;
//------------------
if (b1_old[4]=='0' && b3_ok==0) // 3#炮 检测无球
{
con3_ms++;
if (con3_ms>300) // 1.5s
b3_ok=1; // 标记要球
}
else
con3_ms=0;
//------------------
if (b1_old[6]=='0' && b4_ok==0) // 4#炮 检测无球
{
con4_ms++;
if (con4_ms>300) // 1.5s
b4_ok=1; // 标记要球
}
else
con4_ms=0;
//================================计数出错处理
if (b1_old[0]=='1' && b1_ok==1) // 1#炮
{
c1_ms++;
if (c1_ms>500) // 2.5s
con_ms=20; // 检测个数最大值
}
else
c1_ms=0;
//------------------
if (b1_old[2]=='1' && b2_ok==1) // 2#炮
{
c2_ms++;
if (c2_ms>500) // 2.5s
con_ms=20; // 检测个数最大值
}
else
c2_ms=0;
//------------------
if (b1_old[4]=='1' && b3_ok==1) // 3#炮
{
c3_ms++;
if (c3_ms>500) // 2.5s
con_ms=20; // 检测个数最大值
}
else
c3_ms=0;
//------------------
if (b1_old[6]=='1' && b4_ok==1) // 4#炮
{
c4_ms++;
if (c4_ms>500) // 2.5s
con_ms=20; // 检测个数最大值
}
else
c4_ms=0;
//==================================
//------------------
if (con_ok==1) // 要球成功,但送球机无球或不够数量时
{
cona_ms++;
if (cona_ms>24000) // 120s
{
cona_ms=0;
// if (con_ms==0x00)
// error_x++; // 报警
// else
// error_x=0x00;
con_ms=20; // 检测个数最大值
}
}
else
cona_ms=0;
//--------------------
//--------------------
}
}
//*******************************************************************
// 串口指令处理
//*******************************************************************
void command(void)
{
if (rcvcom_ok!=0)
{
if (rcvcom_ok==1)
{
if (usebuf[0]=='R')
{
com_ask=5; //返回指令标记
usebuf[1]=r_eeprom(0);
usebuf[2]=r_eeprom(1);
usebuf[3]=r_eeprom(2);
usebuf[4]=r_eeprom(3);
}
}
if (rcvcom_ok==2)
{
if (usebuf[0]=='O' && usebuf[1]=='K')
{
com_ask=2; //返回指令标记
}
}
if (rcvcom_ok==4)
{
// if (usebuf[0]=='P')
// {
// com_ask=4; //返回指令标记
// }
if (usebuf[0]=='S')
{
dj_s=(usebuf[2]-0x30)*10+(usebuf[3]-0x30);
if (usebuf[1]=='1')
dj_set=dj_setnum1;
if (usebuf[1]=='2')
dj_set=dj_setnum2;
if (usebuf[1]=='3')
dj_set=dj_setnum3;
if (usebuf[1]=='4')
dj_set=dj_setnum4;
if (usebuf[1]=='5')
dj_set=dj_setnum5;
com_ask=4; //返回指令标记
}
}
if (rcvcom_ok==5)
{
if ((usebuf[0]=='S')&&(usebuf[2]=='A')&&(usebuf[4]=='T')) //START
{
com_ask=5; //返回指令标记
}
if (usebuf[0]=='W')
{
com_ask=5; //返回指令标记
w_eeprom(0,usebuf[1]);
w_eeprom(1,usebuf[2]);
w_eeprom(2,usebuf[3]);
w_eeprom(3,usebuf[4]);
}
}
rcvcom_ok=0;
}
if (com_ask!=0 && sending_ok==0) //串口指令返回
{
sending_ok=1;
if (com_ask==2)
{
sendbuffer[2]=usebuf[0];
sendbuffer[1]=usebuf[1];
// sendbuffer[1]=testgpx;
}
if (com_ask==4)
{
sendbuffer[4]=usebuf[0];
sendbuffer[3]=usebuf[1];
sendbuffer[2]=usebuf[2];
sendbuffer[1]=usebuf[3];
}
if (com_ask==5)
{
sendbuffer[5]=usebuf[0];
sendbuffer[4]=usebuf[1];
sendbuffer[3]=usebuf[2];
sendbuffer[2]=usebuf[3];
sendbuffer[1]=usebuf[4];
}
sendbuffer[0]=0x0d;
sendnumber=com_ask+1;
UDR='&';
com_ask=0;
}
}
//*******************************************************************
// 按钮扫描
//*******************************************************************
void button_in(void)
{
uchar x;
if (b_ms>1) //1ms
{
b_ms=0x00;
input1=~HC244_3();
input2=~HC244_1();
input3=~HC244_2();
for (x=0;x<8;)
{
if (input1 & 0x01)
b1[x]='1';
else
b1[x]='0';
input1=input1>>1;
x++;
}
for (x=0;x<8;)
{
if (input2 & 0x01)
b2[x]='1';
else
b2[x]='0';
input2=input2>>1;
x++;
}
for (x=0;x<8;)
{
if (input3 & 0x01)
b3[x]='1';
else
b3[x]='0';
input3=input3>>1;
x++;
}
//----------------
if (b1[0]!=b1_old[0]) // B01
{
b0_ms++;
if (b0_ms>19) // 20ms
b1_old[0]=b1[0];
}
else
b0_ms=0x00;
//----------------
if (b1[1]!=b1_old[1]) // B02 协道1#
{
b1_ms++;
if (b1_ms>2000 && b1[1]=='1') // 2s 有球
{
out2|=0x01; // 1#协口开
b1_old[1]=b1[1];
}
if (b1_ms>50 && b1[1]=='0') // 50s 无球
{
out2&=0xFE; // 1#协口关
b1_old[1]=b1[1];
}
}
else
b1_ms=0;
//----------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -