久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 單片機+pt100測溫度Proteus仿真程序 [打印本頁]

作者: henanda    時間: 2020-1-6 23:32
標題: 單片機+pt100測溫度Proteus仿真程序


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

#define ROW1 0x80
#define ROW2 0xC0
#define Ts_CONST 1                //AD采樣時間系數(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)//延時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值轉(zhuǎ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采樣值線性化修正
                                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ù),用于開關(guān)量識別和改變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下載地址:
Pt100.rar (769.19 KB, 下載次數(shù): 213)


作者: youhu123    時間: 2020-4-1 14:53
你好
作者: 51hei電控200522    時間: 2020-6-13 22:06
pt100顯示117,液晶到200多了?
作者: 碼不止    時間: 2020-7-4 10:21
樓主你好,tmp=2.31e-6L*tmp,這里邊的L是什么含義




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 精品一二区| 99reav| 亚洲一区国产 | 久久亚洲欧美日韩精品专区 | 中文字幕亚洲国产 | 日本中文字幕在线视频 | 国产日日操 | av免费在线播放 | 男人阁久久 | 国产激情偷乱视频一区二区三区 | 四虎国产| 超碰在线观看97 | 九色一区| 亚洲一区电影 | www国产成人免费观看视频,深夜成人网 | 日韩在线欧美 | 久久国产精品色av免费观看 | 久草在线在线精品观看 | 成人国产精品久久 | 国产高清视频一区二区 | 天天操操 | 日本三级做a全过程在线观看 | 亚洲欧美成人在线 | 亚洲免费久久久 | 欧美一级毛片久久99精品蜜桃 | 国产成人网 | 欧美一区视频 | 伊人激情综合网 | 国产精品a久久久久 | 日韩和的一区二区 | 1区2区视频 | 亚洲精品一区二区三区在线观看 | 国产精品免费视频一区 | 国产精品久久久久久久久久久久 | 成人精品免费视频 | 久久高清精品 | 人操人免费视频 | 国产91网站在线观看 | 色爱区综合 | 欧美中文在线 | 黄色国产 |