找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机LM75温度报警LCD1602显示实验源码

[复制链接]
跳转到指定楼层
楼主
ID:317722 发表于 2018-4-27 14:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一个由lm75构成的温度报警器例程
LM75数字温度传感器报警测试程序
1、程序说明:
  该例程演示了接在单片机端口上的数字温度传感器LM75测试实验。
  并在1602液晶上显示当前温度。同时判断是否超过了温度上限和下限,
  如果超过,液晶屏将有提示闪烁。


2、实验操作
1、将跳线插座J4的跳线帽调至1602端
2、将LCD1602液晶屏插入J3插座中,注液管脚方向。
3、通过调节电位器VR1可以改变显示的对比度。   

单片机源程序如下:
  1. /************************************************
  2. * 文件描述     : LM75数字温度传感器报警测试程序
  3. * 程序文件     : main.c                 
  4. * 版    本     : 1.0
  5. * 作    者     : 火龙电子工作室
  6. * 日    期     : 2017.10.01
  7. * 芯    片     : STC8A8K64S4A12
  8. * 时    钟                        :内部时钟24MHz
  9. * 开发环境                        :Keil uVision4 C51 V9.52
  10.    
  11. * 操    作                :        1、将跳线插座J4的跳线帽调至1602端
  12.                                                                 2、将LCD1602液晶屏插入J3插座中,注液管脚方向。
  13.                                                                 3、通过调节电位器VR1可以改变显示的对比度。       

  14. * 现    象                :        1602显示温度信息。当温度超过程序设定的40度,液晶屏显示High Temp,
  15.                                                           当温度低于程序设定的10度,液晶屏显示Low Temp。
  16.                                                        
  17. * 备    注                :       
  18.                                                         用电烙铁靠近LM75可以观察到高温报警。
  19.                                                         详细说明见左侧Doc目录下的readme文件

  20. ************************************************/
  21. //文件包含
  22. #include "stc8a8k64s4a12.h"
  23. #include "system.h"
  24. #include "lcd1602.h"
  25. #include "lm75.h"       

  26. //宏定义
  27. #define uchar unsigned char
  28. #define uint  unsigned int                                                                 

  29. //更新温度标记
  30. bit UpdateFlag=0;               

  31. //报警标记
  32. bit   NoAlarmFlag=0;
  33. unsigned char AlarmPara=0;       

  34. //设定报警温度上下限
  35. #define TH                40                 
  36. #define TL                10
  37.          
  38. //函数声明
  39. void Timer0_Init(void);
  40. void LM75_GetTemperature(void);

  41. //主方法
  42. void main(void)
  43. {       
  44.         bit FlashFlag;                                                //闪烁标记
  45.         System_Init();                                                //系统初始化
  46.         LCD1602_Init();                                                //LCD1602初始化
  47.         LCD1602_Display_Clear();
  48.         Delay_ms(1000);
  49.         LM75_Init();                                                   //LM75初始化
  50.   Timer0_Init();                                                //定时器初始化
  51.        
  52.         LCD1602_Display_Welcome();//显示欢迎信息       
  53.        
  54.         while(1)
  55.         {       
  56.                 if(UpdateFlag==1)                                //定时1s更新温度
  57.                 {
  58.                         UpdateFlag=0;
  59.                         LM75_GetTemperature();//读取温度

  60.                         if(AlarmPara!=0)                        //如果超温
  61.                         {
  62.                                 FlashFlag=!FlashFlag;        //用于闪烁显示
  63.                                 if(FlashFlag==0)
  64.                                 {
  65.                                         switch(AlarmPara)
  66.                                         {
  67.                                                 case 1:
  68.                                                 {
  69.                                                         LCD1602_Display_High();//显示高温
  70.                                                 }break;
  71.                                                 case 2:
  72.                                                 {
  73.                                                         LCD1602_Display_Low();//显示低温
  74.                                                 }break;       
  75.                                         }
  76.                                 }
  77.                                 else
  78.                                 {
  79.                                         LCD1602_Display_Clear();//清除显示,用于闪烁显示       
  80.                                 }
  81.                                 //如果不报警标记有效
  82.                                 if(NoAlarmFlag==1)
  83.                                 {
  84.                                         NoAlarmFlag=0;       
  85.                                         AlarmPara=0;
  86.                                         LCD1602_Display_Welcome();
  87.                                 }       
  88.                         }                       
  89.                 }                                               
  90.         }
  91. }
  92. /***********************************************
  93. 函数名称:Timer0_Init
  94. 功    能:定时器0初始化函数
  95. 入口参数:无
  96. 返 回 值:无       
  97. 备    注:定时初值可以使用stc下载软件中的
  98.                                         定时初值自动生成功能。
  99.                                         以下的函数和宏定义请参考STC8A8K64S4A12.H文件中的注释
  100. ************************************************/
  101. void Timer0_Init(void)
  102. {
  103.         ClrBits(AUXR,T0x12);//定时器0时钟12T模式       
  104.         //设置定时器0模式 十六位不自动重载方式
  105.         ClrBits(TMOD,T0_GATE|T0_CT|T0_M1);
  106.         SetBits(TMOD,T0_M0);
  107.        
  108.         TL0 = 0xc0;                        //设置定时初值 20ms  24MHz
  109.         TH0 = 0x63;                        //设置定时初值
  110.         TF0 = 0;                                //清除TF0标志
  111.         TR0 = 1;                                //定时器0开始计时
  112.         ET0=1;                                  //使能T0中断
  113.         EA=1;                                          //使能总中断   
  114. }
  115. /***********************************************
  116. 函数名称:Timer0_ISR
  117. 功    能:定时器0中断服务函数
  118. 入口参数:无
  119. 返 回 值:无       
  120. 备    注:TIMER0_VECTOR请参考STC8A8K64S4A12.H文件中的注释
  121. ************************************************/
  122. void Timer0_ISR(void) interrupt TIMER0_VECTOR
  123. {
  124.         static unsigned char T0_Cnt=0;       
  125.         //使用静态计数器,每次调用该中断函数时,
  126.         //静态计数器都能保持上一次的计数值。
  127.         //如果不使用静态计数器,每次调用该中断函数时
  128.         //该计数器初值都是0,计数值就无法累加。
  129.         TL0=0xc0;                                  //重装定时初值定时初值20ms
  130.   TH0=0x63;                  

  131.         T0_Cnt++;
  132.         if(T0_Cnt==50)                //定时1000ms
  133.         {
  134.                 T0_Cnt=0;
  135.                 UpdateFlag=1;                //更新温度标记有效
  136.         }
  137. }
  138. /***********************************************
  139. 函数名称:LM75_GetTemperature
  140. 功    能:LM75读取温度函数
  141. 入口参数:无
  142. 返 回 值:无       
  143. 备    注:无
  144. ************************************************/
  145. void LM75_GetTemperature(void)
  146. {
  147.         unsigned char NegFlag=0;                //负温度标记       
  148.         unsigned int Temperature;

  149.         Temperature=LM75_ReadTemp();//读取温度

  150.         //最高位为0则为正温度,为1则为负温度
  151.         //正温度
  152.         if( (Temperature&0x8000) != 0x8000)
  153.         {
  154.                 //低5位是无效数据,不用,去除。
  155.                 Temperature=Temperature>>5;       
  156.         }
  157.         //负温度
  158.         else
  159.         {
  160.                         //取补码  参考数据手册中温度计算方式
  161.                 Temperature=(((~Temperature)>>5)+0x01);
  162.                 NegFlag=1;
  163.         }
  164.         //Temperature*5/4相当于Temperature*0.125*10
  165.         //Temperature*0.125,读出的温度数据*0.125转换成实际温度
  166.         //将温度数据扩大十倍,显示小数点后一位
  167.         Temperature=Temperature*5/4;
  168.        
  169.         //不判断小数点后数据,故除以10
  170.         if( (Temperature/10)>TH)
  171.         {
  172.                 AlarmPara=1;                                //高温报警
  173.                 NoAlarmFlag=0;       
  174.         }
  175.         else if        ( (Temperature/10)<TL)
  176.         {
  177.                 AlarmPara=2;                                //低温报警
  178.                 NoAlarmFlag=0;
  179.         }
  180.         else
  181.         {
  182.                 NoAlarmFlag=1;       
  183. ……………………

  184. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
  1. #include "lm75.h"
  2. #include <intrins.h>

  3. /***********************************************
  4. 函数名称:Lm75_Delay_1us
  5. 功    能:STC 1T单片机us延时程序
  6. 入口参数:us:延时的微秒数
  7. 返 回 值:无       
  8. 备    注:时钟24MHz
  9. ************************************************/
  10. void LM75_Delay_1us(unsigned int us)
  11. {
  12.   while( us--)
  13.   {
  14.     _nop_();
  15.   }            
  16. }
  17. /***********************************************
  18. 函数名称:LM75_Start
  19. 功    能:LM75开始信号
  20. 入口参数:无
  21. 返 回 值:无       
  22. 备    注:无
  23. ************************************************/
  24. void LM75_Start(void)
  25. {
  26.   LM75_SDA_SET();           //拉高数据线
  27.   LM75_SCL_SET();           //拉高时钟线
  28.   LM75_Delay_1us(10);       //延时
  29.   LM75_SDA_CLR();           //产生下降沿
  30.   LM75_Delay_1us(10);       //延时
  31. }
  32. /***********************************************
  33. 函数名称:LM75_Stop
  34. 功    能:LM75停止信号
  35. 入口参数:无
  36. 返 回 值:无       
  37. 备    注:无
  38. ************************************************/
  39. void LM75_Stop(void)
  40. {
  41.   LM75_SDA_CLR();                 //拉低数据线
  42.   LM75_SCL_SET();                 //拉高时钟线
  43.   LM75_Delay_1us(10);       //延时
  44.   LM75_SDA_SET();           //产生上升沿
  45.   LM75_Delay_1us(10);       //延时
  46. }
  47. /***********************************************
  48. 函数名称:LM75_SendACK
  49. 功    能:单片机给LM75发送应答信号
  50. 入口参数:ack (0:ACK 1:NAK)
  51. 返 回 值:无       
  52. 备    注:无
  53. ************************************************/
  54. void LM75_SendACK(bit ack)
  55. {
  56.   LM75_SDA_IN() = ack;      //写应答信号
  57.         LM75_Delay_1us(10);       //延时
  58.   LM75_SCL_SET();           //拉高时钟线
  59.   LM75_Delay_1us(10);       //延时
  60.   LM75_SCL_CLR();           //拉低时钟线
  61.   LM75_Delay_1us(10);       //延时
  62. }
  63. /***********************************************
  64. 函数名称:LM75_RecvACK
  65. 功    能:单片机从LM75接收应答信号
  66. 入口参数:无
  67. 返 回 值:bit (0:ACK 1:NAK)       
  68. 备    注:无
  69. ************************************************/
  70. bit LM75_RecvACK(void)
  71. {       
  72.         bit ack;
  73.   LM75_SCL_CLR();           //拉低时钟线
  74.   LM75_Delay_1us(10);       //延时
  75.         LM75_SDA_SET();           //产生上升沿
  76.         LM75_SCL_SET();           //拉高时钟线
  77.         LM75_Delay_1us(10);       //延时
  78.   ack = LM75_SDA_IN();      //读应答信号  
  79.   LM75_Delay_1us(10);       //延时
  80.         LM75_SCL_CLR();           //拉低时钟线
  81.   LM75_Delay_1us(10);       //延时
  82.   return ack;
  83. }
  84. /***********************************************
  85. 函数名称:LM75_SendByte
  86. 功    能:向IIC总线发送一个字节数据
  87. 入口参数:dat:发送的数据
  88. 返 回 值:无       
  89. 备    注:无
  90. ************************************************/
  91. bit LM75_SendByte(unsigned char dat)
  92. {
  93.   unsigned char i;

  94.         LM75_SDA_D_OUT();                   // 设置SDA为输出方向

  95.   for (i=0; i<8; i++)     //8位计数器
  96.   {
  97.                 LM75_SCL_CLR();       //拉低时钟线
  98.                 LM75_Delay_1us(10);   //延时
  99.                 if( (dat&0x80)==0x80 )//先发送高字节
  100.                  {
  101.                    LM75_SDA_SET();
  102.                  }
  103.                  else
  104.                  {
  105.                    LM75_SDA_CLR();
  106.                  }
  107.     dat <<= 1;            //移出数据的最高位
  108.                 LM75_Delay_1us(10);   //延时
  109.     LM75_SCL_SET();       //拉高时钟线
  110.     LM75_Delay_1us(10);   //延时   
  111.   }
  112.         LM75_SCL_CLR();         //拉低时钟线
  113.         LM75_Delay_1us(10);     //延时
  114.   return LM75_RecvACK();        //接收应答
  115. }
  116. /***********************************************
  117. 函数名称:LM75_RecvByte
  118. 功    能:从IIC总线接收一个字节数据
  119. 入口参数:无
  120. 返 回 值:unsigned char:接收到得数据       
  121. 备    注:无
  122. ************************************************/
  123. unsigned char LM75_RecvByte(void)
  124. {
  125.   unsigned char i;
  126.   unsigned char dat = 0;

  127.   LM75_SDA_D_IN();                           //设置SDA为输入方向
  128.         LM75_SDA_SET();                                        //读之前先置高

  129.   for (i=0; i<8; i++)     //8位计数器
  130.   {
  131.                 LM75_SCL_CLR();       //拉低时钟线
  132.                 LM75_Delay_1us(10);   //延时
  133.     dat <<= 1;
  134.     LM75_SCL_SET();              //拉高时钟线
  135.     LM75_Delay_1us(10);    //延时
  136.     dat |= LM75_SDA_IN(); //读数据
  137.   
  138.     LM75_Delay_1us(10);    //延时
  139.   }
  140.         LM75_SCL_CLR();         //拉低时钟线
  141.         LM75_Delay_1us(10);     //延时
  142.   return dat;
  143. }
  144. /***********************************************
  145. 函数名称:LM75_Ready
  146. 功    能:查询LM75是否就绪
  147. 入口参数:无
  148. 返 回 值:bit (0:Ready 1:Busy)       
  149. 备    注:无
  150. ************************************************/
  151. bit LM75_Ready(void)
  152. {
  153.         bit ack;
  154.         LM75_Start();                                                        //开始
  155.         ack=LM75_SendByte(LM75_ADDR_WR); //发送设备地址+写信号,读取应答  
  156.   return ack;                                                                //返回应答
  157. }
  158. /***********************************************
  159. 函数名称:LM75_writeReg
  160. 功    能:写LM75寄存器。
  161. 入口参数:add:寄存器地址。
  162.                                         dat:写入寄存器的值。       
  163. 返 回 值:无       
  164. 备    注:无
  165. ************************************************/
  166. /*
  167. void LM75_WriteReg(unsigned char add,unsigned char dat)
  168. {
  169.         while(LM75_Ready());                                //等待LM75就绪
  170.   LM75_Start();                            //起始信号
  171.   LM75_SendByte(LM75_ADDR_WR);/发送设备地址+写信号
  172.   LM75_SendByte(add);                           //发送寄存器地址
  173.   LM75_SendByte(dat);                                        //发送寄存器数据
  174.   LM75_Stop();                             //停止信号
  175. }
  176. */
  177. /***********************************************
  178. 函数名称:LM75_ReadReg
  179. 功    能:读取LM75寄存器。
  180. 入口参数:add:寄存器地址。       
  181. 返 回 值:unsigned char:返回的数值       
  182. 备    注:无
  183. ************************************************/
  184. /*
  185. unsigned char LM75_ReadReg(unsigned char add)
  186. {
  187.         unsigned char dat;
  188.        
  189.         while(LM75_Ready());                                //等待LM75就绪
  190.   LM75_Start();                            //起始信号
  191.   LM75_SendByte(LM75_ADDR_WR);//发送设备地址+写信号
  192.   LM75_SendByte(add);                           //发送寄存器地址
  193.   LM75_Start();                            //起始信号
  194.   LM75_SendByte(LM75_ADDR_RD);//发送设备地址+读信号

  195.         dat=LM75_RecvByte();                                //接收数据

  196.         LM75_SendACK(NOACK);                                 //最后一个数据需要NAK
  197.   LM75_Stop();                             //停止信号
  198.         return dat;
  199. }
  200. */
  201. /***********************************************
  202. 函数名称:LM75_ReadTemp
  203. 功    能:从LM75读取温度信息。
  204. 入口参数:unsigned int:返回温度信息
  205. 返 回 值:无       
  206. 备    注:无
  207. ************************************************/
  208. unsigned int LM75_ReadTemp(void)
  209. {
  210.   unsigned char tempH,tempL;
  211.         unsigned int Temper;
  212.        
  213.         while(LM75_Ready());                                //等待LM75就绪
  214.   LM75_Start();                            //起始信号
  215.   LM75_SendByte(LM75_ADDR_WR);//发送设备地址+写信号
  216.   LM75_SendByte(LM75_TEMP);          //发送温度寄存器地址
  217.   LM75_Start();                            //起始信号
  218.   LM75_SendByte(LM75_ADDR_RD);//发送设备地址+读信号

  219.         tempH = LM75_RecvByte();                //先读出高字节
  220.         LM75_SendACK(ACK);                                         //回应ACK

  221.         tempL = LM75_RecvByte();                //再读出低字节
  222.         LM75_SendACK(NOACK);                                 //最后一个数据需要NAK
  223.   LM75_Stop();                             //停止信号

  224.         Temper=tempH;                                                                //将高低位合并
  225.         Temper=Temper<<8 | tempL;

  226.         return Temper;
  227. }
  228. /***********************************************
  229. 函数名称:LM75_Reset
  230. 功    能:I2C总线复位操作
  231. 入口参数:无
  232. 返 回 值:无       
  233. 备    注:发9个脉冲产生复位
  234. ************************************************/
  235. void LM75_Reset(void)
  236. {
  237.         unsigned char i;
  238.   LM75_SDA_SET();                  //拉高数据线
  239.         for(i=0;i<9;i++)
  240.         {
  241.                 LM75_SCL_CLR();         //拉低时钟线
  242.                 LM75_Delay_1us(10);     //延时
  243.                 LM75_SCL_SET();                      //拉高时钟线
  244.     LM75_Delay_1us(10);            //延时
  245.         }
  246. }
  247. /***********************************************
  248. 函数名称:LM75_Init
  249. 功    能:LM75芯片初始化函数。
  250. 入口参数:无
  251. 返 回 值:无       
  252. 备    注:无
  253. ************************************************/
  254. void LM75_Init(void)
  255. {
  256.         //将P32 P33 设置为开漏结构
  257.         P3_Mode_OUT_OD(PIN_2|PIN_3);
  258.                
  259.         LM75_SCL_SET();     //拉高时钟线
  260.         LM75_SDA_SET();                        //拉高数据线
  261.         LM75_Reset();                                //器件复位
  262. }
复制代码


所有资料51hei提供下载:
23_LM75温度报警LCD1602显示实验.rar (108.91 KB, 下载次数: 64)


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

使用道具 举报

沙发
ID:147492 发表于 2018-11-27 16:34 | 只看该作者
LM75比DS1802便宜太多,初试下
回复

使用道具 举报

板凳
ID:475478 发表于 2019-2-10 04:20 | 只看该作者
代码完整不,还是要从附件下载
回复

使用道具 举报

地板
ID:475478 发表于 2019-2-11 16:03 | 只看该作者
STC8A8K 是带有i2C接口的,为什么不用带的接口, 是否I2C接口有问题
回复

使用道具 举报

5#
ID:226798 发表于 2020-2-12 07:57 来自手机 | 只看该作者
jrcsh 发表于 2019-2-11 16:03
STC8A8K 是带有i2C接口的,为什么不用带的接口, 是否I2C接口有问题

用过8A的I2C你就知道了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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