找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机ntc检测温度,不显示温度值 是什么问题?求解

[复制链接]
跳转到指定楼层
楼主

  1. #include<reg52.h>                                 //头文件
  2. #include<intrins.h>
  3. #include"eeprom52.h"                  //调用STC89C52单片机的EEPROM控制程序
  4. #include "math.h"
  5. #define uchar unsigned char                 //宏定义
  6. #define uint unsigned int                 //宏定义
  7. #define LCD1602_dat P0                         //LCD1602的数据传输IO口

  8. sbit LCD1602_rs=P3^5;//LCD1602命令数据控制IO
  9. sbit LCD1602_rw=P3^6; //LCD1602读写IO控制
  10. sbit LCD1602_e=P3^4;  //数据脉冲输入

  11. sbit DIN  = P2^0;        //串行数据输入端
  12. sbit DCLK  = P2^1;        //I/O时钟输入
  13. sbit DOUT = P2^5;   //串行数据输出端
  14. sbit CS   = P3^7;        //片选脚IO

  15. #define  AD_CH3 0xe4

  16. float zhi;        //暂存读取的输入变量

  17. int temp;        //读取热敏温度计的温度数据

  18. void delay(uint T)                //系统延时程序
  19. {
  20.         while(T--);
  21. }

  22. /*=========================================
  23. 函数   :SPI_Write(uchar DAT)
  24. 参数   :DAT需要发送的数据
  25. 返回值 :无
  26. 描述   :发送一个字节数据
  27. ==========================================*/
  28. void SPI_Write(uchar DAT)
  29. {
  30.         uchar i;
  31.         for(i=0;i<8;i++)     //分别写8次,每次写一位
  32.         {
  33.                 DCLK = 0;        //拉低时钟总,允许DIN变化
  34.                 if(DAT & 0x80)   //先写数据最高位
  35.                         DIN = 1;     //写1
  36.                 else
  37.                         DIN = 0;     //写0
  38.                 DCLK = 1;        //拉高时钟,让从位机读取DIN        
  39.                 DAT <<=1;
  40.         }
  41. }
  42. /*========================================
  43. 函数   :ReadByte()
  44. 参数   :无
  45. 返回值 :返回读出的数据
  46. =========================================*/
  47. uint SPI_Read()
  48. {
  49.         uchar i;
  50.         uint DAT;
  51.         for(i=0;i<12;i++)  //分别读12次,每次读一位
  52.         {
  53.                 DAT <<=1;      //数据左移一位,准备接收一位
  54.                 DCLK = 1;      //拉高时钟总线,读取SDA上的数据
  55.                 DCLK = 0;      //拉低时钟总线,允许从机控制SDA变化
  56.                 if(DOUT)
  57.                 DAT |= 0x01;   //为1则写1,否则不执行写1,通过左移补零
  58.         }
  59.         return(DAT);   //返回读出的数据
  60. }
  61. /*=======================================
  62. 函数   :PCF8591Read(uchar cmd)
  63. 参数   :cmd XPT2046控制字节
  64. 返回值 :AD转出的数字量
  65. 描述   :读指定通道的输入的模拟量转为数字量
  66. ========================================*/
  67. uint ReadAD(uchar cmd)
  68. {
  69.         uint DAT;
  70.         CS = 0;
  71.         SPI_Write(cmd);
  72.         DCLK = 0;        //拉低时钟总线
  73.         _nop_();
  74.         _nop_();
  75.         _nop_();
  76.         _nop_();
  77.         _nop_();
  78.         DAT = SPI_Read();
  79.         CS = 1;
  80.         return(DAT);    //返回读出数据
  81. }
  82. /********************************************************************
  83. * 名称 : LCD1602_write(uchar order,dat)
  84. * 功能 : 1602写如数据函数
  85. * 输入 : 输入的命令值
  86. * 输出 : 无
  87. ***********************************************************************/
  88. void LCD1602_write(uchar order,dat)                                  //1602 一个字节  处理
  89. {
  90.     LCD1602_e=0;
  91.     LCD1602_rs=order;
  92.     LCD1602_dat=dat;
  93.     LCD1602_rw=0;
  94.     LCD1602_e=1;
  95.     delay(1);
  96.     LCD1602_e=0;                                                                                                                                                                                                     
  97. }
  98. /********************************************************************
  99. * 名称 : LCD1602_writebye(uchar *prointer)
  100. * 功能 : 1602写入数据函数  指针式
  101. * 输入 : 输入的命令值
  102. * 输出 : 无
  103. ***********************************************************************/
  104. void LCD1602_writebyte(uchar *prointer)                                   //1602 字符串    处理
  105. {
  106.     while(*prointer!='\0')
  107.     {
  108.         LCD1602_write(1,*prointer);
  109.         prointer++;
  110.     }
  111. }
  112. /********************************************************************
  113. * 名称 : LCD1602_cls()
  114. * 功能 : 初始化1602液晶
  115. * 输入 : 无
  116. * 输出 : 无
  117. ***********************************************************************/
  118. void LCD1602_cls()                                                                         //1602 初始化
  119. {
  120.         LCD1602_write(0,0x01);     //1602 清屏 指令
  121.         delay(1500);
  122.         LCD1602_write(0,0x38);     // 功能设置 8位、5*7点阵
  123.         delay(1500);
  124.         LCD1602_write(0,0x0c);     //设置 光标   不显示开关、不显示光标、字符不闪烁
  125.         LCD1602_write(0,0x06);
  126.         LCD1602_write(0,0xd0);
  127.         delay(1500);
  128. }
  129. /********************************************************************
  130. * 名称 : show()
  131. * 功能 : LCD1602液晶显示程序
  132. * 输入 : 无
  133. * 输出 : 无
  134. ***********************************************************************/
  135. void show()                        //显示数据
  136. {

  137.                 LCD1602_write(0,0x80);                   //显示位置设定
  138.                 LCD1602_writebyte("Temp:");                //显示当前温度值
  139.                 if(temp>=0)                         //显示温度整数部分
  140.                 {
  141.                            if(temp>999)LCD1602_write(1,0x30+temp/1000%10);           
  142.                         else LCD1602_writebyte(" ");
  143.                         if(temp>99)LCD1602_write(1,0x30+temp/100%10);
  144.                         else LCD1602_writebyte(" ");
  145.                         LCD1602_write(1,0x30+temp/10%10);
  146.                         LCD1602_writebyte(".");
  147.                            LCD1602_write(1,0x30+temp%10);
  148.                 }else
  149.                 {
  150.                         LCD1602_writebyte("-");          //显示温度负数部分
  151.                         if(temp*-1>99)LCD1602_write(1,0x30+(temp*-1)/10%10);
  152.                         else LCD1602_writebyte(" ");
  153.                         LCD1602_write(1,0x30+(temp*-1)%10);        
  154.                         LCD1602_writebyte(".");
  155.                            LCD1602_write(1,0x30+temp%10);
  156.                 }
  157.                 LCD1602_write(1,0xdf);
  158.                 LCD1602_writebyte("C  ");
  159. }
  160. /********************************************************************
  161. * 名称 : float TempCalculate(float Rx,float B,float Revise,float BasicRx)
  162. * 功能 : 根据当前热敏电阻的阻值、以及参数、通过Sin曲线求出当前系统的温度值  并返回浮点型的温度值
  163. * 输入 : 无
  164. * 输出 : 无
  165. ***********************************************************************/
  166. float TempCalculate(float Rx,float B,float Revise,float BasicRx)
  167. {
  168. /*

  169. Rx:  热敏电阻当前阻值
  170. B:   热敏电阻参数B值
  171. Revise:  校正温度
  172. BasicRx:  热敏电阻25度时电阻(标称电阻数值)
  173. 返回: 摄氏度

  174. */  


  175.     Rx = Rx / BasicRx;

  176.     Rx = log(Rx);

  177.     Rx = (Rx) / B;

  178.     Rx = Rx + 0.003356;
  179.     Rx = 1 / Rx;
  180.     Rx = Rx - 273.13;  
  181.     Rx = Rx + Revise;


  182.     return Rx;

  183. }
  184. /********************************************************************
  185. * 名称 : void main()
  186. * 功能 : 系统主程序
  187. * 输入 : 无
  188. * 输出 : 无
  189. ***********************************************************************/
  190. void main()
  191. {
  192.         float Rad;               //生成运算暂存变量
  193.         LCD1602_cls();     //LCD1602初始化程序调用
  194.         while(1)
  195.         {
  196.                 zhi=(float)ReadAD(AD_CH3)/819.0;  //计算电压值
  197.                 Rad=zhi/((5.0-zhi)/10000.0);   //计算热敏电阻当前阻值
  198.                 temp=(int)((temp * 0.5) + (TempCalculate(Rad,4200.0,0,10000.0) * 0.5)*10);//求出当前系统的当前温度
  199.                 show();                 //显示函数
  200.         }
  201. }

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

使用道具 举报

沙发
ID:752974 发表于 2021-10-11 17:27 | 只看该作者
数据采集和数据显示应该是独立工作的两个模块,先调显示函数,正常工作后再调数据采集部分。
回复

使用道具 举报

板凳
ID:959346 发表于 2021-10-11 19:39 | 只看该作者
是所有都没有显示,还是其它固定显示的正常,只有温度没有显示?如果有显示,按代码看,温度一定会显示数字,那就是温度值显示不对?如果都没有显示,那就先把显示调出来。如果是有显示,但是温度显示不对,先显示固定的温度值,看显示是否正常,如果正常,就分析你的ADC检测及温度转化部分。
回复

使用道具 举报

地板
ID:858009 发表于 2021-10-13 11:37 | 只看该作者
Jiang_YY 发表于 2021-10-11 19:39
是所有都没有显示,还是其它固定显示的正常,只有温度没有显示?如果有显示,按代码看,温度一定会显示数字 ...

其他都正常,固定显示温度也可以,ADC转换显示在1602液晶屏可以显示正确温度,在断码屏显示不出正常温度,一直显示三个0,不知道是什么原因
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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