找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2836|回复: 6
收起左侧

这个NTC测温的单片机程序有什么问题吗?

[复制链接]
ID:709761 发表于 2021-8-12 08:03 | 显示全部楼层 |阅读模式
#include "STC15.h"
#include "intrins.h"
#include <stdio.h>


#define uchar   unsigned  char
#define uint    unsigned int


#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个时钟




uchar code adwd[101] = {
        0xBD,0xBB,0xB9,0xB6,0xB4,0xB2,0xAF,0xAD,0xAA,0xA8,
        0xA5,0xA3,0xA0,0x9D,0x9B,0x98,0x96,0x93,0x91,0x8E,
        0x8B,0x89,0x86,0x84,0x81,0x7F,0x7C,0x7A,0x77,0x75,
        0x72,0x70,0x6E,0x6B,0x69,0x67,0x65,0x62,0x60,0x5E,
        0x5C,0x5A,0x58,0x56,0x54,0x52,0x50,0x4E,0x4C,0x4B,
        0x49,0x47,0x46,0x44,0x42,0x41,0x3F,0x3E,0x3C,0x3B,
        0x39,0x38,0x37,0x35,0x34,0x33,0x32,0x30,0x2F,0x2E,
        0x2D,0x2C,0x2B,0x2A,0x29,0x28,0x27,0x26,0x25,0x24,
        0x23,0x22,0x22,0x21,0x20,0x1F,0x1F,0x1E,0x1D,0x1D,
        0x1C,0x1B,0x1B,0x1A,0x19,0x19,0x18,0x18,0x17,0x17,
        0x16
};//采样AD 从大到小


uchar code wd[101] = {
        0,1,2,3,4,5,6,7,8,9,

        10,11,12,13,14,15,16,17,18,19,

        20,21,22,23,24,25,26,27,28,29,

        30,31,32,33,34,35,36,37,38,39,

        40,41,42,43,44,45,46,47,48,49,

        50,51,52,53,54,55,56,57,58,59,

        60,61,62,63,64,65,66,67,68,69,

        70,71,72,73,74,75,76,77,78,79,

        80,81,82,83,84,85,86,87,88,89,

        90,91,92,93,94,95,96,97,98,99,

        100
};//AD对应的温度值 从低到高



void UartInit(void)                //115200bps@12.000MHz
{
        SCON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x40;                //定时器时钟1T模式
        AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
        TMOD &= 0x0F;                //设置定时器模式
        TL1 = 0xE6;                //设置定时初始值
        TH1 = 0xFF;                //设置定时初始值
        ET1 = 0;                //禁止定时器%d中断
        TR1 = 1;                //定时器1开始计时
}

/*----------------------------
软件延时
----------------------------*/
void Delay(uint n)
{
    uint x;

    while (n--)
    {
        x = 5000;
        while (x--);
    }
}


/*发送一个字节*/
void SendData(uchar ch)
{
    SBUF = ch;                 //写数据到UART数据寄存器
                while(TI == 0);
                TI = 0;
}


/*发送字符串*/
void SendString(uchar *s)
{
    while (*s)                  //检测字符串结束标志
    {
        SendData(*s++);         //发送当前字符
    }
}




/*----------------------------
初始化ADC
----------------------------*/
void InitADC()
{
        P1ASF = 0x01;           //设置P1.0口为AD口
        ADC_RES = 0;              //清除结果寄存器高8位

        ADC_CONTR = ADC_POWER ;  //ADC上电
        Delay(2);                     
}



uchar  adc()
{
        uchar ad;
        ADC_CONTR = 0x88;     //ADC上电并启动(转换完成自动关闭ADC,每次转换都要先启动ADC)
        Delay(2);                       
        while (!(ADC_CONTR & ADC_FLAG));//等待ADC转换完成
        ADC_CONTR &= ~ADC_FLAG;         //清零ADC标志位
        ad=ADC_RES;       //得到高8位
  return  ad;


}

uint htd(uint a)//十六进制转十进制
{
    uint b,c;
b=a%10;
c=b;
a=a/10;
b=a%10;
c=c+(b<<4);
a=a/10;
b=a%10;
c=c+(b<<8);
a=a/10;
b=a%10;
c=c+(b<<12);
return c;
}
void main()
{

uchar y,j;
    UartInit();                     //初始化串口
    InitADC();                      //初始化ADC
    while (1)
    {
                        y=adc();
            for(j=0; j<100; j++)        //查温度表
        {
             if(y>=adwd[j]) //AD数组从大到小逐次比较
         
                                                 break;
                 
        }

                                
                        SendData(htd(wd[j]));//温度值转十进制发送

            Delay(400);

    }
}

回复

使用道具 举报

ID:94031 发表于 2021-8-12 09:13 | 显示全部楼层
硬件图也不告诉大家,不好分析。
回复

使用道具 举报

ID:277550 发表于 2021-8-12 10:15 | 显示全部楼层

楼主应该先说自己遇到的情况,不然要人家制作、测试
回复

使用道具 举报

ID:161164 发表于 2021-8-12 12:46 | 显示全部楼层
不明白如何"温度值转十进制发送"
如一数值:0xF0F0(61680)
htd(0xF0F0) => 0x1680(5760)
完全不是同一样东西
十进制和十六进制只是给人看的
单片机看到的只是二进制

SendData()是发送字符串用的
htd的反回类型是uint即两个uchar
如SendData(0x1680),电脑收到的会是下面两个字符
20210812_123153.png

建议写法如下
  1. void main()
  2. {

  3.         uchar y,j;
  4.         uchar Show[10];//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  5.         UartInit();                     //初始化串口
  6.         InitADC();                      //初始化ADC
  7.         while (1)
  8.         {
  9.                 y=adc();
  10.                 for(j=0; j<100; j++)        //查温度表
  11.                 {
  12.                         if(y>=adwd[j]) //AD数组从大到小逐次比较

  13.                                 break;

  14.                 }

  15.                 sprintf(Show,"%u",wd[j]);//<<<<<<<<<<
  16.                 SendData(Show);

  17.                 Delay(400);

  18.         }
  19. }
复制代码





回复

使用道具 举报

ID:401564 发表于 2021-8-13 00:02 | 显示全部楼层
什么情况也不说,什么电路也没有,NTC在串联电阻的什么位置也不知道
代码往这一放,就问"这代码有没有问题?"
我想帮你,我还自己焊个电路,说不定NTC位置不对,我还得换一下,完了我还得建立一个工程,烧录验证一下......
兄弟,上论坛叫别人帮忙好歹有个态度吧
比如说,我这代码编译不成功或者NTC温度和实际温度有误差,要么是无法烧录什么的
你不能像那某个网友一样来消遣我们的热情呀
回复

使用道具 举报

ID:128516 发表于 2021-8-13 11:24 | 显示全部楼层
这个要查表
回复

使用道具 举报

ID:94657 发表于 2021-8-13 15:02 | 显示全部楼层
ntc测温,严谨一点是需要知道B值的,再通过B值、AD值去推算真实温度
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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