资源描述
#include <C8051F410.h>
#include <math.h>
#define WORD unsigned int
#define BYTE unsigned char
#define AD_LU 15
//********************************************//
WORD idata AD;
float idata DIANYA,R,T_;
BYTE code BCD_tab[] = {0x01,0x4f,0x12,0x06,0x4c,0x24,0x20,0x0f,0x00,0x04};
BYTE code WM_tab[] = {0xFB,0xFD,0xFE};
BYTE idata BCD_ZH[3];
BYTE idata tt=0;
BYTE idata t=0;
WORD idata XIANSHI_JISHU=0;
//*********************************************
sfr DM = 0xA0;
sfr WM = 0x80;
//**********************************************
bit XIANSHI_BIT = 0;
bit FUHAO_BIT = 0;
bit XIANSHI_BIT_=1;
//********************************************
void CONFIG(){
//看门狗禁止,以方便调试
PCA0MD = 0x00; //看门狗禁止
REG0CN = 0x10; //内部LDO使能
PFE0CN = 0x20; //预取指令允许位置'1'
//---------------------------------------
//交叉开关配置
XBR0 = 0x00;
XBR1 = 0x40;
P1MDIN = 0x7f;
P1MDOUT = 0;
//---------------------------------------
//系统时钟配置,采用内部晶振
CLKSEL = 0x00;//时钟乘法器
OSCICN = 0x87;//振荡器使能不分频
//----------------------------------------
//T2初始化
//T2工作于自动重装载定时方式,定时时间ms,PID运算时间最短为ms
TMR2CN = 0x04;//开定时器
TMR2RLH = 0xe0;//定时器重装载高字节
TMR2RLL = 0x18;//低字节
TMR2H = 0xe0;//定时器高字节
TMR2L = 0x18;//低字节
IE |= 0x20;//允许TF2L或TF2H标志中断请求
//-------------------------------------
//VREF初始化
REF0CN = 0x13;//基准电压.2v
//--------------------------------------
//ADC0初始化
ADC0CN = 0x80;//ASC0处于使能状态,可以进行转换数据
ADC0CF = 0xf0;
//--------------------------------------
EA = 1;//开启全局中断
}//*************************************************************************
void T2_INT()interrupt 5
{
//PID采样时间,最小间隔ms
TMR2CN &= 0x7f;//清除TF2中断标志
XIANSHI_BIT = 1;
if(tt<2){tt++;}
else{tt=0;}
WM = 255;
DM = BCD_tab[BCD_ZH[tt]];
WM = WM_tab[tt];
XIANSHI_JISHU++;
if(XIANSHI_JISHU<100){
XIANSHI_JISHU++;
}
else
{
XIANSHI_JISHU = 0;
XIANSHI_BIT_ = 1;
}
}
//AD转换函数
//**************************************************************************
WORD ADC0(){
BYTE x;
WORD y;
ADC0MX = AD_LU;
ADC0CN |=0x10;
x = ADC0CN&0x20;
while(x==0){
x = ADC0CN&0x20;
}
ADC0CN = ADC0CN&0xdf;
y = 256*ADC0H+ADC0L;
return y;
}
//转换函数
//*************************************************************
void BCD_ZHUANHUAN(int x){
if(x<0){
x = -x;
FUHAO_BIT = 1;
}
else{
FUHAO_BIT = 0;
}
BCD_ZH[0] = x%10;
BCD_ZH[1] = x/10%10;
BCD_ZH[2] = x/100;
}
//*****************************************************************
float U_JISUAN(WORD x){
return (2.200*(float)(x)/4095);
}
float R_JISUAN(float x){
return 3600.0*x/(2.58-x);
}
float T_JISUAN(float x)
{
float T;
T = (1/(log(x/10000)/2800+1/298.15));
return T;
}
//*****************************************************************
//主函数
void mian(){
CONFIG();
while(1){
AD = ADC0();
DIANYA =U_JISUAN(AD);
R=R_JISUAN(DIANYA);
T_=T_JISUAN(R)-273.15;
if(XIANSHI_BIT_==1){
BCD_ZHUANHUAN(T_*10);
XIANSHI_BIT_=0;
}
}
}
展开阅读全文