⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fpl032dj_v02.c

📁 计算机通过串口与51单片机通讯,在单片机上实现多路硬件设备控制
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -