亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標題:
單片機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.denmoz.com/bbs/)
Powered by Discuz! X3.1