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

📄 main.c

📁 salvo 一个功能和效率并重的操作系统 适合各种8-BIT的MCU
💻 C
📖 第 1 页 / 共 2 页
字号:


/*
This program is based on the Salvo RTOS (v2.1). Its function is to scan 
four thermistors and report their temperatures. If any of reported temperatures
are not within a preset range, the alarm will sound. Four potentiometers adjustments 
are acessed via keypad entry. Two of them will be used to determine the Piezo tone and  
duty cycle, while these pots are being set their A/D values will appear on the LED display. 
The four thermistor are divided up into 4 zones, each zone can be displayed on the 
4-digit LED display via a keypad entry. The defined temperature range can be entered by keypad 
entry,entering the LOW temp first followed by the HIGH temp. Zone temperatures can be recalled
onto a PC monitor via the Hyperterminal by pressing 'z' on a PC keyboard.
Every time a zone goes into alarm, the alarm zone number will be written to the 
EEPROM. The zone that last set off an alarm can be recalled via keypad entry and the
zone number will be displayed.
*/

			
#include <salvo.h>

#define ALARM  		0
#define WEEPROM 	1
#define REEPROM 	2
#define POTVAL  	3
#define	DISPLAY		4

static volatile unsigned int TMR1 @ 0x0E;
	
bank1  	unsigned char Low_Hi;
bank1 	signed   char data_address;				//EEPROM ADDRESS
bank1 	unsigned char *zone_dis;				//ZONE DISPLAY			
bank1	unsigned char temp1, temp2, temp3, temp4;		//ALARM & ZONE TEMPS
bank1	unsigned char low, high;				//LOW & HIGH TEMP THRESHOLD

bank1	unsigned char Z1[39] = "ZONE Temps: z1-xx z2-xx z3-xx z4-xx\n\r\v";	//RS-232 DISPLAY
					
const	char SevenSegmentTable[] = 			//DIGIT SEGMENTS
	{ 	0b11000000, 			// 0
		0b11111001, 			// 1
		0b10100100, 			// 2
		0b10110000, 			// 3
		0b10011001, 			// 4
		0b10010010,			// 5
		0b10000010,			// 6
		0b11111000,			// 7
		0b10000000,			// 8
		0b10010000			// 9
	};

const unsigned char CHSmask[] =				//A/D CHS BITS
	{	0b00100000,
		0b00101000,
		0b00110000,
		0b00111000
	};
	
const unsigned char zones[] =				//TEMPERATURE ZONE NUMBERS
	{
		1,
		2,
		3,
		4
	};
	
bank1 unsigned char * const tempPArray [] =		//ZONE TEMPERATURES
	{
		&temp1,
		&temp2,
		&temp3,
		&temp4
	};

				//PROTOTYPES
void 	Delay(unsigned char tmr);
void 	interrupt isr(void);
void	ConvertAD(void);
char	ButtonPress(unsigned char buttons);
char 	Keys(void);
void 	BcdConv(char);
void	WriteSevenSegment( unsigned char segment, unsigned char digit);
char	ReadUSART(void);
void 	WriteUSART(char data);
void 	WriteUSARTBuffer(unsigned char *data, unsigned char len);
void 	Idle(void);
void 	Display(unsigned char lo_hi);
void 	PotDisplay(void);
void	ConvertTemp( bank1 unsigned char * const temp, 
                     const unsigned char * zone );

	_OSLabel (task_convert1)
	_OSLabel (task_alarm_on1)
	_OSLabel (task_alarm_on2)
	_OSLabel (task_alarm_on3)
	_OSLabel (task_alarm_on4)
	_OSLabel (task_keypad1)
	_OSLabel (task_keypad2)
	_OSLabel (task_keypad3)
	_OSLabel (task_display1)
	_OSLabel (task_display2)
	_OSLabel (task_usart1)	
	_OSLabel (task_weeprom1)
	_OSLabel (task_reeprom1)
	_OSLabel (task_reeprom2)
	_OSLabel (task_reeprom3)
	_OSLabel (task_pots1)
	_OSLabel (task_pots2)
		
