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

📄 smartcartimer.c

📁 智能遥控车代码
💻 C
字号:
//SmartCarTimer.c : source file for the SmartCar Timers
//

#include "SmartCar.h"
#include "SmartCarTimer.h"
#include <delay.h>

#define LED_Front_Mid	0x40
#define Time_Const_38K_Trans 0xBA
#define Time_Const_38K_Receive_Next 0x84//等待5T延时常数

#define Wheel_Left 0
#define Wheel_Right 1
#define Run_Towards 0
#define Run_Backwards 1
#define Max_Speed 100
#define LED_Front_Mid	0x40
#define LED_Back_Mid	0x10

/////////////////////////////////////////////////////////////////////////////
//SmartCarTimer
bool LED_Front_Mid_State=0;
static unsigned int Receive_38K_Lenth=0;
static unsigned int Wait_Times=0,Times_2=2;
static bool Wait_Next_38K=true;
unsigned int Command_38K=0;
extern bool Front_38K_Head, Back_38K_Head;
extern unsigned int Time;
bool Not_Get_NewCommand=true;
void PWM_OC1_set(unsigned Side,unsigned int Run_Direct,unsigned int Speed);
bool Transmit_Command(unsigned int Command_x4,unsigned int Which_Led,bool Answer);
void timers_init(void)
{
	//{{WIZARD_MAP(Timers)
	// Timer/Counter0 Clock source: System Clock
	// Timer/Counter0 Clock value: 8000.000kHz
	// Timer/Counter0 Mode: CTC, TOP=OCR0A
	// Timer/Counter0 Output: A: Toggle, B: Disconnected
	sbi(DDRD, 6);//红外38K定时
	OCR0A = 0x67;
	OCR0B = 0x00;
	TCNT0 = 0x00;
	TCCR0A = 0x42;
	TCCR0B = 0x01;

	// Timer/Counter1 Clock source: System Clock
	// Timer/Counter1 Clock value: 8000.000kHz
	// Timer/Counter1 Mode: PWM, Phase and Frequency Correct, TOP=ICR1
	// Timer/Counter1 Output: A: Inverted, B: Inverted
	sbi(DDRB, 1);//电机
	sbi(DDRB, 2);
	OCR1A = 0x0065;
	OCR1B = 0x0065;
	TCNT1 = 0x0000;
	TCCR1A = 0xf0;
	TCCR1B = 0x11;
	TCCR1C = 0x00;
	ICR1=0x064;

	// Timer/Counter2 Clock source: System Clock
	// Timer/Counter2 Clock value: Stopped
	// Timer/Counter2 Mode: Normal
	// Timer/Counter2 Output: A: Disconnected, B: Disconnected
	ASSR = 0x00;//红外接收5T定时
	OCR2A = 0x00;
	OCR2B = 0x00;
	TCNT2 = 0x00;
	TCCR2A = 0x00;
	TCCR2B = 0x02;

	TIMSK0 = 0x00;//初始化 关中断0//时间使用
	TIMSK1 = 0x00;
	TIMSK2 = 0x00;//初始化 关中断2//红外接收定时用
	//}}WIZARD_MAP(Timers)
}

void Command_38K_Proc(unsigned int PINB_bit)
{
	Command_38K=Command_38K<<1;//车头接收头接收命令左移1
	if(bit_is_set(PINB,PINB_bit))
		{
			Command_38K=(Command_38K | 0x01);//末位置1//接收到低电平
			Times_2=2;//15T就1,20T就2,25T就3
		}
	else
		{
			Times_2=4;//30T
		}
	Wait_Next_38K=true;						//等待下一帧起始位标志置1
	Receive_38K_Lenth++;
}

ISR(SIG_OVERFLOW0)
{
	Time++;
}
ISR(SIG_OVERFLOW1)
{
}
ISR(SIG_OVERFLOW2)
{
	// TODO: Add your code here
	TCNT2=Time_Const_38K_Receive_Next;
	if(Wait_Next_38K)
		{
			
			if(Wait_Times<Times_2)
				{
					//等待15T准备接收下一帧数据
					Wait_Times++;
				}
			else
				{
					Wait_Times=0;
					Wait_Next_38K=false;
				}
		}
	else//第一次已经等待了15T所以直接进入
		{
			if (Front_38K_Head)//车头接收
				{
					if(Receive_38K_Lenth<3)//一共4帧数据//可随时改接收帧数
						{
							Command_38K_Proc(0);
						}
					else
						{
							Command_38K_Proc(0);
							TIMSK2 = 0x00;//关 定时器2中断
							Not_Get_NewCommand=false;
							Receive_38K_Lenth=0;//初始化接收数据长度
							Wait_Next_38K=true;//初始化接收数据
							PCMSK0 = 0x21;//开 引脚电平变化中断
							Front_38K_Head=false;
							//delay(1,8000);
							//Transmit_Command(Command_38K, LED_Front_Mid, false);//回复
						}
				}//End_if (Front_38K_Head)
			
			else if (Back_38K_Head)//车尾接收
				{
					if(Receive_38K_Lenth<3)//一共4帧数据//可随时改接收帧数
						{
							Command_38K_Proc(5);
						}
					else
						{
							Command_38K_Proc(5);
							TIMSK2 = 0x00;//关 定时器2中断
							Not_Get_NewCommand=false;
							Receive_38K_Lenth=0;//初始化接收数据长度
							Wait_Next_38K=true;//初始化接收数据
							PCMSK0 = 0x21;//开 引脚电平变化中断
							Back_38K_Head=false;
							//delay(1,8000);
							//Transmit_Command(Command_38K, LED_Back_Mid, false);//回复
						}
				}//End_if (Back_38K_Head)
			else//错误捕捉
				{
					
				}//End_if_38K_Head
		}//End_if(38K_Wait_Next)
}



⌨️ 快捷键说明

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