打印
[51单片机]

请问一下这是个热敏电阻3950的测温单片机里程序

[复制链接]
2279|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
这是个热敏电阻3950的测温单片机里程序,不过有几个地方不太明白,还望请教。第一个code        uint VOL[]和code        uint Temper[]中的数据是怎么计算查表得到的。第二个问题         result=(uint)((res/2048.0-1.0)*500.0);
                 
                 temp1=abs(result-VOL[0]);
                 for(i=1;i<150;i++)
                 {
                         temp2=abs(result-VOL[i]);
                        if(temp1>=temp2)
                        {
                                temp1=temp2;
                                flag=i;
                        }
                               
                 }这一部分,我最不明白,还有那个公式是什么意思?
请看程序:#include <reg52.h>          
#include <intrins.h>
#include <math.h>

typedef unsigned char uchar;
typedef unsigned int  uint;
code        uint VOL[]={                343,        339,        339,        335,        332,        332,        328,        324,        320,        320,       
                                                        316,        312,        312,        308,        304,        300,        300,        296,        292,        292,
                                                        289,        285,        285,        281,        277,        273,        273,        269,        265,        265,       
                                                        261,        257,        257,        253,        250,        250,        246,        242,        242,        238,
                                                        234,        234,        230,        230,        226,        222,        222,        218,        218,        214,       
                                                        210,        210,        207,        207,        203,        199,        199,        195,        195,        191,
                                                        191,        187,        187,        183,        179,        179,        175,        175,        171,        171,       
                                                        167,        167,        164,        164,        160,        160,        160,        156,        156,        152,
                                                        152,        148,        148,        144,        144,        140,        140,        140,        136,        136,       
                                                        132,        132,        132,        128,        128,        125,        125,        125,        121,        121,
                                                        121,        117,        113,        109,        109,        105,        101,        101,        97,                97,
                                                        93,                89,                89,                85,                85,                82,                82,                78,                78,                74,       
                                                        74,                70,                70,                66,                66,                66,                62,                62,                58,                58,       
                                                        58,                54,                54,                54,                50,                50,                50,                46,                46,                46,       
                                                        42,                42,                42,                42,                39,                39,                39,                39,                35,                35};

code        uint Temper[]={                100,        150,        200,        250,        300,        350,        400,        450,        500,        550,       
                                                        600,        650,        700,        750,        800,        850,        900,        950,        1000,        1050,
                                                        1100,        1150,        1200,        1250,        1300,        1350,        1400,        1450,        1500,        1550       
                                                        1600,        1650,        1700,        1750,        1800,        1850,        1900,        1950,        2000,        2050,
                                                        2100,        2150,        2200,        2250,        2300,        2350,        2400,        2450,        2500,        2550,       
                                                        2600,        2650,        2700,        2750,        2800,        2850,        2900,        2950,        3000,        3050,
                                                        3100,        3150,        3200,        3250,        3300,        3350,        3400,        3450,        3500,        3550,       
                                                        3600,        3650,        3700,        3750,        3800,        3850,        3900,        3950,        4000,        4050,
                                                        4100,        4150,        4200,        4250,        4300,        4350,        4400,        4450,        4500,        4550,       
                                                        4600,        4650,        4700,        4750,        4800,        4850,        4900,        4950,        5000,        5050,
                                                        5100,        5200,        5300,        5400,        5500,        5600,        5700,        5800,        5900,        6000,
                                                        6100,        6200,        6300,        6400,        6500,        6600,        6700,        6800,        6900,        7000,       
                                                        7100,        7200,        7300,        7400,        7500,        7600,        7700,        7800,        7900,        8000,       
                                                        8100,        8200,        8300,        8400,        8500,        8600,        8700,        8800,        8900,        9000,       
                                                        9100,        9200,        9300,        9400,        9500,        9600,        9700,        9800,        9900,        10000};
sbit STS=P1^0;                          
sbit CE = P1^1;
sbit CS=P1^2;
sbit A0=P1^3;
sbit RC=P1^4;

