标题:
单片机LM75温度报警LCD1602显示实验源码
[打印本页]
作者:
qwertyuiop110
时间:
2018-4-27 14:36
标题:
单片机LM75温度报警LCD1602显示实验源码
一个由lm75构成的温度报警器例程
LM75数字温度传感器报警测试程序
1、程序说明:
该例程演示了接在单片机端口上的数字温度传感器LM75测试实验。
并在1602液晶上显示当前温度。同时判断是否超过了温度上限和下限,
如果超过,液晶屏将有提示闪烁。
2、实验操作
1、将跳线插座J4的跳线帽调至1602端
2、将LCD1602液晶屏插入J3插座中,注液管脚方向。
3、通过调节电位器VR1可以改变显示的对比度。
单片机源程序如下:
/************************************************
* 文件描述 : LM75数字温度传感器报警测试程序
* 程序文件 : main.c
* 版 本 : 1.0
* 作 者 : 火龙电子工作室
* 日 期 : 2017.10.01
* 芯 片 : STC8A8K64S4A12
* 时 钟 :内部时钟24MHz
* 开发环境 :Keil uVision4 C51 V9.52
* 操 作 : 1、将跳线插座J4的跳线帽调至1602端
2、将LCD1602液晶屏插入J3插座中,注液管脚方向。
3、通过调节电位器VR1可以改变显示的对比度。
* 现 象 : 1602显示温度信息。当温度超过程序设定的40度,液晶屏显示High Temp,
当温度低于程序设定的10度,液晶屏显示Low Temp。
* 备 注 :
用电烙铁靠近LM75可以观察到高温报警。
详细说明见左侧Doc目录下的readme文件
************************************************/
//文件包含
#include "stc8a8k64s4a12.h"
#include "system.h"
#include "lcd1602.h"
#include "lm75.h"
//宏定义
#define uchar unsigned char
#define uint unsigned int
//更新温度标记
bit UpdateFlag=0;
//报警标记
bit NoAlarmFlag=0;
unsigned char AlarmPara=0;
//设定报警温度上下限
#define TH 40
#define TL 10
//函数声明
void Timer0_Init(void);
void LM75_GetTemperature(void);
//主方法
void main(void)
{
bit FlashFlag; //闪烁标记
System_Init(); //系统初始化
LCD1602_Init(); //LCD1602初始化
LCD1602_Display_Clear();
Delay_ms(1000);
LM75_Init(); //LM75初始化
Timer0_Init(); //定时器初始化
LCD1602_Display_Welcome();//显示欢迎信息
while(1)
{
if(UpdateFlag==1) //定时1s更新温度
{
UpdateFlag=0;
LM75_GetTemperature();//读取温度
if(AlarmPara!=0) //如果超温
{
FlashFlag=!FlashFlag; //用于闪烁显示
if(FlashFlag==0)
{
switch(AlarmPara)
{
case 1:
{
LCD1602_Display_High();//显示高温
}break;
case 2:
{
LCD1602_Display_Low();//显示低温
}break;
}
}
else
{
LCD1602_Display_Clear();//清除显示,用于闪烁显示
}
//如果不报警标记有效
if(NoAlarmFlag==1)
{
NoAlarmFlag=0;
AlarmPara=0;
LCD1602_Display_Welcome();
}
}
}
}
}
/***********************************************
函数名称:Timer0_Init
功 能:定时器0初始化函数
入口参数:无
返 回 值:无
备 注:定时初值可以使用stc下载软件中的
定时初值自动生成功能。
以下的函数和宏定义请参考STC8A8K64S4A12.H文件中的注释
************************************************/
void Timer0_Init(void)
{
ClrBits(AUXR,T0x12);//定时器0时钟12T模式
//设置定时器0模式 十六位不自动重载方式
ClrBits(TMOD,T0_GATE|T0_CT|T0_M1);
SetBits(TMOD,T0_M0);
TL0 = 0xc0; //设置定时初值 20ms 24MHz
TH0 = 0x63; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1; //使能T0中断
EA=1; //使能总中断
}
/***********************************************
函数名称:Timer0_ISR
功 能:定时器0中断服务函数
入口参数:无
返 回 值:无
备 注:TIMER0_VECTOR请参考STC8A8K64S4A12.H文件中的注释
************************************************/
void Timer0_ISR(void) interrupt TIMER0_VECTOR
{
static unsigned char T0_Cnt=0;
//使用静态计数器,每次调用该中断函数时,
//静态计数器都能保持上一次的计数值。
//如果不使用静态计数器,每次调用该中断函数时
//该计数器初值都是0,计数值就无法累加。
TL0=0xc0; //重装定时初值定时初值20ms
TH0=0x63;
T0_Cnt++;
if(T0_Cnt==50) //定时1000ms
{
T0_Cnt=0;
UpdateFlag=1; //更新温度标记有效
}
}
/***********************************************
函数名称:LM75_GetTemperature
功 能:LM75读取温度函数
入口参数:无
返 回 值:无
备 注:无
************************************************/
void LM75_GetTemperature(void)
{
unsigned char NegFlag=0; //负温度标记
unsigned int Temperature;
Temperature=LM75_ReadTemp();//读取温度
//最高位为0则为正温度,为1则为负温度
//正温度
if( (Temperature&0x8000) != 0x8000)
{
//低5位是无效数据,不用,去除。
Temperature=Temperature>>5;
}
//负温度
else
{
//取补码 参考数据手册中温度计算方式
Temperature=(((~Temperature)>>5)+0x01);
NegFlag=1;
}
//Temperature*5/4相当于Temperature*0.125*10
//Temperature*0.125,读出的温度数据*0.125转换成实际温度
//将温度数据扩大十倍,显示小数点后一位
Temperature=Temperature*5/4;
//不判断小数点后数据,故除以10
if( (Temperature/10)>TH)
{
AlarmPara=1; //高温报警
NoAlarmFlag=0;
}
else if ( (Temperature/10)<TL)
{
AlarmPara=2; //低温报警
NoAlarmFlag=0;
}
else
{
NoAlarmFlag=1;
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
#include "lm75.h"
#include <intrins.h>
/***********************************************
函数名称:Lm75_Delay_1us
功 能:STC 1T单片机us延时程序
入口参数:us:延时的微秒数
返 回 值:无
备 注:时钟24MHz
************************************************/
void LM75_Delay_1us(unsigned int us)
{
while( us--)
{
_nop_();
}
}
/***********************************************
函数名称:LM75_Start
功 能:LM75开始信号
入口参数:无
返 回 值:无
备 注:无
************************************************/
void LM75_Start(void)
{
LM75_SDA_SET(); //拉高数据线
LM75_SCL_SET(); //拉高时钟线
LM75_Delay_1us(10); //延时
LM75_SDA_CLR(); //产生下降沿
LM75_Delay_1us(10); //延时
}
/***********************************************
函数名称:LM75_Stop
功 能:LM75停止信号
入口参数:无
返 回 值:无
备 注:无
************************************************/
void LM75_Stop(void)
{
LM75_SDA_CLR(); //拉低数据线
LM75_SCL_SET(); //拉高时钟线
LM75_Delay_1us(10); //延时
LM75_SDA_SET(); //产生上升沿
LM75_Delay_1us(10); //延时
}
/***********************************************
函数名称:LM75_SendACK
功 能:单片机给LM75发送应答信号
入口参数:ack (0:ACK 1:NAK)
返 回 值:无
备 注:无
************************************************/
void LM75_SendACK(bit ack)
{
LM75_SDA_IN() = ack; //写应答信号
LM75_Delay_1us(10); //延时
LM75_SCL_SET(); //拉高时钟线
LM75_Delay_1us(10); //延时
LM75_SCL_CLR(); //拉低时钟线
LM75_Delay_1us(10); //延时
}
/***********************************************
函数名称:LM75_RecvACK
功 能:单片机从LM75接收应答信号
入口参数:无
返 回 值:bit (0:ACK 1:NAK)
备 注:无
************************************************/
bit LM75_RecvACK(void)
{
bit ack;
LM75_SCL_CLR(); //拉低时钟线
LM75_Delay_1us(10); //延时
LM75_SDA_SET(); //产生上升沿
LM75_SCL_SET(); //拉高时钟线
LM75_Delay_1us(10); //延时
ack = LM75_SDA_IN(); //读应答信号
LM75_Delay_1us(10); //延时
LM75_SCL_CLR(); //拉低时钟线
LM75_Delay_1us(10); //延时
return ack;
}
/***********************************************
函数名称:LM75_SendByte
功 能:向IIC总线发送一个字节数据
入口参数:dat:发送的数据
返 回 值:无
备 注:无
************************************************/
bit LM75_SendByte(unsigned char dat)
{
unsigned char i;
LM75_SDA_D_OUT(); // 设置SDA为输出方向
for (i=0; i<8; i++) //8位计数器
{
LM75_SCL_CLR(); //拉低时钟线
LM75_Delay_1us(10); //延时
if( (dat&0x80)==0x80 )//先发送高字节
{
LM75_SDA_SET();
}
else
{
LM75_SDA_CLR();
}
dat <<= 1; //移出数据的最高位
LM75_Delay_1us(10); //延时
LM75_SCL_SET(); //拉高时钟线
LM75_Delay_1us(10); //延时
}
LM75_SCL_CLR(); //拉低时钟线
LM75_Delay_1us(10); //延时
return LM75_RecvACK(); //接收应答
}
/***********************************************
函数名称:LM75_RecvByte
功 能:从IIC总线接收一个字节数据
入口参数:无
返 回 值:unsigned char:接收到得数据
备 注:无
************************************************/
unsigned char LM75_RecvByte(void)
{
unsigned char i;
unsigned char dat = 0;
LM75_SDA_D_IN(); //设置SDA为输入方向
LM75_SDA_SET(); //读之前先置高
for (i=0; i<8; i++) //8位计数器
{
LM75_SCL_CLR(); //拉低时钟线
LM75_Delay_1us(10); //延时
dat <<= 1;
LM75_SCL_SET(); //拉高时钟线
LM75_Delay_1us(10); //延时
dat |= LM75_SDA_IN(); //读数据
LM75_Delay_1us(10); //延时
}
LM75_SCL_CLR(); //拉低时钟线
LM75_Delay_1us(10); //延时
return dat;
}
/***********************************************
函数名称:LM75_Ready
功 能:查询LM75是否就绪
入口参数:无
返 回 值:bit (0:Ready 1:Busy)
备 注:无
************************************************/
bit LM75_Ready(void)
{
bit ack;
LM75_Start(); //开始
ack=LM75_SendByte(LM75_ADDR_WR); //发送设备地址+写信号,读取应答
return ack; //返回应答
}
/***********************************************
函数名称:LM75_writeReg
功 能:写LM75寄存器。
入口参数:add:寄存器地址。
dat:写入寄存器的值。
返 回 值:无
备 注:无
************************************************/
/*
void LM75_WriteReg(unsigned char add,unsigned char dat)
{
while(LM75_Ready()); //等待LM75就绪
LM75_Start(); //起始信号
LM75_SendByte(LM75_ADDR_WR);/发送设备地址+写信号
LM75_SendByte(add); //发送寄存器地址
LM75_SendByte(dat); //发送寄存器数据
LM75_Stop(); //停止信号
}
*/
/***********************************************
函数名称:LM75_ReadReg
功 能:读取LM75寄存器。
入口参数:add:寄存器地址。
返 回 值:unsigned char:返回的数值
备 注:无
************************************************/
/*
unsigned char LM75_ReadReg(unsigned char add)
{
unsigned char dat;
while(LM75_Ready()); //等待LM75就绪
LM75_Start(); //起始信号
LM75_SendByte(LM75_ADDR_WR);//发送设备地址+写信号
LM75_SendByte(add); //发送寄存器地址
LM75_Start(); //起始信号
LM75_SendByte(LM75_ADDR_RD);//发送设备地址+读信号
dat=LM75_RecvByte(); //接收数据
LM75_SendACK(NOACK); //最后一个数据需要NAK
LM75_Stop(); //停止信号
return dat;
}
*/
/***********************************************
函数名称:LM75_ReadTemp
功 能:从LM75读取温度信息。
入口参数:unsigned int:返回温度信息
返 回 值:无
备 注:无
************************************************/
unsigned int LM75_ReadTemp(void)
{
unsigned char tempH,tempL;
unsigned int Temper;
while(LM75_Ready()); //等待LM75就绪
LM75_Start(); //起始信号
LM75_SendByte(LM75_ADDR_WR);//发送设备地址+写信号
LM75_SendByte(LM75_TEMP); //发送温度寄存器地址
LM75_Start(); //起始信号
LM75_SendByte(LM75_ADDR_RD);//发送设备地址+读信号
tempH = LM75_RecvByte(); //先读出高字节
LM75_SendACK(ACK); //回应ACK
tempL = LM75_RecvByte(); //再读出低字节
LM75_SendACK(NOACK); //最后一个数据需要NAK
LM75_Stop(); //停止信号
Temper=tempH; //将高低位合并
Temper=Temper<<8 | tempL;
return Temper;
}
/***********************************************
函数名称:LM75_Reset
功 能:I2C总线复位操作
入口参数:无
返 回 值:无
备 注:发9个脉冲产生复位
************************************************/
void LM75_Reset(void)
{
unsigned char i;
LM75_SDA_SET(); //拉高数据线
for(i=0;i<9;i++)
{
LM75_SCL_CLR(); //拉低时钟线
LM75_Delay_1us(10); //延时
LM75_SCL_SET(); //拉高时钟线
LM75_Delay_1us(10); //延时
}
}
/***********************************************
函数名称:LM75_Init
功 能:LM75芯片初始化函数。
入口参数:无
返 回 值:无
备 注:无
************************************************/
void LM75_Init(void)
{
//将P32 P33 设置为开漏结构
P3_Mode_OUT_OD(PIN_2|PIN_3);
LM75_SCL_SET(); //拉高时钟线
LM75_SDA_SET(); //拉高数据线
LM75_Reset(); //器件复位
}
复制代码
所有资料51hei提供下载:
23_LM75温度报警LCD1602显示实验.rar
(108.91 KB, 下载次数: 65)
2018-4-27 14:35 上传
点击文件名下载附件
温度报警例程
下载积分: 黑币 -5
作者:
samdcn
时间:
2018-11-27 16:34
LM75比DS1802便宜太多,初试下
作者:
jrcsh
时间:
2019-2-10 04:20
代码完整不,还是要从附件下载
作者:
jrcsh
时间:
2019-2-11 16:03
STC8A8K 是带有i2C接口的,为什么不用带的接口, 是否I2C接口有问题
作者:
anubis577
时间:
2020-2-12 07:57
jrcsh 发表于 2019-2-11 16:03
STC8A8K 是带有i2C接口的,为什么不用带的接口, 是否I2C接口有问题
用过8A的I2C你就知道了
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1