📄 main.c
字号:
//*************************************************************************************************
// Module Name : Main.C
// CreateDate : 2006-07-13
// ModifData : 2006-07-25
// Description :
// Author : Explorer01
// Version : V1.0
//*************************************************************************************************
//
//-------------------------------------------------------------------------------------------------
// Includes
//-------------------------------------------------------------------------------------------------
#include <STC51.H>
#include "DS18B20.H"
//*************************************************************************************************
//*************************************************************************************************
// Global VARIABLES
//*************************************************************************************************
//*************************************************************************************************
//
#define RS485Enable P1_5 //
#define LED P1_7 //
//-------------------------------------------------------------------------------------------------
#define TemperDevice_A 0xB2 //
#define TemperDevice_B 0xB3 //
#define TemperDevice_C 0xB4 //
#define CommandOver 0xCE //
#define MyAddress TemperDevice_A //
//-------------------------------------------------------------------------------------------------
// Communication
unsigned char ComDatum[6] = {0x00, 0x00, 0x00, 0x00, 0x00, '\0'};
unsigned char ReceiveStep;
bit FlagTemper;
//-------------------------------------------------------------------------------------------------
//
unsigned int TEMPERATURE[3];
unsigned char Count, Filter;
bit TemperOver;
//*************************************************************************************************
//*************************************************************************************************
// Function PROTOTYPES
//*************************************************************************************************
//*************************************************************************************************
//
//=================================================================================================
// Delay Procedure
//=================================================================================================
// 1 us 延时子程序, Fosc =12MHz
void mDelayuS( unsigned int usecond )
{
unsigned char i;
while( usecond-- )
{
for( i=0; i<5; i++ ) {;}
}
}
//-------------------------------------------------------------------------------------------------
// 1 ms 延时子程序, Fosc =12MHz
void mDelaymS( unsigned int msecond )
{
unsigned char i,j;
while( msecond-- )
{
for( j=0; j<5; j++ )
for( i=0; i<125; i++) {;}
}
}
//=================================================================================================
//=================================================================================================
// UART Interrupt Procedure
//=================================================================================================
//=================================================================================================
//
/*
//-------------------------------------------------------------------------------------------------
// UART Send Byte
void UARTSendByte( unsigned char datum )
{
ES = 0;
TI = 0;
SBUF = datum;
while( TI == 0 ) ;
ES = 1;
}
*/
//-------------------------------------------------------------------------------------------------
// UART Send String
void UARTSendString( unsigned char *p )
{
unsigned char i;
ES = 0;
RS485Enable = 1; // Enable Send
LED = 1; // Enable
for( i=0; i<5; i++ )
{
SBUF = *p++;
while ( TI == 0 ) ; // Waiting...
TI = 0;
mDelayuS( 10 );
}
RS485Enable = 0; // Disable Send
LED = 0; // Disable
ES = 1;
}
//=================================================================================================
//
void UART_ISR( void ) interrupt 4
{
unsigned char datum;
RI = 0;
datum = SBUF;
switch( ReceiveStep )
{
// Receive Start!
case 0: if( datum == 0xAA ){ ReceiveStep = 1; FlagTemper = 0; } break;
// MSB
case 1: if( datum == 0x55 ) ReceiveStep = 2; break;
// LSB
case 2: if( datum == MyAddress ) ReceiveStep = 3; break;
// Receive over!
case 3: if( datum == CommandOver ){ ReceiveStep = 0; FlagTemper = 1; } break;
default: ReceiveStep = 0; break;
}
}
//=================================================================================================
//=================================================================================================
// Timer0 Interrupt Procedure
//=================================================================================================
//=================================================================================================
// Fosc = 11.0592MHz
void Timer0_ISR( void ) interrupt 1
{
TH0 = 0x04; TL0 = 0; // 70ms
Count++;
if( Count > 11 ) // 70ms*11 = 770ms
{
Count = 0;
DS18B20Temperature( );
TEMPERATURE[ Filter ] = TEMPER;
Filter++;
if( Filter > 2 ){ Filter = 0; TemperOver = 1; }
}
}
//=================================================================================================
// Control Procedure:
//=================================================================================================
//
void Control( void )
{
unsigned char i, CRC;
unsigned int Temperature, temp;
if( FlagTemper )
{
TR0 = 0; ET0 = 0;
FlagTemper = 0;
DS18B20Temperature( );
TemperOver = 0;
Count = 0; Filter = 0;
TEMPER = 0;
for( i=0; i<3; i++ ) TEMPERATURE[i] = 0;
TH0 = 0x04; TL0 = 0; // 70ms
TR0 = 1; // Start Temperature get
ET0 = 1;
}
if( TemperOver )
{
TemperOver = 0;
ET0 = 0;
TR0 = 0; // Temperature get Over
if( TEMPERATURE[0] > TEMPERATURE[1] ){ temp = TEMPERATURE[0]; TEMPERATURE[0] = TEMPERATURE[1]; TEMPERATURE[1] = temp; }
if( TEMPERATURE[0] > TEMPERATURE[2] ){ temp = TEMPERATURE[0]; TEMPERATURE[0] = TEMPERATURE[2]; TEMPERATURE[2] = temp; }
if( TEMPERATURE[1] > TEMPERATURE[2] ){ temp = TEMPERATURE[1]; TEMPERATURE[1] = TEMPERATURE[2]; TEMPERATURE[2] = temp; }
Temperature = TEMPERATURE[1]*10/16;
ComDatum[0] = MyAddress;
ComDatum[1] = (unsigned char)(Temperature >> 8); // MSB
ComDatum[2] = (unsigned char)Temperature; // LSB
ComDatum[3] = CommandOver;
// CRC
CRC = 0;
for( i=0; i<4; i++ ) CRC += ComDatum[i];
ComDatum[4] = CRC;
ComDatum[5] = '\0';
UARTSendString( ComDatum );
}
}
//=================================================================================================
//=================================================================================================
// Main Procedure
//=================================================================================================
//=================================================================================================
// System initialization
void Initialization( void )
{
mDelaymS( 100 );
// Port configuration
P1M0=0x00;
P1M1=0x80;
P3M0=0x00;
P3M1=0x00;
// Timer Initialization
TMOD = 0x21;
// TH1 = 0xFD; TL1 = 0xFD; // 9600
TH1 = 0xFA; TL1 = 0xFA; // 4800
TH0 = 0x04; TL0 = 0;
// UART Initialization
SCON = 0x50;
PS = 1;
EA = 1; ES = 1; ET0 = 0;
TR1 = 1; TR0 = 1;
// Extern
RS485Enable = 0; // Disable Send
LED = 0; // Disable
ReceiveStep = 0;
Count = 0;
}
//-------------------------------------------------------------------------------------------------
// Main
void main( void )
{
Initialization( );
DS18B20Temperature( );
while( 1 )
{
Control( );
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -