📄 ai.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 + -