找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于DS18B20的体温监测声光报警装置源程序Proteus仿真

[复制链接]
跳转到指定楼层
楼主
(1)本装置为基于51单片机的温度检测报警装置(C语言),调节范围(-55℃~+128℃)
(2)手动调节DS18B20温度大小,此时L1602液晶显示器同步显示温度值(℃)保留小数点后一位。
(3)当前温值大于等于37.3℃,红灯亮起,蜂鸣器开始发声报警,低于37.3℃绿灯常亮。
(4)当检测温度为负值或超出100℃,则判定为装置出现故障,黄灯亮起。
(5)当装置判定为故障时,需重启装置后再去检测,装置通电时会有“BI~”的一声提示



仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include<reg52.h>
  2. #define uchar  unsigned char
  3. #define uint   unsigned int
  4. #define DataPort P0

  5. sbit D0 = P1^0;
  6. sbit D1 = P1^1;
  7. sbit D2 = P1^2;
  8. sbit DQ = P1^3;                                    //DS18B20 端口  
  9. sbit D4 = P1^4;      
  10. sbit LCD_RS=P2^0;                                //液晶屏RS口  写指令低,写数据高
  11. sbit LCD_EN=P2^1;                                //液晶屏EN口  高脉冲使能 写指令/数据,低跳变执行

  12. uchar TempData[7];                          //温度存储显示值
  13. bit ReadTempFlag;                          //读时间标志

  14. void WriteOneChar(uchar dat);             //写入DS18B20一个字节
  15. uchar ReadOneChar(void);                 //读取DS18B20一个字节
  16. uint ReadTemperature(void);             //读取DS18B20温度值
  17. bit Init_DS18B20(void);                //初始化DS18B20
  18. void Time0(void);                     //定时器初始化
  19. void Delay2us(uchar t);             //2微秒延时函数
  20. void Delay1ms(uchar t);              //1毫秒延时函数
  21. void LCDinit();                                           //设置显示模式
  22. void write_com(uchar com);                  //液晶写指令程序
  23. void write_date(uchar date);         //液晶写数据程序
  24. void delay100us(uint x);             //100us延时程序

  25. void main()
  26. {                  
  27.         uchar i;
  28.         uint temp;
  29.         long tempM;
  30.         bit negative;              //负数标志
  31.         uchar TempH,TempL,TempK;
  32.         Time0();                          //定时器初始化
  33.         LCDinit();                                //设置显示模式
  34.         while(1)         
  35.         {
  36.                 if(ReadTempFlag==1)      //定时标志
  37.                 {
  38.                         ReadTempFlag=0;
  39.                         temp=ReadTemperature();//读取温度
  40.                         if(temp&0x8000)
  41.                         {            
  42.                                 negative=1;                //负号标志
  43.                                 temp=~temp;                //取反加1
  44.                                 temp +=1;
  45.                                                         
  46.                         }
  47.                         else negative=0;        //正数

  48.                         tempM=temp*0.0625*100;        //换算为10进制温度值再放大100倍        12位精度直接乘0.625
  49.                         TempH=tempM/100;             //取整数      
  50.                         TempL=tempM%100;            //取小数
  51.                         TempL=(TempL+TempL)/2+0.5;// 小数取两次平均值加四舍五入更为精确
  52.                         TempK=TempL;                          //准确的小数部分

  53.                         if(negative==1)
  54.                                 TempData[0]='-';//显示负号
  55.                         else if(TempH/100==0)     //温度值为两位数
  56.                                 TempData[0]=' ';  //百位消隐不显示
  57.                         else
  58.                                 TempData[0]=TempH/100+'0';  //显示百位温度
  59.       
  60.                         if((TempH/100==0)&&((TempH%100)/10==0))                //温度值为一位数
  61.                                 TempData[1]=' ';                   //十位消隐不显示
  62.                         else
  63.                         TempData[1]=(TempH%100)/10+'0';                //显示十位温度
  64.                         TempData[2]=(TempH%100)%10+'0';               //显示个位温度
  65.                         TempData[3]='.';                             //显示小数点
  66.                         TempData[4]=TempL/10+'0';                   //显示温度小数1位
  67.                                                 TempData[5]='^';                                             
  68.                         TempData[6]='C';                           // 5,6用来表示摄氏度℃
  69.                                                 if(TempData[0]=='-' || TempData[0]=='1')
  70.                                                 {
  71.                                                     D4 = 0;
  72.                                                 }
  73.                                                 if        ( TempData[1]>='3')
  74.                                                 {  
  75.                                                      if(TempData[2]>= '7')
  76.                                                       {
  77.                                                            if(TempData[2]== '8' ||TempData[4]>= '3'||TempData[2]== '9')
  78.                                                       {
  79.                                                            
  80.                                                            D1 = ~D1;
  81.                                                        D0 = 1;
  82.                                                            D2 = 1; }
  83.                                                           else if(TempData[1]>= '4')  //(67.0)
  84.                                                         {
  85.                                                           D1 = ~D1;
  86.                                                       D0 = 1;
  87.                                                           D2 = 1;}
  88.                                                           else {D1 = 1;  D0 = 0; D2 = 0;}
  89.                                                          }
  90.                                                else if(TempData[1]>= '4')
  91.                                                         { D1 = ~D1;
  92.                                                       D0 = 1;
  93.                                                           D2 = 1;}
  94.                                                         else {D1 = 1;  D0 = 0;D2 = 0;        }
  95.                                                 }         
  96.                                                 else {D1 = 1;  D0 = 0;D2 = 0;        }
  97.                         write_com(0x80);                          //数据指针第一行起始0x80位置,左侧第一个值开始
  98.                         for(i=0;i<7;i++)                          //每循环一次写一个字节数据
  99.                         {
  100.                                 write_date(TempData[i]);        //写一个字节数据               
  101.                         }
  102.                 }
  103.         }
  104. }

  105. /*------------------------------------------------
  106.             定时器初始化子程序
  107. ------------------------------------------------*/
  108. void Time0(void)
  109. {
  110.          TMOD = 0x01;          //使用模式1,16位定时器                  
  111.          TH0=(65536-5000)/256;              //给定初值,定时5ms
  112.          TL0=(65536-5000)%256;
  113.          EA=1;               //总中断打开
  114.          ET0=1;             //定时器中断打开
  115.          TR0=1;            //定时器T0开关打开
  116. }
  117. /*------------------------------------------------
  118.                  定时器中断子程序
  119. ------------------------------------------------*/
  120. void Time0r(void) interrupt 1
  121. {
  122.         static uint num;             //局部变量定义
  123.         TH0=(65536-5000)/256;        //重新赋值 5ms
  124.         TL0=(65536-5000)%256;
  125.         num++;
  126.         if(num>=25)        
  127.         {
  128.                 num = 0;
  129.                 ReadTempFlag=1;  //读标志位置1
  130.         }
  131. }


  132. void Delay2us(uchar t)
  133. {   
  134.         while(--t);
  135. }

  136. void Delay1ms(uchar t)
  137. {
  138.         while(t--)
  139.         {
  140.                 //大致延时1mS
  141.                 Delay2us(245);
  142.                 Delay2us(245);
  143.         }
  144. }
  145. /*------------------------------------------------
  146.                     18b20初始化
  147. ------------------------------------------------*/
  148. bit Init_DS18B20(void)
  149. {
  150.         bit dat=0;
  151.         DQ = 1;    //DQ复位
  152.         Delay2us(5);   //稍做延时
  153.         DQ = 0;         //单片机将DQ拉低
  154.         Delay2us(200); //精确延时 大于 480us 小于960us
  155.         Delay2us(200);
  156.         DQ = 1;        //拉高总线
  157.         Delay2us(50); //15~60us 后 接收60-240us的存在脉冲
  158.         dat=DQ;        //如果x=0则初始化成功, x=1则初始化失败
  159.         Delay2us(25); //稍作延时返回
  160.         return dat;
  161. }

  162. /*------------------------------------------------
  163.                     读取一个字节
  164. ------------------------------------------------*/
  165. uchar ReadOneChar(void)
  166. {
  167.         uchar i=0;
  168.         uchar dat = 0;
  169.         for (i=8;i>0;i--)
  170.         {
  171.                 DQ = 0; // 给脉冲信号
  172.                 dat>>=1;
  173.                 DQ = 1; // 给脉冲信号
  174.                 if(DQ)
  175.                 dat|=0x80;
  176.                 Delay2us(25);
  177.         }
  178.         return(dat);
  179. }
  180. /*------------------------------------------------
  181.                     写入一个字节
  182. ------------------------------------------------*/
  183. void WriteOneChar(uchar dat)
  184. {
  185.         uchar i=0;
  186.         for(i=8; i>0; i--)
  187.         {
  188.                 DQ = 0;
  189.                 DQ = dat&0x01;
  190.                 Delay2us(25);
  191.                 DQ = 1;
  192.                 dat>>=1;
  193.         }
  194.         Delay2us(25);
  195. }

  196. /*------------------------------------------------
  197.                     读取温度
  198. ------------------------------------------------*/
  199. uint ReadTemperature(void)
  200. {
  201.         uchar a=0;
  202.         uint b=0;
  203.         uint t=0;
  204.         Init_DS18B20();
  205.         WriteOneChar(0xCC); // 跳过读序号列号的操作
  206.         WriteOneChar(0x44); // 启动温度转换         44H开启温度转换
  207.         Delay1ms(10);
  208.         Init_DS18B20();
  209.         WriteOneChar(0xCC); //跳过读序号列号的操作
  210.         WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
  211.         a=ReadOneChar();   //低位
  212.         b=ReadOneChar();   //高位
  213.         b<<=8;
  214.         t=a+b;
  215.         return(t);
  216. }
  217. /*******100us延时程序********/

  218. void delay100us(uint x)
  219. {
  220.         uint a,b;
  221.         for(a=x;a>0;a--)
  222.                 for(b=10;b>0;b--);
  223. }
  224. /*******液晶写指令程序********/
  225. void write_com(uchar com)
  226. {
  227.         LCD_EN=0;        //初始设置LCD_EN低电平
  228.         LCD_RS=0;        //允许写指令
  229.         P0=com;                //传递指令
  230.         delay100us(10);        //延时1ms
  231.         LCD_EN=1;        //使能写入
  232.         delay100us(10);        //延时1ms
  233.         LCD_EN=0;        //低跳变执行
  234.       
  235. }
  236. /*******液晶写数据程序********/
  237. void write_date(uchar date)
  238. {
  239.         LCD_RS=1;             //允许写数据
  240.         P0 =date;            //传递数据
  241.         delay100us(10);        //延时1ms
  242.         LCD_EN=1;           //使能写入
  243.         delay100us(10);        //延时1ms
  244.         LCD_EN=0;           //低跳变执行
  245.       
  246. }
  247. /*******液晶初始化程序********/
  248. void LCDinit()                //设置显示模式、
  249. {
  250.         write_com(0x38);//设置16*2显示,5*7点阵,8位数据接口
  251.         write_com(0x01);//显示清零,数据指针清零
  252.         write_com(0x0c);//设置开显示,不显光标
  253.         write_com(0x06);//设置写一个字符后地址指针加1
  254.         write_com(0x80);//数据指针初始化,设置显示初始位置
  255. }
复制代码

所有资料51hei提供下载:
基于 DS18B20 的体温监测声光报警装置.zip (316.51 KB, 下载次数: 65)

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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