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

📄 ai.c

📁 c8051f040 内部集成的温度传感器使用 直接给出温度的函数
💻 C
字号:
/*************************************************************************/
/*                                                                       */
/*        Copyright (c) 2006 CNRERD.                                     */
/*                                                                       */
/* PROPRIETARY RIGHTS of CNRERD are involved in the subject matter of    */
/* this material. All manufacturing, reproduction, use, and sales rights */
/*  pertaining to this subject matter are governed                       */
/* by the license agreement.  The recipient of this software implicitly  */
/* accepts the terms of the license.                                     */
/*                                                                       */
/*************************************************************************/

/*************************************************************************/
/*                                                                       */
/* FILE NAME                                            VERSION          */
/*                                                                       */
/*      main.c                                             1.0           */
/*                                                                       */
/* COMPONENT                                                             */
/*                                                                       */
/*      C8051F040                                                        */
/*                                                                       */
/* AUTHOR                                                                */
/*                                                                       */
/*      Wang ZhongFu                                                     */
/*                                                                       */
/*                                                                       */
/* DEPENDENCIES                                                          */
/*                                                                       */
/*      datatype.h                                                      */
/*                                                                       */
/* HISTORY                                                               */
/*                                                                       */
/*         DATE                    REMARKS                 author        */
/*      10-21-2008         Created initial version 1.0     Wangzhongfu   */
/*                                                                       */
/*************************************************************************/
#include "datatype.h"
#include "C8051F040.h"  /*Register/bit definitions for the C8051F040*/
#include <string.h>
/***************************************************/
/* define T0 macro functions           */
/***************************************************/
#define T0RUN SFRPAGE=0x00;TR0=1
#define T0STOP SFRPAGE=0x00;TR0=0
#define ADC0START SFRPAGE=0x00;AD0BUSY=1

/***************************************************/
/* define Analog  data             */
/***************************************************/
//#define STACK_LEN 128/*sample data length*/
#define AlarmTemprature_LowLine  18.0
#define AlarmTemprature_HighLine 20.0


//xdata 	uchar stack_index=0;     /*index of sample data*/
//xdata 	uchar dataindex=0;       /*index of sample adding*/
//xdata 	ulong total;             /*tatol for sample data*/
//uchar 	ti=0;                    /*temprature adding count*/
float 	tempvalue;              /*temp value of temprature*/
float   Sample_TempratureValue=0;
//float xdata  	temp16[20];    /*ADC0 16bit data*/ 
xdata 	uint SampleValue;   /*array for sample data*/
float   Start_temprature=0;
float   Sub_temprature=0;
float   Enviroment_temprature=0;
float   Enviroment_History_temprature=0;

sbit RelayOut_ControlFan=P0^0;   
sbit OutTest=P1^6;  


uchar	temppage1;
uint    Time_1_Minute_Switch=0;
uint    Time_3_Minute_Switch=0;
uchar   Temprature_Measure_Switch=0;
uchar	Relay_Run_Stop_Switch=0;
uchar   OutControl_Switch=1;
/************************************/
/* delay 1ms function               */
/************************************/
void delay1ms(uint time){
	uint i;
	uint j;
	for (i=0;i<time;i++){
		for(j=0;j<300;j++);
	}
}

/************************************/
/* c8051f040 initialization function */
/************************************/
void config(){
//看门狗禁止
	WDTCN = 0x07;	
    WDTCN = 0xDE;   
   	WDTCN = 0xAD;
//交叉开关使能,但没有进行外围设备配置
	SFRPAGE = 0x0F;
	XBR0 = 0x00;	
	XBR1 = 0x00;	
	XBR2 = 0x40;
 	XBR3 = 0x00; 
 	
//管脚输出配置,P4口、P5口、P6、P7、P2.0及P2.1为推挽模式,均为为数字输入口
//P3.0-P3.3为开漏模式,P3.0-P3.3为数字输入口

 	//SFRPAGE = 0x0F;
	P1MDOUT = 0x40;
 	P0MDOUT = 0x01; 

//晶振配置,采用外部晶振22.1184MHz
  	//SFRPAGE = 0x0F;
	OSCICN |= 0x80;	
  	//OSCXCN |= 0x67;					   //Running at 22.1184MHz.	
  	//while (!((OSCXCN & 0x80) == 0x80));
  	CLKSEL |= 0x00;
 	 
}

/************************************/
/* T0 initialization function      */
/************************************/
void t0ini(void){  		//设置T0为16位定时器模式
	SFRPAGE=0x00;
	TMOD  = 0x01;
    TCON  = 0x00;
	CKCON = 0x02;           //T0时钟为系统时钟48分频,即24.5MHZ/48/8
	TH0   = 62346/256;
	TL0   = 62346%256;      //计算T0初值:每隔50msT0产生一次中断,则计数值为
                    		//50ms/(48*8/24.5MHZ)=3190,因此计数初值为
				//65536-3190=62346
	ET0   =  1; 		//开启T0中断6
}


void adc0_source(uchar source){//ADC0通道选择,为adc0_mux()的简化函数
	SFRPAGE=0x00;
	AMX0SL=source;
}


/************************************************/
/* ADC0 initialization function       */
/************************************************/
void adc0_ini(){
	SFRPAGE=0x00;
	ADC0CF=0x81;//ADC0 clock is 17 divisions of system clock,PGA=1
	ADC0CN=0x80;
	/*AD0EN=1,ADC0 module enable
	AD0TM=0,ADC0 continous track model
	AD0CM1:AD0CM0=00b,ADC0BUSY start model
	AD0LJST=0*/
	REF0CN&=0x0E;//AD0VRS=0,ADC0 reference voltage is VREFA
	REF0CN|=0x07;//TEMPE=1,enable inner temprature sensor
	//p3anolog_ini(3);
	//adc0_mux(0x0C,0);
	//EIE2 |= 0x02;        //start ADC0 interrupt
}

/*************************************************************************/
/*                                                                       */
/* FUNCTION                                                              */
/*                                                                       */
/*      Temp_measure                                                     */
/*                                                                       */
/* DESCRIPTION                                                           */
/*                                                                       */
/*       Temprature measure function                                     */
/*                                                                       */
/* AUTHOR                                                                */
/*                                                                       */
/*      Wang ZhongFu                                                     */
/*                                                                       */
/* CALLED BY                                                             */
/*                                                                       */
/*      Application                                                      */
/*                                                                       */
/* CALLS                                                                 */
/*                                                                       */
/*      none                                                             */
/*                                                                       */
/* INPUTS                                                                */
/*                                                                       */
/*      none                                                             */
/*                                                                       */
/* OUTPUTS                                                               */
/*                                                                       */
/*      none                                                             */
/*                                                                       */
/* HISTORY                                                               */
/*                                                                       */
/*        DATE                    REMARKS                                */
/*      10-30-2006            Created initial version 1.0                */
/*************************************************************************/
void Temp_measure(){
	adc0_source(9);                 //ADC0 channel select
	//while(stack_index<STACK_LEN){
	ADC0START;                  //ADC0 start 
  	while (~AD0INT);
	AD0INT=0;
		//isnewdata=1;

	SampleValue=ADC0DATA;
		//kk=ADC0H*256;
		//kk+=ADC0L;
		//stack_index++;
		//ADC0START;
	//}
	//stack_index=0;
	//for(ti=0,total=0L;ti<STACK_LEN;ti++)
		//total+=mystack[ti];
	//total/=8L;
	tempvalue=(float)SampleValue/4096;
	tempvalue*=2.43;
	tempvalue/=2L;
	tempvalue-=0.776;
	tempvalue/=0.00286;//transform measure data to real temprature  
	Sample_TempratureValue=tempvalue;
		//isnewdata=0;
	//temp16[dataindex]=tempvalue;//put temprature into 20 arraies
	//dataindex++;
	//if(dataindex>19)
		//dataindex=0;
}
void main(){
	//memset(&mystack,0x00,sizeof(mystack));	
	EA = 0;
	//SFRPAGE=0x00;
	//rst=RSTSRC;
	config();
	RelayOut_ControlFan=0;
	OutTest=0;
  	t0ini();
	adc0_ini();//ADC0 initialization
	EA = 1;
	T0RUN;
	delay1ms(10);
	SFRPAGE=0x0f;
	Temp_measure();//discard  first  samplevalue
	Temp_measure();//environment temprature
	Start_temprature=Sample_TempratureValue;
	while(1){
		if(Time_1_Minute_Switch>10){
			Time_1_Minute_Switch=0;
			Temp_measure();//environment temprature
			Sub_temprature=Sample_TempratureValue-Start_temprature;
			Enviroment_History_temprature=Sample_TempratureValue;
			Temprature_Measure_Switch=1;
			if(Enviroment_History_temprature>=AlarmTemprature_HighLine){
			   OutControl_Switch=0;
			}
			else{
			   OutControl_Switch=1;
			}
		}
		if(Time_3_Minute_Switch>3){
			Time_3_Minute_Switch=0;
			Relay_Run_Stop_Switch=0;
		}
		if(Temprature_Measure_Switch){
			Temp_measure();//environment temprature
		
			Enviroment_temprature=0.8*Enviroment_History_temprature+0.2*(Sample_TempratureValue-Sub_temprature);
			Enviroment_History_temprature=Enviroment_temprature;
			if((Enviroment_temprature>AlarmTemprature_HighLine)&&(Relay_Run_Stop_Switch==0)&&(OutControl_Switch!=1)){
				RelayOut_ControlFan=1;
				OutTest=1;
				Relay_Run_Stop_Switch=1;
				OutControl_Switch=1;
	
			}
			if((Enviroment_temprature<AlarmTemprature_LowLine)&&(Relay_Run_Stop_Switch==0)&&(OutControl_Switch!=0)){
				RelayOut_ControlFan=0;
				OutTest=0;
				Relay_Run_Stop_Switch=1;
				OutControl_Switch=0;

			}
		}
		
	
	}
}


/************************************/
/* T0 interrupt function       */
/************************************/
void T0int1() interrupt 1{
	
	//static	uchar 	AccuCounter=0;
	 
	temppage1=SFRPAGE;
	SFRPAGE=0x00;
	TR0   = 0;
	TH0   = 62346/256;
	TL0   = 62346%256;
	TR0   = 1;
	SFRPAGE=0x0f;
	//OutTest=~OutTest;
	if(!Temprature_Measure_Switch){
		Time_1_Minute_Switch++;
	}
	if(Relay_Run_Stop_Switch){
		Time_3_Minute_Switch++;
	}
	
	//ProgramLED=~ProgramLED;
	//CANLED=~CANLED;
	//WDTCN=0xA5;
	SFRPAGE=temppage1;
	
}

⌨️ 快捷键说明

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