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

📄 xaioche_over.txt

📁 基于51单片机或者ARM2131的电子小车的设计
💻 TXT
字号:
#include 	"config.h"

#define		PWM2	(2 << 14)	//P0.7
#define		DIR1	(1 << 5)	//P0.5
#define		DIR2	(1 << 6)	//P0.6
#define 	KEY1	(1 << 16)	//P0.16,EXINT0
#define 	KEY5	(1 << 20)	//P0.20,EXINT3

void __irq IRQ_youzhuan(void);
void __irq IRQ_zuozhuan(void);
void __irq IRQ_Timer0(void);

void DelayNS (uint32 dly)						//延时程序
{
	uint32 i;
	
	for ( ; dly>0; dly--)
		for (i=0; i<5000; i++);
}

void PWM2_Init()
{	PWMPR  = 0x00;								//不分频,PWM计数频率为Fpclk
	PWMMCR = 0x02;								//PWMMR0与PWMTC匹配时复位PWMTC
	PWMPCR = (1 << 0) |							//PWM2单边沿控制		
			 (1 <<10);							//使能PWM2输出	 
	PWMMR0 = Fpclk/400;							//PWM速率控制/计数初值,T=1/400s,//经验值,电机转速
	PWMMR2 = PWMMR0/2;							//PWM1的位置,方波作为STK_CLK		 
	PWMLER = 0x05;								//锁存0,2的PWM匹配值
	PWMTCR = 0x02;								//复位PWMTC
	PWMTCR = 0x09;								//使能PWM
}

void Timer0_Init(void)
{	T0TC	=	0;								//定时器设置为0
	T0PR	=	0;								//时钟不分频
	T0MCR	=	0x03;							//设置T0MR0匹配复位T0TC,并产生中断标志
	T0MR0	=	Fpclk/10;						//1/10s定时,//经验值,小车转弯角
	T0TCR	=	0x01;							//启动定时器0
	T0IR	= 	0x01;							//清除中断标志
}

void EINT_Init(void)
{	VICIntSelect	=	0;						//设置所有中断匹配为IRQ中断
	
	VICVectCntl0 	= 	0x20 | 14;				//分配EINT0中断到向量中断0
   	VICVectAddr0 	= 	(uint32)IRQ_zuozhuan; 	//设置中断服务程序地址
   	EXTMODE 		= 	0x01;					//设置EINT1为边沿触发。				
												//极性寄存器使用默认值,0,下降沿
												
   	VICVectCntl1 	= 	0x20 | 17;				// 分配EINT3中断到向量中断1
   	VICVectAddr1 	= 	(uint32)IRQ_youzhuan; 	// 设置中断服务程序地址   						
   	EXTMODE 		= 	EXTMODE | 0x06;			//设置EINT3为边沿触发。				
												//极性寄存器使用默认值,0,下降沿
	EXTINT 			= 	0x09;					// 清除EINT0、EINT3中断标志	
												
	VICVectCntl2 	=	0x20 | 4;				//分配Timer0中断到向量中断2
   	VICVectAddr2 	= 	(uint32)IRQ_Timer0; 	//设置中断服务程序地址
   	T0IR	 		= 	0x01;												
   
   	VICIntEnable 	= 	(1<<4)|(1 << 14) | (1 << 17);//使能Timer0、INT0、EINT3中断
	IRQEnable();								//使能IRQ中断
}

void __irq IRQ_Timer0 (void)
{	IO0SET 	= 	DIR2;							//输出为1																						
	IO0CLR 	= 	DIR1;							//输出为0
															
	T0TCR	=	0x00;							//禁止定时器0				
	while( (T0IR & 0x01) !=0 )					//等待外部中断信号恢复为高电平	
   	{  T0IR = 0x01;								//清除EINT0中断标志
  	}							
	VICVectAddr	=	0x00;						//通知VIC中断处理结束
}

void __irq IRQ_zuozhuan(void)
{	T0TCR	=	0x00;							//禁止定时器0	
	
	if( (IO0PIN & KEY5 ) == 0 )					
	{	DelayNS (10);							//去干扰,3.9ms
		if( (IO0PIN & KEY5 ) == 0 )				//同时检测到黑线,停
			PWMTCR = 0x00;						//禁止PWM
		else
		{							
		IO0SET 	= 	DIR1 | DIR2;				//输出为1	
		Timer0_Init();	
		}
	}
	else
	{							
		IO0SET 	= 	DIR1 | DIR2;				//输出为1	
		Timer0_Init();	
	}
								 	
   	while ((EXTINT & 0x01) != 0)
	{
		EXTINT 	= 	0x01;						//清除EINT0中断标志
	}
	VICVectAddr	=	0x00;						//通知VIC中断处理结束
}

void __irq IRQ_youzhuan(void)
{	T0TCR	=	0x00;							//禁止定时器0
	if( (IO0PIN & KEY1 ) == 0 )					
	{	DelayNS (10);							//去干扰,3.9ms
		if( (IO0PIN & KEY1 ) == 0 )				//同时检测到黑线,停
			PWMTCR = 0x00;						//禁止PWM
		else
		{							
		IO0CLR 	= 	DIR1 | DIR2;				//输出为0	
		Timer0_Init();	
		}		
	}
	else
	{							
		IO0CLR 	= 	DIR1 | DIR2;				//输出为0	
		Timer0_Init();	
	}		

	while( (EXTINT&0x08)!=0 )					//等待外部中断信号恢复为高电平	
   	{  EXTINT 	= 	0x08;						//清除EINT3中断标志
  	}
	VICVectAddr	=	0x00;						//通知VIC中断处理结束
}

int main (void)
{	PINSEL0 = 	PWM2;							//P0.7连接PWM2	
	PINSEL1 = 	0x00000301;						//设置管脚连接,P0.16设置为EINT0,P0.20设置为EINT3
												//其余为GPIO
												
	IODIR	=	DIR1	|						//都为输出				
				DIR2;							//								
				
	IO0SET 	= 	DIR2;							//输出为1																						
	IO0CLR 	= 	DIR1;							//输出为0
														
	PWM2_Init();								//PWM1初始化
	EINT_Init();								//EINT1,EINT2初始化
		
	while(1);	
    return 0;
}

⌨️ 快捷键说明

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