//**************************(  FUNCTIONS  )****************************************

void 	Delay(unsigned char tmr)		//TIMER0 MAX TIMEOUT = 13mS
{
	TMR0 = 255 - tmr;
	T0IF = 0;
	while(T0IF==0);
}


#pragma interrupt_level 0
void	 interrupt isr(void) 			//TIMER1 2mS PERIODIC INTERRUPT
{
	if(TMR1IF)
	{
		TMR1IF = 0;
		TMR1 -= 5000;
		OSTimer();
	}
} 


void	ConvertAD(void)				//A/D CONVERSION
{
	Delay(1);				
	ADGO = 1;					
	while(ADGO);
}


char	ButtonPress(unsigned char buttons)
{
	unsigned char Col_Row;			//FIND BUTTON PRESS
	PORTB = buttons;
	Delay(55);
	Col_Row = PORTB;
	return Col_Row;
}		


char	Keys(void)		//NUMBER SELECTION
{	
 		char 	KeyVal = 10;			//BUTTON NUMBER PRESSED		
		PORTD = 0x0F;				//LED'S OFF
		TRISB = 0xF0;				//RB7:RB4=INPUTS,RB3:RB0=OUTPUTS
	
	while(KeyVal == 10)
	{	
		switch(ButtonPress(0b00001110))
		{
		case 0xEE:
			KeyVal = 0b00000001;		//#1
			break;

		case 0xDE:
			KeyVal = 0b00000100;		//#4
			break;

		case 0xBE:
			KeyVal = 0b00000111;		//#7
			break;

		default:
			break;
		}
		
		switch(ButtonPress(0b00001101))
		{
		case 0xED:
			KeyVal = 0b00000010;		//#2
			break;

		case 0xDD:
			KeyVal = 0b00000101;		//#5
			break;

		case 0xBD:
			KeyVal = 0b00001000;		//#8
			break;

		case 0x7D:
			KeyVal = 0;			//#0
			break;

		default:
			break;
		}

		switch(ButtonPress(0b00001011))
		{
		case 0xEB:
			KeyVal = 0b00000011;		//#3
			break;

		case 0xDB:
			KeyVal = 0b00000110;		//#6
			break;

		case 0xBB:
			KeyVal = 0b00001001;		//#9
			break;

		default:
			break;

		}
	PORTB = 0b00000000;
	}return KeyVal;
}

void 	BcdConv(char KeyVal)			//BCD CONVERSION
	{
		Low_Hi *= 10;
		Low_Hi += KeyVal;
	}

void 	WriteSevenSegment(unsigned char segment, unsigned char digit)
{						//LED VALUE DISPLAY
	switch(digit)			
	{
	case 1:
		PORTD = 0x0E; 			//FIRST DIGIT
		break;

	case 2:
		PORTD = 0x0D;			//SECOND DIGIT
		break;

	case 3: 
		PORTD = 0x0B;			//THIRD DIGIT
		break;

	case 4:
		PORTD = 0x07;			//FOURTH DIGIT
		break;
	}

	TRISB = 0x00;
	PORTB = SevenSegmentTable[segment];	//SEND SEGMENT NUMBER TO PORTB
}


char	ReadUSART(void)				//READ SERIAL DATA ENTRY
{
	unsigned char rdata;				
	if(RCIF)				//RECEPTION COMPLETE
	rdata = RCREG;
	return rdata;
}


void 	WriteUSART(char data)			//WRITE SERIAL DATA
{
	while(!TRMT);
	TXREG = data;
}


void 	WriteUSARTBuffer(unsigned char *data, unsigned char len)
{					
	unsigned char i;
	
	for ( i = 0; i < len; i++ )
		WriteUSART(data[i]);		//WRITE STRING
}


