久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4032|回復: 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, 下載次數: 65)


回復

使用道具 舉報

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接口有問題
回復

使用道具 舉報

ID:226798 發表于 2020-2-12 07:57 來自觸屏版 | 顯示全部樓層
jrcsh 發表于 2019-2-11 16:03
STC8A8K 是帶有i2C接口的,為什么不用帶的接口, 是否I2C接口有問題

用過8A的I2C你就知道了
回復

使用道具 舉報

6#
無效樓層,該帖已經被刪除
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本精品久久久久 | 国产一区二区三区在线免费观看 | 免费观看成人性生生活片 | 国产九一精品 | 亚洲精品成人 | 亚洲成人综合网站 | 亚洲精品国产综合区久久久久久久 | 日韩一区中文字幕 | 日韩精品成人 | 先锋资源网| 免费在线观看av的网站 | 能看的av网站 | 久久久久国产一区二区三区四区 | 男人的天堂久久 | 九九免费视频 | a网站在线观看 | 国内毛片毛片毛片毛片 | 欧美夜夜 | 久草视频在线播放 | 99tv| 毛片免费观看 | www亚洲免费国内精品 | 亚洲美女一区二区三区 | 亚洲视频在线看 | av喷水| 国产大片黄色 | 日韩高清在线观看 | 激情五月婷婷 | 波霸ol一区二区 | 羞羞网站在线免费观看 | 日韩欧美国产不卡 | 欧美一区二区三区在线观看视频 | 黄色网络在线观看 | 精品蜜桃一区二区三区 | 亚洲国产成人av好男人在线观看 | 日韩欧美精品在线 | av网站在线播放 | 国产一区免费 | 中文av字幕| 毛片av免费看 | 91精品国产麻豆 |