找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机TC72温度传感器应用设计源码与电路等资料

[复制链接]
跳转到指定楼层
楼主
ID:358498 发表于 2018-6-25 15:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1、系统工作原理
TC72温度数字传感器能够读取从-55℃至+125℃范围内的温度,可用于连续温度转换模式或单次转换模式。连续温度转换模式每隔约150ms测量温度并将温度存储在温度寄存器中。相反,单次转换模式只进行单次温度测量,然后转换到节能的关断模式。该传感器具有的串行接口能够与主控制器或其它外设通信。TC72接口兼容SPI协议。TC72不需要额外的外部元器件。
本系统以MCS-51系列单片机为核心器件,组成一个温度传感器,采用数字温度传感器TC72为检测器件,进行单点温度检测,检测精度为±0.5摄氏度。温度显示采用LCD1602显示,两位整数,一位小数。
2、系统硬件原理图
1.系统硬件原理图

3、程序流程图
采用AT89C51单片机作为控制核心对温度传感器TC72控制,读取温度信号并进行计算处理,并送到液晶显示器LCD1602显示。 按照系统设计功能的要求,确定系统由3个模块组成:主控制器、测温电路和显示电路。程序设计流程图如下:

图2.程序流程图
4、程序清单
系统程序主要包括主程序、读出温度子程序、温度转换子程序、计算温度子程序、显示程序、延时程序等等。主程序主要功能是完成TC72的初始化工作,并进行读温度,将温度转化成为字符型数据并在显示器上显示传感器所测得的实际温度。读出温度子程序的主要功能是读出RAM中的9字节,在读出时需要进行CRC校验,校验有错时不进行温度数据的改写。

5、Proteus仿真调试结果及分析
PROTEUS 是单片机课堂教学的先进助手。PROTEUS不仅可以将许多单片机实例功能形象化,也可将许多单片机实例运行过程形象化。前者可在相当程度上得到实物演示实验的效果,后者则是实物演示实验难以达到的效果。它的元器件、连接线路等却和传统的单片机实验硬件高度对应。这在相当程度上替代了传统的单片机实验教学的功能,例:元器件选择、电路连接、电路检测、电路修改、软件调试、运行结果等。
在PROTEUS绘制好原理图后,调入已编译好的目标代码文件:*.HEX,可以在PROTEUS的原理图中看到模拟的实物运行状态和过程。
SPI接口TC72温度传感器应用测试课题仿真调试结果如下:
第一步:编写C语言程序,编译成功0  error;0  warning;并生成HEX文件;
第二步:绘制仿真图,检查无误,导入HEX文件,运行结果:LCD亮但不显示TC72温度传感器温度;
第三步:检查源程序及仿真图,无法发现错误;
第四步:咨询老师,经检查缺少LCD1602液晶显示屏控制与显示程序;
第五步:修改程序即在已建工程中新建并编写LCD1602液晶显示屏控制与显示程序,编译成功,生成HEX文件,导入Proteus仿真图运行成功
第六步:送老师检查通过。
3.仿真结果图
元件清单
品名
数量
单位


LCD1602液晶屏
1
pcs

10K电位器
1
Ω

51单片机
1
pcs

单片机40 pin底座
1
pcs

12M晶振
1
Hz

22PF电容
2
pf

10UF电容
1
μf

独立按钮
1
pcs

电阻10K
1
Ω

电阻220
1
Ω


TC72温度传感器
1
pcs

DC电源头
1
pcs

电源开关
1
pcs

9*15cm洞洞板
1
pcs

焊锡
若干


