找回密码
 立即注册

QQ登录

只需一步,快速开始

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

DS18B20温度报警课程设计源码

[复制链接]
跳转到指定楼层
楼主
ID:318100 发表于 2018-5-1 11:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
课程设计——温度监控报警系统单片机源程序如下:
  1. #include "reg52.h"

  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define ulong unsigned long
  5.        
  6. //sbit Buzz = P3^2;
  7. sbit Buzz = P1^5;

  8. /*******************************************lcd1602.c函数声明************************************************/
  9. extern void InitLcd1602();                                          //lcd1602初始化函数
  10. extern void DisplayLimit(uchar x,uchar y,char dat);                //在坐标(x,y)显示温度上限或下限
  11. extern void InitMaxMin();                                         //进入温度报警值设置界面
  12. extern void Display_user(uchar x);                               //显示用户自定义的字符“↑”
  13. extern void LcdShowStr(uchar x,uchar y,uchar *str);
  14. extern void LcdShowDat(uchar x,uchar y,uchar num);
  15. extern void Display_laba();
  16. /*******************************************key.c函数声明****************************************************/
  17. extern void KeyDrive();
  18. extern void KeyScan();
  19. /****************************************ds18b20.c函数声明***************************************************/
  20. extern bit        RESET_DS18B20(void);
  21. extern uint Read_DS18B20_TEMP(void);
  22. /*****************************************main.c子函数声明***************************************************/
  23. void Timer1Init(uint ms);                                    //定时器1初始化函数
  24. void SetLimit();                                            //设置报警值函数
  25. void ControlBuzz();                                        //蜂鸣器控制函数
  26. void delay(uint z);
  27. /**********************************************变量定义******************************************************/
  28. extern uchar code buff[];
  29. uchar T1RH=1;                                           //定时器初值
  30. uchar T1RL=1;                                             
  31. bit flagBuzz=0;                                       //蜂鸣器开关标志
  32. bit EBuzz=0;                                         //蜂鸣器使能标志
  33. char High=20;                                       //温度上限  超过限度蜂鸣器开
  34. char Low=10;                                       //温度下限
  35. uchar mode=0;                                     //模式变量
  36. uchar cnt=0;                                     //ESC按键 变量
  37. uchar tflag;                                    //温度正负标志位
  38. /*************************************主函数***************************************/
  39. void main()
  40. {
  41.         EA=1;                                            //开启总中断
  42.         Timer1Init(1);                                   //初始化定时器1
  43.         RESET_DS18B20();                                 //复位18B20
  44.         delay(20);
  45.   InitLcd1602();                                   //初始化lcd1602
  46.         while(1)
  47.         {
  48.                 LcdShowDat(10,1,buff[Read_DS18B20_TEMP()/100]);           //显示温度值十位
  49.                 LcdShowDat(11,1,buff[Read_DS18B20_TEMP()/10%10]);         //显示温度值个位
  50.                 LcdShowStr(12,1,".");                                     //显示小数点
  51.                 LcdShowDat(13,1,buff[Read_DS18B20_TEMP()%10]);            //显示小数位
  52.                 KeyDrive();                                    //按键驱动
  53.                 SetLimit();                                    //设置报警值
  54.         }
  55. }

  56. /**********************************按键动作函数************************************/
  57. void KeyDown(uchar keycode)
  58. {
  59.         if(keycode==0x0D)                                        //回车键:进入模式设置
  60.         {
  61.                 mode++;
  62.                 if(mode>2)mode=0;
  63.         }
  64.         else if(keycode==0x26)                                   //向上键:模式1 上限值+1   模式2 下限值+1
  65.         {
  66.                 if(mode==1)
  67.                 {
  68.                         High++;
  69.                         if(High>99)High=99;
  70.                 }
  71.                 else if(mode==2)
  72.                 {
  73.                         Low++;
  74.                         if(Low==High)Low=High-1;
  75.                 }
  76.         }
  77.         else if(keycode==0x28)                                   //向下键:模式1 上限值-1   模式2 下限值-1
  78.         {
  79.                 if(mode==1)
  80.                 {
  81.                         High--;
  82.                         if(High==Low)High=Low+1;
  83.                 }
  84.                 else if(mode==2)
  85.                 {
  86.                         Low--;
  87.                         if(Low<0)Low=0;
  88.                 }
  89.         }
  90.         else if(keycode==0x1B)                                   //Esc键:开关蜂鸣器报警
  91.         {
  92.                 if(mode==0)
  93.                 {
  94.                         cnt++;
  95.                   if(cnt>1)cnt=0;
  96.                   if(cnt==1)                                          //蜂鸣器使能开启 显示喇叭图像
  97.                   {
  98.                            EBuzz=1;
  99.                                  Display_laba();
  100.                   }
  101.                   else if(cnt==0)                                     //蜂鸣器使能关闭 不显示喇叭
  102.                   {
  103.                            EBuzz=0;
  104.                                 LcdShowStr(7,0,"  ");
  105.                   }
  106.           }
  107.   }
  108. }

  109. /************************************报警值设置函数*********************************/
  110. void SetLimit()
  111. {
  112.                 if(mode==0);                                             //模式0 正常显示 调用蜂鸣器控制函数
  113.                 {
  114.                         ControlBuzz();
  115.                 }
  116.                
  117.                 if(mode!=0)                                              //模式1 调整温度上限
  118.                 {                                                        //模式2 调整温度下限
  119.                         EBuzz=0;
  120.                         InitMaxMin();
  121.                         while(mode!=0)
  122.                         {
  123.                                 KeyDrive();
  124.                                 if(mode==1)
  125.                                 {
  126.                                         Display_user(3);                                   //显示自定义的 箭头 图像 指向温度上限
  127.                                         DisplayLimit(2,0,High);                            //显示 温度报警值上下限
  128.                 DisplayLimit(12,0,Low);
  129.                                 }
  130.                                 else if(mode==2)
  131.                                 {
  132.                                         Display_user(13);                                  //显示自定义的 箭头 图像 指向温度下限
  133.                                         LcdShowStr(3,1," ");
  134.                                         DisplayLimit(2,0,High);
  135.                 DisplayLimit(12,0,Low);
  136.                                 }
  137.                         }
  138.                         InitLcd1602();
  139.                 }
  140. }

  141. /************************************蜂鸣器控制函数************************************/
  142. void ControlBuzz()
  143. {
  144.         if((Read_DS18B20_TEMP()>=(10*High))||(Read_DS18B20_TEMP()<=(10*Low)))
  145.                 flagBuzz=1;
  146.         else
  147.                 flagBuzz=0;
  148.         if((flagBuzz==1)&&(EBuzz==1))
  149.         {
  150.                 Buzz=~Buzz;
  151.         }
  152. }

  153. void delay(uint z)
  154. {
  155.         uint x,y;
  156.         for(x=z;x>0;x--)               
  157.                 for(y=115;y>0;y--);
  158. }

  159. /**********定时器1初始化函数***********/
  160. void Timer1Init(uint ms)
  161. {
  162.         ulong tmp;                                               //16位长整型变量tmp
  163.         tmp=12000000/12;                                         //用晶振频率除以12得到定时器计数频率
  164.         tmp=(tmp*ms)/1000;                                       //计算出需要多少个机器周期
  165.         tmp=65536-tmp;                                           //定时器的重载值
  166.         tmp=tmp+28;                                              //补偿中断延时响应造成的误差
  167.         T1RH=(uchar)(tmp>>8);                                    //将tmp高8位右移8位 赋值给T1RH
  168.         T1RL=(uchar)tmp;                                         //将tmp低8位赋值给T0RL
  169.         TMOD&=0x0F;                                              //清零T1控制位
  170.         TMOD|=0x10;                                              //选择模式1
  171.         TH1=T1RH;
  172.         TL1=T1RL;
  173.         ET1=1;
  174.         TR1=1;
  175. }

  176. /**********定时器1中断函数**********/
  177. /*******1毫秒扫描一次独立按键*******/
  178. void InterruptTimer1() interrupt 3
  179. {
  180. ……………………

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

所有资料51hei提供下载:
11.DS18B20温度报警.rar (68.75 KB, 下载次数: 21)


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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