📄 main.c
字号:
/*
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 + -