找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5359|回复: 3
打印 上一主题 下一主题
收起左侧

单片机+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采样时间系数,采样时间为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下载地址:
Pt100.rar (769.19 KB, 下载次数: 203)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏7 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:720208 发表于 2020-4-1 14:53 | 只看该作者
你好
回复

使用道具 举报

板凳
ID:304785 发表于 2020-6-13 22:06 | 只看该作者
pt100显示117,液晶到200多了?
回复

使用道具 举报

地板
ID:773058 发表于 2020-7-4 10:21 | 只看该作者
楼主你好,tmp=2.31e-6L*tmp,这里边的L是什么含义
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表