导线
若干


  1. //-----------------------------------------------------------------
  2. //              名称: SPI接口温度传感器TC72应用测试
  3. //-----------------------------------------------------------------
  4. //              说明: 本例运行时,单片机将持续从TC72传感器读取温度数据并转换为
  5. //                              浮点型字符串送LCD显示(内置SPI接口需要在实物电路测试)
  6. //
  7. //-----------------------------------------------------------------
  8. #include <REG51.H>
  9. #include <intrins.h>
  10. #include <stdio.h>
  11. #include <math.h>
  12. #define INT8U              unsigned char
  13. #define INT16U              unsigned int
  14. //SPI使能与禁用(注意TC72是高电平使能,低电平禁用)
  15. #define SPI_EN() P1 |=              (1<<4)
  16. #define SPI_DI() P1 &= ~(1<<4)
  17. //TC72寄存器地址定义
  18. #define TC72_CTRL                            0x80              //控制寄存器
  19. #define TC72_TEMP_LSB              0x01              //温度低字节
  20. #define TC72_TEMP_MSB              0x02              //温度高字节
  21. #define TC72_MANU_ID              0x03              //制造商ID
  22. //SPI接口引脚定义(模拟方式)
  23. sbit SCK = P3^4;                                                        //串行时钟
  24. sbit CE  = P3^5;                                                        //片选
  25. sbit SDI  = P3^6;                                                        //串行数据输入
  26. sbit SDO  = P3^7;                                                        //串行数据输出
  27. //内置SPI寄存器及寄存器位定义
  28. //SPCON C3h SPI Control              SPR2 SPEN SSDIS MSTR CPOL CPHA SPR1 SPR0
  29. //SPSTA C4h SPI Status              SPIF WCOL SSERR MODF - - - -
  30. //SPDAT C5h SPI Data              SPD7 SPD6 SPD5  SPD4 SPD3 SPD2 SPD1 SPD0
  31. sfr              SPCON              =              0xC3;
  32. sfr              SPSTA              =              0xC4;
  33. sfr              SPDAT              =              0xC5;
  34. extern void Initialize_LCD();
  35. extern void LCD_ShowString(INT8U r, INT8U c,INT8U *str);
  36. extern void delay_ms(INT16U x);
  37. INT8U T[2];                                                                                    //两字节原始温度数据
  38. float TempX = 0.0;                                                        //浮点温度值
  39. //-----------------------------------------------------------------
  40. // SPI主机初始化
  41. //-----------------------------------------------------------------
  42. void SPI_MasterInit()
  43. {
  44.    SPCON=0xD0;
  45.    SPSTA=0xC0;
  46. }

  47. //-----------------------------------------------------------------
  48. // SPI数据传输
  49. //-----------------------------------------------------------------
  50. INT8U SPI_SendData(INT8U dat)

  51. {
  52.   SPDAT=dat;
  53.   while((SPSTA&0x80)==0x00);
  54.   SPSTA=0xC0;
  55.   return SPDAT;
  56. }
  57. //-----------------------------------------------------------------
  58. // 从当前地址读取一字节数据(模拟方式)
  59. //-----------------------------------------------------------------
  60. INT8U ReadByte()
  61. {
  62.   INT8U i,d=0x00;
  63.   for(i=0;i<8;i++)
  64.   {
  65.                  SCK=1;SCK=0;d=(d<<1)|SDO;
  66.     }
  67.     return d;
  68. }
  69. //-----------------------------------------------------------------
  70. // 向当前地址写入一字节数据(模拟方式)
  71. //-----------------------------------------------------------------
  72. void WriteByte(INT8U dat)
  73. {
  74.    INT8U i;
  75.    for(i=0;i<8;i++)
  76.    { dat<<=1;SDI=CY;
  77.      SCK=0;SCK=1;
  78.               }
  79. }
  80. //-----------------------------------------------------------------
  81. // 向TC72写入两字节(地址,数据)(模拟方式)
  82. //-----------------------------------------------------------------
  83. void Write_TC72(INT8U addr, INT8U dat)
  84. {
  85.   CE=1;
  86.   WriteByte(addr);
  87.   WriteByte(dat);
  88.   CE=0;
  89. }
  90. //-----------------------------------------------------------------
  91. // 写TC72配置数据
  92. //-----------------------------------------------------------------
  93. void Config_TC72()
  94. {
  95.   Write_TC72(TC72_CTRL,0x15);
  96. }
  97. //-----------------------------------------------------------------
  98. // 从TC72读取两字节温度数据并转换为浮点温度值
  99. //-----------------------------------------------------------------
  100. void Read_TC72_Temperature()
  101. {
  102.   Config_TC72();
  103.   delay_ms(20);
  104.   CE=1;
  105.   WriteByte(TC72_TEMP_MSB);
  106.   T[1]=ReadByte();
  107.   T[0]=ReadByte();
  108.   CE=0;
  109.   TempX=(((int)((T[1]<<8)|T[0]))>>6)*0.25;
  110. }
  111. //-----------------------------------------------------------------
  112. // 主程序            
  113. //-----------------------------------------------------------------
  114. void main()
  115. {
  116.   char DisplayBuffer[17];
  117.    Initialize_LCD();
  118.    LCD_ShowString(0,0,"TC72 Sensor Test");
  119.    while(1)
  120.    {  Config_TC72();
  121.       Read_TC72_Temperature();
  122.                 sprintf(DisplayBuffer,"%TEMP:%6.1f\xDF\x43",TempX);
  123.                 LCD_ShowString(1,0,DisplayBuffer);
  124.               }
  125. }
  126. //-----------------------------------------------------------------
  127. // 液晶控制与显示程序
  128. //-----------------------------------------------------------------
  129. #include <reg51rc2.h>
  130. #include <intrins.h>
  131. #define INT8U  unsigned char
  132. #define INT16U unsigned int
  133. sbit RS = P2^0;  //寄存器选择线
  134. sbit RW = P2^1;              //读/写控制线
  135. sbit EN = P2^2;              //使能控制线
  136. //-----------------------------------------------------------------
  137. // 延时
  138. //-----------------------------------------------------------------
  139. void delay_ms(INT16U ms)
  140. {
  141.               INT8U i;
  142.               while(ms--) for(i = 0; i < 120; i++);
  143. }
  144. //-----------------------------------------------------------------
  145. // 忙等待
  146. //-----------------------------------------------------------------
  147. void Busy_Wait()
  148. {
  149. INT8U LCD_Status; //液晶状态字节变量
  150. do
  151. { P0=0xff; //液晶屏端口初始置高电平
  152. EN=0;RS=0;RW=1; //LCD禁止,选择状态寄存器,准备读
  153. EN=1;LCD_Status=P0; //LCD使能,从P0端口读取液晶屏状态字节
  154. EN=0; //LCD禁止
  155. } while (LCD_Status & 0x80); //液晶忙继续循环            
  156. }
  157. //-----------------------------------------------------------------
  158. // 写LCD命令
  159. //-----------------------------------------------------------------
  160. void Write_LCD_Command(INT8U cmd)
  161. {
  162. Busy_Wait();
  163. RS=0;
  164. RW=0;
  165. EN=0;
  166. P0=cmd;
  167. EN=1;
  168. delay_ms(1);
  169. EN=0;
  170. }                                          
  171. //-----------------------------------------------------------------
  172. // 发送数据
  173. //-----------------------------------------------------------------
  174. void Write_LCD_Data(INT8U dat)
  175. {
  176. Busy_Wait();
  177. RS=1;
  178. RW=0;
  179. EN=0;
  180. P0=dat;
  181. EN=1;
  182. delay_ms(1);
  183. EN=0;
  184. }
  185. //-----------------------------------------------------------------
  186. // LCD初始化
  187. //-----------------------------------------------------------------
  188. void Initialize_LCD()
  189. {
  190.   Write_LCD_Command(0x38); delay_ms(1);              //置功能,8位,双行,5*7
  191.               Write_LCD_Command(0x01); delay_ms(1);              //清屏
  192.               Write_LCD_Command(0x06); delay_ms(1);              //字符进入模式:屏幕不动,字符后移
  193.               Write_LCD_Command(0x0C); delay_ms(1);              //显示开,关光标
  194. }
  195. //-----------------------------------------------------------------
  196. // 显示字符串
  197. //-----------------------------------------------------------------
  198. void LCD_ShowString(INT8U r, INT8U c,INT8U *str)
  199. {
  200.   INT8U i = 0;
  201.               code INT8U DDRAM[] = {0x80,0xC0};                            //1602LCD两行的起始DDRAM地址
  202.               Write_LCD_Command(DDRAM[r] | c);                            //设置显示起始位置

  203.               for ( i = 0; str[i] && i < 16 ;i++)                            //输出字符串
  204.                 Write_LCD_Data(str[i]);

  205.               for (i=0; i < 16; i++)                                                                                    //不足一行时用空格填充
  206.                 Write_LCD_Data(' ');
  207. }
复制代码

以上图文的Word格式文档下载(内容和本网页上的一模一样,方便大家保存):
单片机原理及系统设计.doc (121 KB, 下载次数: 31)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:863864 发表于 2022-12-28 11:36 | 只看该作者
有源码和仿真文件吗?感觉发送还是有点问题
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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