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

📄 test.c

📁 无线收发系统 无线收发系统 无线收发系统 无线收发系统
💻 C
📖 第 1 页 / 共 2 页
字号:
					send_byte_p++;
					send_byts--;
					send_bit_p = 8;
				}
		
				if(sending_byte & 0x80){
					SEND_PULS(PULS_1_WIDTH);
				}else{
					SEND_PULS(PULS_0_WIDTH);
				}
		
				sending_byte <<= 1;
				send_bit_p--;
			}
		}else{
			SEND_PULS(PULS_STOP_WIDTH);
			send_stat = SEND_SUCCESS;
		}
	}
	return;
}
//=============================================================
//发送程序 结束
//=============================================================

//=============================================================
//接收程序 开始
//=============================================================

unsigned char recv_buf[16];
#define recv_byts recv_buf[0]		//应收到字节数,由每个包的第一个字节指定
unsigned char recving_byte;			//当前正在接收的字节
unsigned char recv_byte_p;			//已收到字节数(不含正在接收的字节)
unsigned char recv_bit_p;			//当前正在接收的字节等待接收位数(不含正在接收的位)

#define RECV_FAILED 0x31
#define RECV_SUCCESS 0x41

unsigned char recv_stat = 0; 	//接收程序当前状态,为0时正常
unsigned char recv_step = 0;		//引导脉冲标志,为0时等待引导,为1时等待数据

#define TEST_PULS(puls_in, puls_type) (puls_in > puls_type - PULS_0_WIDTH / 2 && puls_in < puls_type + PULS_0_WIDTH / 2)

#define HEAD_NEED_RECIVED 8
void recv(){
	unsigned puls_width;

	if ((recv_stat == RECV_SUCCESS) || !w_data)
		return;

	puls_width = w_data;
	w_data = 0;

#if 0	//输出脉宽
	serial_out(puls_width);
//	printhex(puls_width);
#endif

	if (recv_step < HEAD_NEED_RECIVED){
		if(TEST_PULS(puls_width, PULS_HEAD_WIDTH)){
			recv_step++;
		}else{
			recv_step = 0;
		}
	}else if (recv_step == HEAD_NEED_RECIVED){
		if(TEST_PULS(puls_width, PULS_START_WIDTH)){
			serial_out(0xbb);
			recv_byte_p = 0;
			recv_bit_p = 8;
			recv_stat = 0;
			recv_step++;
		}else{
			if(!TEST_PULS(puls_width, PULS_HEAD_WIDTH)){
				recv_step = 0;
			}
		}
	}else{
//serial_out(puls_width);
		recving_byte <<= 1;
		if(TEST_PULS(puls_width, PULS_0_WIDTH)){
			recving_byte &= 0xfe;
		}else if(TEST_PULS(puls_width, PULS_1_WIDTH)){
			recving_byte |= 1;
		}else{
			serial_out(puls_width);
			recv_step = 0;
			serial_out(0xaa);
			return;
		}
		recv_bit_p--;
		if(recv_bit_p == 0){	//接收完一字节
			recv_bit_p = 8;
//			serial_out(recving_byte);	//输出接收到的字符
			recv_buf[recv_byte_p] = recving_byte;
			recv_byte_p++;
			if(recv_byte_p == recv_byts){
				recv_step = 0;
				recv_stat = RECV_SUCCESS;
			}
		}
	}
}

//=============================================================
//接收程序 结束
//=============================================================

#define SEND_DELAY_TIME 20		//防碰撞延迟(单位:毫秒)
unsigned char send_delay = SEND_DELAY_TIME;
#define VALID_PULS_COUNT 10
unsigned char valid_puls_counts = VALID_PULS_COUNT;

//碰撞检测在该函数中实现.由于无线模块本身的限制,碰撞检测为非完全检测,只能在发送前
//检测是否有其它单元在使用信道,在发送过程中受到的碰撞干扰是无法检测到的.经测试,效果还行
void wirless(){
	if (send_stat == SEND_PROGRESSING && send_delay == 0){
		send();
		if (send_stat == SEND_SUCCESS)
			send_delay = SEND_DELAY_TIME;
	}else{
		recv();
		if (recv_step > HEAD_NEED_RECIVED)	//如果检测到当前有其它单元正在发送,继续等待
			send_delay = SEND_DELAY_TIME;
		else{
			if(TEST_PULS(w_data, PULS_0_WIDTH)	//如果检测到当前有其它单元正在发送,继续等待
				|| TEST_PULS(w_data, PULS_1_WIDTH)
				//|| TEST_PULS(w_data, PULS_HEAD_WIDTH)
				|| TEST_PULS(w_data, PULS_START_WIDTH)
				//|| TEST_PULS(w_data, PULS_STOP_WIDTH)
				){
					if (valid_puls_counts)
						valid_puls_counts--;
					else
						send_delay = SEND_DELAY_TIME;
				}else{
					valid_puls_counts = VALID_PULS_COUNT;
				}
		}
	}
}


void Display_T()
{
  DisplayOneChar(9,1,recv_buf[5]);
  DisplayOneChar(8,1,recv_buf[4]);
  DisplayOneChar(7,1,recv_buf[3]);
  DisplayOneChar(6,1,recv_buf[2]);
  DisplayOneChar(5,1,recv_buf[1]);
  DisplayOneChar(0,0,0x54);
}