void 	Idle(void)				//I2C IDLE FUNCTION
{
	while((SSPCON2 & 0x1F)|(STAT_RW))		
	continue;
}


void 	Display(unsigned char lo_hi)		//DISPLAY LOW & HIGH INPUT
{	
		unsigned char v1,v2,v3;
		unsigned char i;

	for(i=1; i<200; i++)
		{
		v1 = lo_hi/0x64;			//FIND FIRST DISPLAY DIGIT
		v2 = (lo_hi-(v1*0x64))/10;		//FIND SECOND DIGIT
		v3 = (lo_hi-(v1*0x64)-(v2*10));		//FIND THIRD DIGIT 
		WriteSevenSegment(0, 1);		//SEND SEGMENT VALUE AND DIGIT 1
		Delay(55);				//DIGIT DELAY
		WriteSevenSegment(v1, 2);	
		Delay(55);				
		WriteSevenSegment(v2, 3);		
		Delay(55);				
		WriteSevenSegment(v3, 4);	
		Delay(55);				
		}
}


void 	PotDisplay(void)
{			
		unsigned char v1,v2,v3;
	for(;;)
	{
		ConvertAD();
		v1 = ADRESH/0x64;			//FIND FIRST DISPLAY DIGIT
		v2 = (ADRESH-(v1*0x64))/10;		//FIND SECOND DIGIT
		v3 = (ADRESH-(v1*0x64)-(v2*10));	//FIND THIRD DIGIT ;
		WriteSevenSegment(v1, 2);		//SEND SEGMENT VALUE AND DIGIT 2
		Delay(15);
		WriteSevenSegment(v2, 3);		//SEND SEGMENT VALUE AND DIGIT 3
		Delay(15);
		WriteSevenSegment(v3, 4);		//SEND SEGMENT VALUE AND DIGIT 4
		Delay(15);

		PORTD = 0x0F;				//PREPARE FOR KEYPAD USE
		TRISB = 0xF0;
		if(ButtonPress(0b00001101) == 0x7D)
		break;
	}
}


void ConvertTemp( bank1 unsigned char * const temp, const unsigned char * zone )
{	float adresh;
	adresh = ADRESH;
	*temp = ( (.538) + (.444*(adresh) ) + (.001*(adresh)*(adresh) ) ); 

	if ( ( low > *temp ) || ( *temp > high ) )
	 {
		OSSignalMsg(ALARM, (OStypeMsgP) zone);		//SIGNAL task_alarm() W/ ZONE #
		OSSignalMsg(WEEPROM, (OStypeMsgP) zone);	//SIGNAL task_weeprom() W/ ZONE #
	 }
}

//**************************(   TASKS   )*******************************************
//**********************************************************************************

void 	Task_Convert(void)			
{
		static unsigned char i = 0;
	
	for(;;)
	{
		ADCON0 &= ~0b00111000;			//CLEAR CHS BITS
		ADCON0 |=  CHSmask[i];			//SELECT CHS
		ConvertAD();				//CONVERT CHS
		ConvertTemp(tempPArray[i], &zones[i] );
		
		if ( ++i > 3 ) i = 0;
	
		OS_Delay(20,task_convert1);		//DELAYED FOR 40mS
	}
}


void	Task_Alarm_On(void)				//WAITING TASK		
{
		OStypeMsgP msgP;
	
	for(;;)
	{
		OS_WaitMsg(ALARM, &msgP, task_alarm_on1);
		OS_WaitBinSem(DISPLAY, task_alarm_on2);
		WriteSevenSegment(* ( const unsigned char *) msgP, 4);	//DISPLAY ALARM ZONE
		CCP1CON = 0x0F;
		OS_Delay(200, task_alarm_on3);
		CCP1CON = 0;
		OS_Delay(200, task_alarm_on4);
		OSSignalBinSem(DISPLAY);		
	}
}

⌨️ 快捷键说明

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