ulvtkb126 发表于 2024-3-16 09:00:17

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

#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_SPEEDL0x20            //360个时钟
#define ADC_SPEEDH0x40            //180个时钟
#define ADC_SPEEDHH 0x60            //90个时钟
//#define CLK_DIV   0X97;
#defineadcbo      0.09       //滤波系数

//typedef unsigned int u16;          //对数据类型进行声明定义
//typedef unsigned char u8;
u16 temp,temp2;
s16 temp1;
u8 disp;
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;
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 = 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;
                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 =0xbf ;                //-
                        temp1 *=-1;
                }
                else
                {
                        disp = 0xc0;        //不显示
                }

               
                disp = SMG;
                disp = SMG;


       
                }
//        }

}

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 = SMG;
//                disp = SMG;
//                disp = SMG;       

          Smgxx();
               
                SMG_DigDisplay();
               
       
               
          

       
        }


}


神农鼎 发表于 2024-3-16 09:40:20

参考下我们 STC8H 实验箱的参考程序
深圳国芯人工智能有限公司-实验箱 (stcai.com)


国学芯用 发表于 2024-3-16 10:16:41

要是温度显示不稳定你来打我

ulvtkb126 发表于 2024-3-16 12:00:17

谢谢我去看看
页: [1]
查看完整版本: NTC测温 变化大 一会22一会23 请教下大佬们 程序如下