#define SCMD_SET_PORT 0x51
#define SCMD_GET_PORT 0x52

#define SCMD_RESET 0x61

#define SCMD_LCD_OUTSTR 0x71
#define SCMD_LCD_RESET 0x72
#define SCMD_LCD_SETXY 0x73
#define SCMD_LCD_SETLINE 0x74
#define SCMD_LCD_CLEAR 0x75


#define SRESP_GET_PORT_ERROR 0x41
#define SRESP_SET_PORT_ERROR 0x42

#define HEART_BEAT_INTERVAL 200		//心跳间隔 X / 1000   秒
unsigned int heart_beat_timer = HEART_BEAT_INTERVAL;
unsigned int last_jiffies=0;




void main(){
    Delay400Ms(); //启动等待,等LCM讲入工作状态
    LCMInit(); //LCM初始化
    Delay5Ms(); //延时片刻(可不要)
	mychar(10,1); //显示 自定义字符
	init_serialcomm();
	P0=0x0ff;
	P2=0x00;
	sys_init();


	//send_string_com("ok",2);
	//lcd_reset();
	//lcd_power_on();
 	//lcd_self_test();

	while(1){
		if (jiffies - last_jiffies >= 20){//每次中断为50us,所以要20次才为1ms
			last_jiffies = jiffies;
			heart_beat_timer--;
			if (send_delay)
				send_delay--;
		}
            
		if (heart_beat_timer == 0){
			heart_beat_timer = HEART_BEAT_INTERVAL;
	
			while(1) {recv();if (recv_stat == RECV_SUCCESS) 
		    {
		    P0_0=~P0_0;
			send_string_com(recv_buf,strlen(recv_buf));	
			Display_T();
			recv_stat = 0;break;}
			recv_stat = 0;			
			 }
		}

/*#if 0
		if (send_stat == 0){
			//碰撞测试
			START_SEND(8);
			send_buf[1]='T';
			send_buf[2]='e';
			send_buf[3]='s';
			send_buf[4]='t';
			send_buf[5]='O';
			send_buf[6]='k';
			send_buf[7]='!';
			
			lcd_out_string("sending:");
			//send_string_com(send_buf,strlen(send_buf));
			printhex(send_buf[0]);
			printhex(send_buf[1]);
		}
#endif
*/
		wirless();

		if (send_stat == SEND_FAILED){

	
			send_stat = 0;

		}else if (send_stat == SEND_SUCCESS){
			send_stat = 0;
			P2_3=~P2_3;

		}
	    //recv();
       //send_string_com("start",5);
		/*while(1) {recv();if (recv_stat == RECV_SUCCESS) 
		    {
		    P0_0=~P0_0;
			send_string_com(recv_buf,strlen(recv_buf));} }*/
	/*	if (recv_stat == RECV_SUCCESS){	
		//send_string_com("test1",5);
#if 1
			//unsigned int i;
			//for(i=0; i<recv_byts; i++)
			//	serial_out(recv_buf[i]);	//输出接收到的字符
			P0_0=~P0_0;
			send_string_com(recv_buf,strlen(recv_buf));
#else
			//if (recv_buf[1]=='o')
			//P0=0x00;
			//lcd_out_string("data recived:");
			//printhex(recv_buf[0]);
			//printhex(recv_buf[1]);
			//OutChar('\n');
			//send_string_com("test3",5);
#endif
			recv_stat = 0;
		}
*/
#if 0
		if (RI){
			unsigned char scmd[17];
			heart_beat_timer = HEART_BEAT_INTERVAL;
			wait_serial(scmd, 1, 0);
			switch(scmd[0]){
				case SCMD_RESET:
					((void (code *) (void))0x0000) ();//软件复位
				case SCMD_SET_PORT:
					if (wait_serial(scmd, 2, 200))
						break;
					switch(scmd[0]){
						case 0:
							P0 = scmd[1];
							break;
						case 1:
							P1 = scmd[1];
							break;
						case 2:
							P2 = scmd[1];
							break;
						case 3:
							P3 = scmd[1];
							break;
					}
					break;
				case SCMD_GET_PORT:
					if (wait_serial(scmd, 1, 200))
						break;
					switch(scmd[0]){
						case 0:
							serial_out(P0);
							break;
						case 1:
							serial_out(P1);
							break;
						case 2:
							serial_out(P2);
							break;
						case 3:
							serial_out(P3);
							break;
					}
					break;
				case SCMD_LCD_OUTSTR:
					if (wait_serial(scmd, 1, 200))
						break;
					scmd[scmd[0]] = 0;
					if (wait_serial(scmd, scmd[0], 200))
						break;
					lcd_out_string(scmd);
					break;
				case SCMD_LCD_RESET:
					lcd_reset();
					break;
				case SCMD_LCD_CLEAR:
					lcd_clear();
					break;
				case SCMD_LCD_SETXY:
					if (wait_serial(scmd, 2, 200))
						break;
					SetXY(scmd[0], scmd[1]);
					break;
				case SCMD_LCD_SETLINE:
					if (wait_serial(scmd, 1, 200))
						break;
					SetLine(scmd[0]);
					break;
				default:
					break;
			}
		}
#endif
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -