找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机+1602+DS18B20的温度报警程序+实物设计(按键可调温度阈值)

[复制链接]
跳转到指定楼层
楼主
新人报道,发个帖报道一波
51单片机做的温度显示,温度显示在LCD1602液晶屏上。
然后按键可以调整温度阈值,温度高于或低于所设温度,蜂鸣器就会响……
第一次做的成品,就发出来纪念一下吧,代码写得有点菜,有需要的拿去……












单片机源程序如下:
  1. /**************************************************************************************

  2. *                              基于单片机的实时温度报警系统设计                                                                                                  *

  3.     (1)DS18b20采集到的温度可以实时地在数码管或者在液晶上显示出来;
  4.     (2)用三个独立键盘设置阀值,包括设置键,加键,减键和确认键;
  5.     (3)按下设置键时,数码管或者液晶上显示2S“H”字,随后温度闪烁显示,进入设置阀值最大值状态;
  6.          再次按下设置键,数码管或者液晶上显示2S“L”字,随后温度闪烁显示,进入设置阀值最小值状态,
  7.          第三次按下设置键(此时相当于确认键),系统保存设置好的阀值并进入正常的温度显示状态;
  8.                     (此程序功能与第三点有出入)
  9.     (4)当采集到的温度大于阀值最大值或者小于阀值最小值时蜂鸣器发出声音报警。
  10.          
  11.          注释:k1:温度加   k2:温度减   k3:低温度阈值设置   k4:高温度阈值设置

  12.         适用单片机:STC89C52RC      适用开发板:普中科技  CH—6800ES V2.0    晶振:12MHZ
  13.                                                                                                                                                                   
  14. ***************************************************************************************/

  15. #include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器
  16. #include "lcd.h"
  17. #include "temp.h"
  18. #include "intrins.h"
  19. #include "key.h"

  20. typedef unsigned int u16;          //对数据类型进行声明定义
  21. typedef unsigned char u8;

  22. u8 Disp[]=  "Temp:           ";
  23. u8 Disp2[]= "Xiaoliyu Design ";

  24. extern unsigned int LTemp;        //低阈值温度
  25. extern unsigned int LLTemp;
  26. unsigned int DTemp;               //高阈值温度
  27. unsigned int DLTemp;

  28. u16 NowTemp=35;                   //当前温度
  29. u16 IntFlag1=0;                   //外部中断1标志位
  30. u16 IntFlag0=0;                   //外部中断0标志位

  31. sbit Beep=P1^5;                   //设置蜂鸣器引脚
  32. sbit LA=P2^2;
  33. sbit LB=P2^3;
  34. sbit LC=P2^4;

  35. void delay10us(void);
  36. void delay100us(void);
  37. void delay10ms(void);
  38. void delay1s(void);
  39. void Int1Init();
  40. void Int0Init();
  41. void Timer0Init();

  42. /*******************************************************************************
  43. * 函 数 名         : main
  44. * 函数功能                     : 主函数
  45. * 输    入         : 无
  46. * 输    出         : 无
  47. *******************************************************************************/
  48. void main(void)
  49. {
  50.          u8 i;
  51.          Int1Init();                   //外部中断1初始化
  52.          Int0Init();                   //外部中断0初始化
  53.          LcdInit();                    //LCD1602初始化
  54.    Timer0Init();                       //定时器0初始化
  55.         
  56.          LA =1;
  57.          LB =0;
  58.          LC =0;
  59.         
  60. ////////////////////////////////////////////////////////////////////////////////
  61.         
  62.            for(i=0;i<16;i++)           //初始化LCD屏(第一行)
  63.            {
  64.                    LcdWriteData(Disp[i]);        
  65.            }
  66.                  
  67.             delay100us();
  68.             LcdWriteCom(0xC0);                //初始化LCD屏(第二行)
  69.                  
  70.             for(i=0;i<16;i++)
  71.            {
  72.                    LcdWriteData(Disp2[i]);        
  73.            }

  74.     /////////////////////////////////////////////////////////////////////
  75.                  
  76.                 while(1)
  77.           {

  78.                           LcdWriteCom(0x85);
  79.                     datapros(Ds18b20ReadTemp());                    //获取DS18B20温度
  80.                      for(i=0;i<11;i++)                        //温度信息写入1602
  81.                {
  82.                         LcdWriteData(DisplayData[i]);        
  83.                }        

  84.                
  85.         if(IntFlag1==1)                           //若外部中断1标志位为1,则进入高温度阈值设置界面
  86.              {                 
  87.                 LcdMenu();
  88.                             if(IntFlag1==0)                         //若外部中断1标志位为0,则退出高温度阈值设置界面
  89.                             {                                       //重载温度显示页面参数
  90.                                     LcdInit();        
  91.                   for(i=0;i<16;i++)                    
  92.                    {
  93.                           LcdWriteData(Disp[i]);        
  94.                    }
  95.                    delay100us();
  96.                  
  97.                   LcdWriteCom(0xC0);
  98.                   for(i=0;i<16;i++)
  99.                    {
  100.                           LcdWriteData(Disp2[i]);        
  101.                    }
  102.                                                 
  103.                              }                                
  104.          delay10ms();                 
  105.                         
  106.               }
  107.                  
  108.                  
  109.                     if(IntFlag0==1)                           //若外部中断0标志位为1,则进入低温度阈值设置界面
  110.               {
  111.                         
  112.                  LcdMenuL();
  113.                              if(IntFlag0==0)                        //若外部中断0标志位为0,则退出低温度阈值设置界面
  114.                              {                                      //重载温度显示页面参数
  115.                                      LcdInit();        
  116.                    for(i=0;i<16;i++)
  117.                    {
  118.                           LcdWriteData(Disp[i]);        
  119.                    }
  120.                    delay100us();
  121.                  
  122.                    LcdWriteCom(0xC0);
  123.                    for(i=0;i<16;i++)
  124.                    {
  125.                          LcdWriteData(Disp2[i]);        
  126.                    }
  127.                                                 
  128.                              }
  129.            delay10ms();                                          
  130.               }
  131.                  
  132.                  
  133.                      NowTemp=dataReturn(Ds18b20ReadTemp());     //获取当前温度
  134.                      DTemp=(LTemp/100);                         //获取高温度阈值
  135.                      DLTemp=(LLTemp/100);                       //获取低温度阈值
  136.                                 
  137.                      if((NowTemp>=DTemp)|(NowTemp<=DLTemp))    //如果当前温度大于高温度阈值或小于低温度阈值,则打开定时器0启动蜂鸣器
  138.                      {
  139.                              ET0=1;                                  //打开定时器0中断允许
  140.                              led=~led;                        
  141.            delay10us();                        
  142.                       }
  143.                      else
  144.                      {
  145.                              ET0=0;                                  //关闭定时器0中断允许
  146.                              delay10us();
  147.                      }

  148.            }
  149.                
  150. ////////////////////////////////////////////////////////////////////////////////
  151.                
  152. }        

  153. /*******************************************************************************
  154. * 函 数 名         : delay10ms
  155. * 函数功能                     : 延时函数10ms
  156. * 输    入         : 无
  157. * 输    出         : 无
  158. *******************************************************************************/

  159. void delay10ms(void)   
  160. {
  161.     unsigned char a,b,c;
  162.     for(c=1;c>0;c--)
  163.         for(b=38;b>0;b--)
  164.             for(a=130;a>0;a--);
  165. }

  166. /*******************************************************************************
  167. * 函 数 名         : delay100us
  168. * 函数功能                     : 延时函数100us
  169. * 输    入         : 无
  170. * 输    出         : 无
  171. *******************************************************************************/

  172. void delay100us(void)   
  173. {
  174.     unsigned char a,b;
  175. for(b=1;b>0;b--)
  176.         for(a=47;a>0;a--);
  177. }

  178. /*******************************************************************************
  179. * 函 数 名         : delay10us
  180. * 函数功能                     : 延时函数10us
  181. * 输    入         : 无
  182. * 输    出         : 无
  183. *******************************************************************************/

  184. void delay10us(void)   
  185. {
  186.     unsigned char a,b;
  187.     for(b=1;b>0;b--)
  188.         for(a=2;a>0;a--);
  189. }

  190. /*******************************************************************************
  191. * 函 数 名         : Int1Init
  192. * 函数功能                     : 延时函数10us
  193. * 输    入         : 无
  194. * 输    出         : 无
  195. *******************************************************************************/

  196. void Int1Init()
  197. {
  198.         //设置INT1
  199.         IT1=1;//跳变沿出发方式(下降沿)
  200.         EX1=1;//打开INT1的中断允许。        
  201.         EA=1;//打开总中断        
  202. }

  203. /*******************************************************************************
  204. * 函 数 名         : Int0Init
  205. * 函数功能                     : 延时函数10us
  206. * 输    入         : 无
  207. * 输    出         : 无
  208. *******************************************************************************/

  209. void Int0Init()
  210. {
  211.          //设置INT1
  212.         IT0=1;      //跳变沿出发方式(下降沿)
  213.         EX0=1;      //打开INT0的中断允许。        
  214.         EA=1;       //打开总中断        
  215. }

  216. /*******************************************************************************
  217. * 函 数 名         : Timer0Init
  218. * 函数功能                     : 定时器0初始化
  219. * 输    入         : 无
  220. * 输    出         : 无
  221. *******************************************************************************/
  222. void Timer0Init()
  223. {
  224.         TMOD|=0X01;   //选择为定时器0模式,工作方式1,仅用TR0打开启动。

  225.         TH0=0XFA;            //给定时器赋初值,定时1ms
  226.         TL0=0X24;        
  227.         ET0=1;        //打开定时器0中断允许
  228.         EA=1;         //打开总中断
  229.         TR0=1;        //打开定时器                        
  230. }

  231. /*******************************************************************************
  232. * 函 数 名         : Int0
  233. * 函数功能                     : 外部中断0
  234. * 输    入         : 无
  235. * 输    出         : 无
  236. *******************************************************************************/

  237. void Int0()        interrupt 0               
  238. {
  239.         delay10ms();                          //延时消抖
  240.         if(k3==0)                       //K3按下时设置外部中断0标志位为1,再按一次设置为0   
  241.         {
  242.                
  243.                 if(IntFlag0==0)
  244.                 IntFlag0=1;
  245.                 else
  246.                 IntFlag0=0;               
  247.                 led=~led;
  248.                                 
  249.         }
  250.         
  251. }

  252. /*******************************************************************************
  253. * 函 数 名         : Int1
  254. ……………………

  255. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
51+1602+DS18B20.zip (78.87 KB, 下载次数: 237)


评分

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

查看全部评分

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

使用道具 举报

沙发
Azhang1. 发表于 2019-5-17 08:09 | 只看该作者
连线怎么连
回复

使用道具 举报

板凳
Strongest丶星空 发表于 2019-5-17 19:04 | 只看该作者
。。。
我发表了几千行的代码都能显示出来
回复

使用道具 举报

地板
wgz0327 发表于 2019-6-18 16:31 | 只看该作者
编译不出来
回复

使用道具 举报

5#
zeepok 发表于 2020-5-24 12:18 | 只看该作者
编译不成功呀,求解
回复

使用道具 举报

6#
niunilin 发表于 2020-10-16 16:20 | 只看该作者
为什么编译失败嘞
回复

使用道具 举报

7#
niunilin 发表于 2020-10-16 16:21 | 只看该作者
什么地方有问题嘞
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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