51hei截圖20200106232140.png (25.59 KB, 下載次數: 87)
下載附件
2020-1-6 23:30 上傳
#include <reg52.h>
#include <string.h>
#include <math.h>
#include "intrins.h"
#define ROW1 0x80
#define ROW2 0xC0
#define Ts_CONST 1 //AD采樣時間系數,采樣時間為0.1xTs_CONST(s)
#define NOACT 0
#define FC 1
#define Start_AD 2
#define Cal_Temperature 3
#define Kpt 0.02732644 //AD芯片max1240的采樣值到溫度值的轉化系數
void LCD_Init(void);
void ClearDisp(unsigned char Row);
void Display(unsigned char Addr, unsigned char *pstr);
void DecToASC(unsigned int Dec,unsigned char *p, unsigned char n);
void Disp_Initize(void);
void Write_CMD(unsigned char CMD);
unsigned int AD_MAX1240(void);
sbit RS=P2^2;
sbit RW=P2^1;
sbit E=P2^0;
sbit SDA=P1^5;
sbit SCL=P1^6;
sbit CS=P1^7;
sbit Key=P3^5;
sbit up=P3^6;
sbit down=P3^7;
unsigned char DispBuf[16];
unsigned char RunState=NOACT;
unsigned int AD_Reslut,tsflag,ts=1;
float fz,tmp,tmp1,Pt;
void delay(unsigned int j)//延時jms
{
unsigned int m,n;
for(n=0;n<j;n++)
{
for(m=0;m<120;m++);
}
}
void main(void)
{ LCD_Init();
ClearDisp(ROW1);
Disp_Initize();
CS=1;
SDA=1;
SCL=0;
TMOD=0x11;
TF0=0; //開始程序前先延時65ms,等待max1240上電,以保證AD采樣準確
TH0=0;
TL0=0;
TR0=1;
while(!TF0);
TF0=0;
TR0=0;
TH0=0x3C; //12M晶振時延時50ms
TL0=0xB0;
ET0=1;
TR0=1;
EX1=1;
IT1=1;
EA=1;
while(1)
switch(RunState)
{ case NOACT:
break;
case FC: //F0計算及顯示
fz=pow(10,(tmp-121.0000)/10);
DecToASC(fz,DispBuf,1);
DispBuf[1]='.';
DecToASC((fz-(unsigned int)fz)*1000,DispBuf+2,3);
DispBuf[5]='\0';
Display(0x80+11,DispBuf);
RunState=NOACT;
break;
case Start_AD: //開始AD采樣
AD_Reslut=AD_MAX1240();
RunState=Cal_Temperature;
break;
case Cal_Temperature: //將AD值轉化為溫度并進行線性化
{
Pt=AD_Reslut*Kpt;
Pt+=100; //溫度值
tmp=Pt/100;
tmp=1-tmp;
tmp=2.31e-6L*tmp;
tmp+=1.527480889e-5L;
tmp=sqrt(tmp);
tmp+=-3.9083e-3L;
tmp/=-1.155e-6L;//AD采樣值線性化修正
tmp1=tmp;
tmp=(tmp+tmp1)/2;//取平均溫度
tmp=((float)((unsigned int)(tmp*10)))/10 ;
DecToASC(tmp,DispBuf,3);
DispBuf[3]='.';
DecToASC((tmp-(unsigned int)tmp)*10,DispBuf+4,1);
DispBuf[5]='\0';
Display(0xC0+2,DispBuf); //顯示函數
}
RunState=NOACT;
break;
}
}
/*******************************************************************************/
unsigned int AD_MAX1240(void) //讀取AD,AD芯片為串口數據形式
{ unsigned int adtmp=0;
unsigned char i;
CS=0;
while(!SDA);
SCL=1;
adtmp<<=1;
SCL=0;
for(i=0;i<12;i++)
{ SCL=1;
adtmp<<=1;
if(SDA==1)adtmp++;
SCL=0;
}
CS=1;
return adtmp;
}
/*******************************************************************************/
void Disp_Initize(void) //LCD初始化,將Ts,F0,t等提示字符顯示在屏幕上
{ //unsigned char *p;
DispBuf[0]='T';
DispBuf[1]='s';
DispBuf[2]='=';
DecToASC(ts,DispBuf+3,2);
DispBuf[5]='s';
DispBuf[8]='f' ;
DispBuf[9]='0' ;
DispBuf[10]='=' ;
DispBuf[16]='\0';
Display(0x80,DispBuf);
DispBuf[0]='t';
DispBuf[1]='=';
DispBuf[2]='\0';
Display(0xc0,DispBuf);
}
/*******************************************************************************/
void INT1_ISR(void) interrupt 2 //切換采樣時間的中斷函數,用于開關量識別和改變Ts(采樣時間)
{
EA=0;
TR0=0;
ET0=0;
strcpy(DispBuf," ");
Display(0x80+11,DispBuf);
while(1)
{
if(up==0)
{
delay(100);
if(up==0)
ts++;
}
if(down==0)
{ delay(100);
if(down==0)
ts--;
}
if(ts>60)
ts=1;
if(ts<=0)
ts=60;
DecToASC(ts,DispBuf,2);
DispBuf[2]='s';
DispBuf[3]='\0';
Display(0x80+3,DispBuf);
if(Key==0)
break;
}
EA=1;
TR0=1;
ET0=1;
}
/*******************************************************************************/
void T0_ISR(void) interrupt 1 //定時中斷程序
{ static unsigned char T0_CNT=Ts_CONST;
//static bit Flag=0;
TH0=0x3C;
TL0=0xB0;
//Flag=!Flag;
//if(Flag)return;
T0_CNT--;
tsflag++;
if(!T0_CNT)
{ T0_CNT=Ts_CONST;
RunState=Start_AD; //AD采樣
}
if(tsflag>=ts*20)
{
tsflag=0;
RunState =FC; //Ts到時進行F0值運算
}
}
/*******************************************************************************/
void DecToASC(unsigned int Dec,unsigned char *p, unsigned char n) //將Dec變量編程可以在1602上直接顯示的ASICII值
{ unsigned char i;
p+=n;
p--;
for(i=0;i<n;i++)
{ *p=Dec%10+0x30;
p--;
Dec/=10;
}
}
/*LCD顯示*******************************************************************************/
void Check_Busy(void)
{// return;
do
{ P0=0xFF;
E=0;
RS=0;
RW=1;
E=1;
_nop_();
}while(P0&0x80);
E=0;
}
/*******************************************************************************/
void Write_CMD(unsigned char CMD)
{
Check_Busy();
E=0;
RS=0;
RW=0;
P0=CMD;
E=1;
_nop_();
E=0;
}
/*******************************************************************************/
void Write_Data(unsigned char Data)
{
Check_Busy();
E=0;
RS=1;
RW=0;
P0=Data;
E=1;
_nop_();
E=0;
}
/*******************************************************************************/
void LCD_Init(void)
{
Write_CMD(0x38);
Write_CMD(0x0C);
Write_CMD(0x06);
Write_CMD(0x01); //清屏
}
/*******************************************************************************/
void Display(unsigned char Addr, unsigned char *pstr)
{
Write_CMD(Addr);
while(*pstr)
Write_Data(*pstr++);
}
/*******************************************************************************/
void ClearDisp(unsigned char Row)
{
strcpy(DispBuf," ");
Display(Row,DispBuf);
}
51hei.png (7.85 KB, 下載次數: 55)
下載附件
2020-1-7 00:08 上傳
全部資料51hei下載地址:
Pt100.rar
(769.19 KB, 下載次數: 213)
2020-1-6 23:31 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|