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

📄 main.c

📁 基于STC单片机的发酵塔温控装置的控制代码.
💻 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 + -