找回密码
 立即注册
查看: 95|回复: 3

NTC测温 变化大 一会22一会23 请教下大佬们 程序如下

[复制链接]
  • TA的每日心情
    开心
    3 天前
  • 签到天数: 71 天

    [LV.6]常住居民II

    5

    主题

    71

    回帖

    248

    积分

    中级会员

    积分
    248
    发表于 2024-3-16 09:00:17 | 显示全部楼层 |阅读模式
    #include <stc15.h>
    #include "intrins.h"

    #include"ntc.h"

    //#define FOSC    11059200UL
    //#define BAUD    115200
    #define ADC_POWER   0x80            //ADC电源控制位
    #define ADC_FLAG    0x10            //ADC完成标志
    #define ADC_START   0x08            //ADC起始控制位
    #define ADC_SPEEDLL 0x00            //540个时钟
    #define ADC_SPEEDL  0x20            //360个时钟
    #define ADC_SPEEDH  0x40            //180个时钟
    #define ADC_SPEEDHH 0x60            //90个时钟
    //#define CLK_DIV     0X97;
    #define  adcbo      0.09       //滤波系数

    //typedef unsigned int u16;          //对数据类型进行声明定义
    //typedef unsigned char u8;
    u16 temp,temp2;
    s16 temp1;
    u8 disp[3];
    u8 xdata SMG[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
    sbit v1=P1^2;
    sbit v2=P1^3;
    sbit v3=P1^4;

    bit busy;
    char wptr;xdata
    char rptr;
    char buffer[16];
    u8 ddy;
    void Beep();
    void UartSend(char dat)
    {
        while (busy);
        busy = 1;
        SBUF = dat;
    }
           

    void Delay1ms()                //@12.000MHz
    {
            unsigned char i, j;

            i = 12;
            j = 169;
            do
            {
                    while (--j);
            } while (--i);
    }

    void UartSendStr(char *p)
    {
        while (*p)
        {
            UartSend(*p++);
        }
    }


    void Delayms(u16 k)               
    {
            while(k)
            {

                    Delay1ms();

                    k--;
            }

    }



    void UartInit(void)                //4800bps@12.000MHz
    {
            SCON = 0x50;                //8位数据,可变波特率
            AUXR |= 0x01;                //串口1选择定时器2为波特率发生器
            AUXR |= 0x04;                //定时器时钟1T模式
            T2L = 0x8F;                        //设置定时初始值
            T2H = 0xFD;                        //设置定时初始值
            AUXR |= 0x10;                //定时器2开始计时
            ES = 1;                //打开串口中断
            EA =1;                //打开总中断
    }

    void UartIsr() interrupt 4
    {
        if (TI)
        {
            TI = 0;
            busy = 0;
        }
        if (RI)
        {
            RI = 0;
            buffer[wptr++] = SBUF;
            wptr &= 0x0f;
        }
    }

    void InitADC()
    {
           
    //    PCON2=0X20;
              CLK_DIV |= 0x20;                //ADC_RES高8位
        P1ASF = 0x02;                   //设置P1.1口为AD口
        ADC_RES = 0;
        ADC_RESL=0;        //清除结果寄存器
        ADC_CONTR = ADC_POWER | ADC_SPEEDLL ;
        Delayms(5);              //ADC上电并延时
    }

    u16 GetADCResult(u8 ch)
    {
            u16 weidu;
            u16 mun=0;
            u8 count=0, n=100;
           
        ADC_CONTR = ADC_POWER | ADC_SPEEDHH  |ch| ADC_START;
        _nop_();   
        _nop_();          //等待5个NOP
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        while (!(ADC_CONTR & ADC_FLAG));//等待ADC转换完成
        ADC_CONTR &= ~ADC_FLAG;         //Close ADC

    //        weidu=ADC_RESL;           //返回ADC结果
    //        weidu=weidu<<8;
    //        weidu|=ADC_RES;
           
            weidu=ADC_RES;           //返回ADC结果
            weidu=weidu<<8;
            weidu|=ADC_RESL;
            for(count=0;count<n;count++)    //求100次的平均值
            {
                    mun+=weidu;
            }



            return (mun/n);
    //        return weidu;
    }

    u16 adcc(u16 k)                          //k为ADC数值  返回adata为经过一阶低涌滤波后数值
    {
            static ndata;                       //上一次的计算值
        u16 adata;                          //本次的计算值
              adata=(k*adcbo)+(1-adcbo)*ndata;   //计算
              ndata=adata;                       // 存下本次值
        return adata;                     //返回数据

    }
    void SMG_DigDisplay()

    {
            u8 i;
            for(i=0;i<3;i++)//位选,选择点亮的数码管
            {
                    switch(i)
                    {
                            case (0):v1=1;v2=0;v3=0;break;//显示最高位
                            case (1):v1=0;v2=1;v3=0;break;
                            case (2):v1=0;v2=0;v3=1;break;


                    }


                    P3=disp[i];
                    Delayms(2);  
    //                P3=0xff;

            }



    }  
    void Smgxx()
    {
            static s16 vis=0;
    //        static u16 vis1=0;
            u8 con=0;
    //        temp=GetADCResult(1);
    //        if(vis1!=temp)
    //        {
    //               
    //           vis1=temp;
    //       
    //       
            temp=GetADCResult(1);
            temp2=adcc(temp);
            temp1=Temperature(temp2);
                 
            if(vis!=temp1)
            {  
              
                    vis=temp1;
           
                    if(temp1<0)
                    {
                            disp[0] =0xbf ;                //-
                            temp1 *=-1;
                    }
                    else
                    {
                            disp[0] = 0xc0;        //不显示
                    }

                   
                    disp[1] = SMG[temp1 /10%10];
                    disp[2] = SMG[temp1 %10];


           
                    }
    //        }

    }

    void main()
    {

            P3M0 = 0x00; P3M1 = 0x00;

    //        P1M0 = 0x1c; P1M1 = 0x02;
        P1M0 = 0x00; P1M1 = 0x02;


        InitADC();                               //初始化ADC
    //    IE = 0xa0;                      //使能ADC中断
    //    UartInit();
           
              Delayms(1000);                 //延时开机
        while(1)
                   
            {
           


              

    //                UartSend(temp);
    ////                UartSend(temp);
    //                Delayms(1000);
                   
    //                disp[0] = SMG[1];
    //                disp[1] = SMG[2];
    //                disp[2] = SMG[3];       

                Smgxx();
                   
                    SMG_DigDisplay();
                   
           
                   
                

           
            }


    }


    回复 送花

    使用道具 举报

    该用户从未签到

    551

    主题

    9299

    回帖

    1万

    积分

    管理员

    积分
    14049
    发表于 2024-3-16 09:40:20 | 显示全部楼层
    参考下我们 STC8H 实验箱的参考程序
    深圳国芯人工智能有限公司-实验箱 (stcai.com)
    截图202403160940186098.jpg

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-24 09:28
  • 签到天数: 90 天

    [LV.6]常住居民II

    68

    主题

    569

    回帖

    1854

    积分

    超级版主

    积分
    1854
    QQ
    发表于 2024-3-16 10:16:41 | 显示全部楼层
    要是温度显示不稳定  你来打我
    截图202403161016165197.jpg
    热线19952583534
    www.STCAI.com
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 71 天

    [LV.6]常住居民II

    5

    主题

    71

    回帖

    248

    积分

    中级会员

    积分
    248
     楼主| 发表于 2024-3-16 12:00:17 | 显示全部楼层
    谢谢  我去看看
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-3 13:39 , Processed in 0.059289 second(s), 44 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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