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

📄 anglesensor.c

📁 一个通过方向判别芯片进行角度计算的程序
💻 C
字号:

/********************************************************************************************************
**
**				                               AngleSensor
**
**                                                V2.0
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: AngleSensor.c
**创   建   人: 吕江波
**最后修改日期: 2006年12月25日
**描        述: 角度传感器源代码。
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 吕江波
** 版  本: V1.0
** 日 期: 2006年11月2日
** 描 述: 配套助推机芯(I/O中断控制)
**
**------------------------------------------------------------------------------------------------------
** 创建人: 吕江波
** 版  本: V2.0
** 日 期: 2006年12月22日
** 描 述: 配套电动机芯(I/O中断控制)
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/

#include "config.h"

#include <STC12C2052AD.H>
#include <INTRINS.H>

/********** Port define ***********/

	#define DIR 	P3_7

	#define NUM2 	P1_7	
	#define NUM1 	P1_6
	#define NUM0 	P1_5
	#define IRQ 	P1_4	

	#define LEFT 	0x55
	#define RIGHT 	0xaa
	#define RESET	0x5a
	
	#define STATE1 	2
	#define STATE2 	3
	#define STATE3  10

	#define OTHER 	4
	#define ZERO 	0
	#define ERROR1  2
	#define ERROR2 	3
	#define WARN1 	254
	#define WARN2	253

/********** Common variable **********/

	uint8 OS_Q_MEM_SEL angleSet [ 32 ] ;
	uint8 OS_Q_MEM_SEL angleOut [ 32 ] ; 

/*************************************/

void AppInit ( void ) ;

void AngleSet_task ( void ) ;
void AngleOut_task ( void ) ;

void main(void)
{
    OSInit() ;

	OSQCreate ( angleSet , 32 ) ;
	OSQCreate ( angleOut , 32 ) ;	

    OSTaskCreate ( AngleSet_task , NULL	, 0 ) ;
	OSTaskCreate ( AngleOut_task , NULL	, 1 ) ;

	AppInit () ;

    while(1)
	{
		WDT_CONTR |= 0x10 ;
	}
}

//ID : 0

void AngleSet_task( void ) 
{
	static uint8 angleValue = 0 ;
	uint8 setData ;

	while (1)
    {
		OSQPend ( &setData , angleSet , 0 ) ;

		switch ( setData )
		{
			case LEFT :

				angleValue++ ;
				break ;

			case RIGHT :

				angleValue-- ;
				break ;
			
			case RESET :

				angleValue = 0 ;
				OSQPost ( angleOut , ZERO ) ;
				break ;

			default :
				
				continue ;
				break ;
		}
		
		switch ( angleValue )
		{
/*
			case ZERO	 :

				OSQPost ( angleOut , ZERO ) ;
				break ;
*/
			case STATE1 :

				OSQPost ( angleOut , STATE1 ) ;
				break ;
			
			case STATE2 :

				OSQPost ( angleOut , STATE2 ) ;
				break ;
			
			case STATE3 :

				OSQPost ( angleOut , STATE3 ) ;
				break ;

			case WARN1 :

				OSQPost ( angleOut , WARN1 ) ;
				break ;

			case WARN2 :

				OSQPost ( angleOut , WARN2 ) ;
				break ;

			case OTHER :

				OSQPost ( angleOut , OTHER ) ;
				break ;

			default :
				break ;
		}					
    }
	
	return ; 
}

//ID : 1

void AngleOut_task ( void )
{
	uint8 outData ;

	while ( 1 )
	{
		OSQPend ( &outData , angleOut , 0 ) ;
		
		switch ( outData )
		{
			case ZERO :

				NUM2 = 0 ; NUM1 = 0 ; NUM0 = 0 ;
				break ;

			case STATE1 :
	
				NUM2 = 0 ; NUM1 = 0 ; NUM0 = 1 ;
				break ;
			
			case STATE2 :

				NUM2 = 0 ; NUM1 = 1 ; NUM0 = 0 ;
				break ;

			case WARN1 :

				NUM2 = 0 ; NUM1 = 1 ; NUM0 = 1 ;
				break ;

			case WARN2 :

				NUM2 = 1 ; NUM1 = 0 ; NUM0 = 0 ;
				break ;

			case OTHER :

				NUM2 = 1 ; NUM1 = 0 ; NUM0 = 1 ;
				break ;

			case STATE3 :

				NUM2 = 1 ; NUM1 = 1 ; NUM0 = 0 ;
				break ;

			default :
				
				continue ;
				break ;
		}

		_nop_() ; _nop_() ; _nop_() ; _nop_() ; _nop_() ; _nop_() ;
		IRQ = 0 ;		
		_nop_() ; _nop_() ; _nop_() ; _nop_() ; _nop_() ; _nop_() ;
		IRQ = 1 ;
	}

	return ;
}			

/******** System initialize *********/

void AppInit ( void )
{
/* ========== IO define =========== */

	P3M1 = 0x42 ; P3M0 = 0xBD ;
	P1M1 = 0xff ; P1M0 = 0x00 ;

	IRQ = 1 ;
	NUM2 = 0 ; NUM1 = 0 ; NUM0 = 0 ;

/* ========== WDT define ========== */

	AUXR = 0x00 ;

/* ========== SIO define ========== */

	SCON = 0x50 ;
	ES = 0 ;

/* ========== INT define ========== */

	IT0 = 1 ; 
	EX0 = 1 ;

	IT1 = 1 ;
	EX1 = 1 ;

/* ========= TIMER define ========= */

	TMOD = 0x21 ;

	TH1 = 0xfa ; TL1 = 0xfa ;
	TR1 = 1 ;
	ET1 = 0 ;

	TH0 = 0x70 ; TL0 = 0x00 ; 
	TR0 = 1;
	ET0 = 1;

/* ======== GLOBAL define ========= */
	
	IPH = 0x05 ; IP = 0x03 ;
	EA = 1 ;

/* ========== WDT define ========== */

	WDT_CONTR = 0x25 ;
	
	return ;
}	

/******** Interrupt server *********/

#pragma disable
void AngleChange ( void ) interrupt IE0_VECTOR
{
    OS_INT_ENTER() ;

	//ISR
	
	if ( DIR == 1 ) 
		OSQIntPost ( angleSet , LEFT ) ;
	else if ( DIR == 0 )
		OSQIntPost ( angleSet , RIGHT ) ;

	OSIntExit() ;	

	return ;
}

#pragma disable
void AngleReset ( void ) interrupt IE1_VECTOR
{
    OS_INT_ENTER() ;

	//ISR

	OSQIntPost ( angleSet , RESET ) ;
//	angleValue = 0 ;
//	OSQIntPost ( angleOut , ZERO ) ;

	OSIntExit() ;	

	return ;
}
/*
#pragma disable
void ErrorISR_SIO ( void ) interrupt SIO_VECTOR
{
	_nop_() ;
	_nop_() ;
	
	ES = 0 ;	

	return ;
}
*/
/*
#pragma disable
void ErrorISR_T1 ( void ) interrupt TF1_VECTOR
{
	_nop_() ;
	_nop_() ;

	ET1 = 0 ;

	return ;
}
*/
/********* Timer 0 reset **********/

void UserTickTimer ( void ) 
{
	TH0 = 0x70 ; TL0 = 0x00;	

	return ;
}	

/**************************************************************************************
									End Of File
**************************************************************************************/

⌨️ 快捷键说明

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