sbit RS=P1^5 ;
sbit RW=P1^6 ;
sbit EN=P1^7 ;           

void delay_ms(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
uint AD1674_Read(void)
{
        uint temp;
        uchar temp1,temp2;
        CS=1;        //片选信号
        CE=0;        //初始化,关闭数据采集
        CS=0;
        A0=0;
        RC=0;
        CE=1;//CE=1,CS=0,RC=0,A0=0启动12位温度转换
        _nop_();
        while(STS==1);         //等待数据采集结束
        CE=0;         //芯片使能关闭
        RC=1;
        A0=0;
        CE=1;//CE=1,CS=0,RC=1,12/8=1,A0=0 允许高八位数据并行输出
        _nop_();
        temp1=P0; //读取转换结果的高八位
        CE=0;  //芯片使能关闭
        RC=1;
        A0=1;
        CE=1;//CE=1,CS=0,RC=1,12/8=0,A0=1 允许低四位数据 并行输出
        _nop_();
        temp2=P0;         //读取转换结果的第四位
        temp=((temp1<<4)|(temp2&0X0F));          //高位和低位合成实际温度,temp2为PO口的高四位
        return (temp);           //还回转换结果,右移四位是因为temp2为P0口的高四位
}
/*** 写数据***/
void w_dat(unsigned char dat)
{
        RS = 1;
        //EN = 0;
        P2 = dat;
        delay_ms(5);
        RW = 0;
        EN = 1;
        EN = 0;
}
/*** 写命令***/
void w_cmd(unsigned char cmd)
{
        RS = 0;
//        EN = 0;
        P2 = cmd;
        delay_ms(5);
        RW = 0;
        EN = 1;
        EN = 0;
}                       
/*** 发送字符串到LCD***/
void w_string(unsigned char addr_start, unsigned char *p)
{
        unsigned char *pp;
       
        pp = p;
        w_cmd(addr_start);
        while (*pp != '\0')
        {
                w_dat(*pp++);
        }
}          

/*** 初始化1602****/
void Init_LCD1602(void)
{
        EN = 0;
        w_cmd(0x38);  // 16*2显示,5*7点阵,8位数据接口
        w_cmd(0x0C);  // 显示器开、光标开、光标允许闪烁
        w_cmd(0x06);  // 文字不动,光标自动右移
        w_cmd(0x01);  // 清屏
}
void process(uint date,uchar add)
{
        uchar A[7];
        A[0]=date/1000%10+'0';
        A[1]=date/100%10+'0';
        A[2]='.';       
        A[3]=date/10%10+'0';
        A[4]=date%10+'0';
        A[5]='C';                        
        w_string(add,A);
}          
void main()
{

        uchar i,flag=0;
        uint result,temp1,temp2;
        float        res;

        Init_LCD1602();
         
        w_string(0x80,"Temper:");
       
        while (1)
        {
                 res=(float)(AD1674_Read());
                 result=(uint)((res/2048.0-1.0)*500.0);
                 
                 temp1=abs(result-VOL[0]);
                 for(i=1;i<150;i++)
                 {
                         temp2=abs(result-VOL[i]);
                        if(temp1>=temp2)
                        {
                                temp1=temp2;
                                flag=i;
                        }
                               
                 }
       
                 process(Temper[flag],0x80+7);
        }
}

相关帖子

沙发
shalixli| | 2016-10-29 13:17 | 只看该作者
其实 用算法计算,这个3950 是很容易计算到的。比查表跟方便

使用特权

评论回复
板凳
baoren| | 2016-12-14 13:22 | 只看该作者
算法不容易搞出来

使用特权

评论回复
地板
ayb_ice| | 2016-12-14 13:30 | 只看该作者
电压与温度一对应,温度对应电阻,电阻对应电压,反过来知道电压,就能计算出电阻,通过电阻就知道温度,具体数值取决于硬件设计

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

24

帖子

2

粉丝