找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 6899|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)+pt100測(cè)溫度Proteus仿真程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主


#include <reg52.h>
#include <string.h>
#include <math.h>
#include "intrins.h"

#define ROW1 0x80
#define ROW2 0xC0
#define Ts_CONST 1                //AD采樣時(shí)間系數(shù),采樣時(shí)間為0.1xTs_CONST(s)

#define NOACT 0
#define FC 1
#define Start_AD 2
#define Cal_Temperature 3

#define Kpt 0.02732644         //AD芯片max1240的采樣值到溫度值的轉(zhuǎn)化系數(shù)


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)//延時(shí)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;                //開(kāi)始程序前先延時(shí)65ms,等待max1240上電,以保證AD采樣準(zhǔn)確
                                
        TH0=0;
        TL0=0;
        TR0=1;
        while(!TF0);
        TF0=0;
        TR0=0;

        TH0=0x3C;                //12M晶振時(shí)延時(shí)50ms
        TL0=0xB0;
        ET0=1;
        TR0=1;

        EX1=1;
        IT1=1;

        EA=1;

        while(1)
                switch(RunState)
                {        case NOACT:
                                break;
                        case FC:        //F0計(jì)算及顯示
                                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:                          //開(kāi)始AD采樣

                                AD_Reslut=AD_MAX1240();

                                RunState=Cal_Temperature;
                                break;
                        case Cal_Temperature:                                     //將AD值轉(zhuǎn)化為溫度并進(jìn)行線(xiàn)性化
                        {
                                
                                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采樣值線(xiàn)性化修正
                                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); //顯示函數(shù)
                          }
        
                                RunState=NOACT;
                                break;
                }
}
/*******************************************************************************/
unsigned int AD_MAX1240(void)        //讀取AD,AD芯片為串口數(shù)據(jù)形式
{        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,F(xiàn)0,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                          //切換采樣時(shí)間的中斷函數(shù),用于開(kāi)關(guān)量識(shí)別和改變Ts(采樣時(shí)間)
{        
        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         //定時(shí)中斷程序
{        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到時(shí)進(jìn)行F0值運(yùn)算


        }
}
/*******************************************************************************/
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下載地址:
Pt100.rar (769.19 KB, 下載次數(shù): 213)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏8 分享淘帖 頂2 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:720208 發(fā)表于 2020-4-1 14:53 | 只看該作者
你好
回復(fù)

使用道具 舉報(bào)

板凳
ID:304785 發(fā)表于 2020-6-13 22:06 | 只看該作者
pt100顯示117,液晶到200多了?
回復(fù)

使用道具 舉報(bào)

地板
ID:773058 發(fā)表于 2020-7-4 10:21 | 只看該作者
樓主你好,tmp=2.31e-6L*tmp,這里邊的L是什么含義
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表