找回密码
 立即注册

QQ登录

只需一步,快速开始

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

用1602LCD与DS18B20的温度报警器的仿真+单片机代码设计

[复制链接]
跳转到指定楼层
楼主
用1602LCD与DS18B20设计的温度报警器仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include <reg51.h>//头文件,52单片机改为52
  2. #include <intrins.h>

  3. #define LCD_DATA P0
  4. sbit LCD_RS = P2^0;
  5. sbit LCD_RW = P2^1;
  6. sbit LCD_EN = P2^2;
  7. unsigned char dispBuff0[16]={'T','E','M',
  8. 'P',':',' ',' ',' ',' ',' ',' ','C',' ',' ',' ',};//LCD第一行显示
  9. unsigned char dispBuff1[16]={'D','E','N',
  10. 'S',':',' ',' ','%',' ',' ',' ',' ',' ',' ',' ',};//LCD第二行显示

  11. sbit DQ=P2^3;  //DS18B20数据端
  12. unsigned int temperature=0;//温度
  13. unsigned char fuhao=0;//温度的正负符号

  14. //AD0809的IO口以及变量定义
  15. sbit OE=P2^7;
  16. //sbit ALE=P3^0;
  17. sbit EOC=P2^6;
  18. sbit START=P3^0;
  19. unsigned char density=0;//浓度

  20. //LED报警指示的IO口以及变量定义
  21. sbit LED1=P2^4;//温度报警指示
  22. sbit LED2=P2^5;//浓度报警指示
  23. #define off  1                   //高电平时灯为关闭状态
  24. #define on 0                   //低电平时灯为开启状态

  25. sbit speaker=P3^1;//蜂鸣器


  26. void    Delay20ms() ;
  27. void         LCD_WriteDat(unsigned char lcd_dat);
  28. void         LCD_WriteCmd(unsigned char lcd_cmd);
  29. unsigned char         LCD_ReadStatus(void);
  30. void         LCD_Goto(unsigned char x,unsigned char y);
  31. void    LCD_Display(unsigned char row,unsigned char *str);

  32. void delay(unsigned int x)//延时公用程序
  33. {
  34. unsigned char j;
  35. while(x--)
  36.     {
  37.     for(j=0;j<125;j++);
  38.     }
  39. }

  40. /*1、LCD模块子函数*/

  41.   void         LCD_Init(void)
  42. {
  43.         Delay20ms();
  44.         /*************************************************
  45.          功能设置:        DB5=1;DB6...=0;
  46.                                                          DB4=1:8位接口; 0:4位接口;
  47.                                                          DB3=1:双行显示;0:单行显示;
  48.                                                          DB3=1:5×10点阵;0:5×7点阵;               
  49.         *************************************************/
  50.   LCD_WriteCmd(0x38);        //8位机接口、双行显示、5×7字符点阵;
  51.         /*************************************************
  52.           显示控制:DB3=1;DB4...=0;
  53.                                                   DB2=1:开启显示;0:关闭LCD显示;
  54.                                                   DB1=1:显示光标;0:光标隐藏;
  55.                                                   DB0=1:光标闪烁;0:光标闪烁关闭;
  56.         *************************************************/
  57.         LCD_WriteCmd(0x0c);        //显示开启、光标不显示也不闪烁;
  58.         /*************************************************
  59.           清屏指令:DB0=1;DB1...=0;
  60.         *************************************************/
  61.         LCD_WriteCmd(0x01);        //清屏;
  62.         /****************************************************************
  63.           访问模式:DB2=1;DB3...=0;
  64.                                                   DB1=1:对内部Ram读写后AC自增,否则自减;
  65.                                                   DB0=1:与DB1设置有关,对DD RAM写时同时整屏移动1位;
  66.         *****************************************************************/
  67.         LCD_WriteCmd(0x06);        //光标右移一位、整屏不移动;
  68.   
  69.   LCD_Goto(0,0);
  70.         }
  71. void         LCD_WriteDat(unsigned char lcd_dat)
  72. {
  73.         unsigned char tmp;
  74.         tmp = LCD_ReadStatus();                //读状态;
  75.         while((tmp & 0x80))                        //是否忙 ?
  76.                 {
  77.                         tmp = LCD_ReadStatus();
  78.                         }
  79.         
  80.         LCD_RS = 1;
  81.         LCD_RW = 0;
  82.         LCD_DATA = lcd_dat;
  83.         _nop_();
  84.         LCD_EN = 0;
  85.         _nop_();
  86.         _nop_();
  87.         LCD_EN = 1;
  88.         
  89.         }
  90. void         LCD_WriteCmd(unsigned char lcd_cmd)
  91. {
  92.         unsigned char tmp;
  93.         tmp = LCD_ReadStatus();
  94.         while((tmp & 0x80))
  95.         {
  96.                 tmp = LCD_ReadStatus();
  97.                 }
  98.         
  99.         LCD_RS = 0;
  100.         LCD_RW = 0;
  101.         LCD_DATA = lcd_cmd;
  102.         _nop_();
  103.         LCD_EN = 0;
  104.         _nop_();
  105.         _nop_();
  106.         LCD_EN = 1;
  107.         }
  108. unsigned char         LCD_ReadStatus(void)
  109. {
  110.         unsigned char tmp;
  111.         #if 0
  112.         LCD_RS = 0;
  113.         LCD_RW = 1;
  114.         LCD_EN = 1;
  115.         tmp = LCD_DATA;
  116.         LCD_EN = 0;
  117.         #endif
  118.         LCD_DATA = 0xff;
  119.         LCD_RS = 0;
  120.         LCD_RW = 1;
  121.         LCD_EN = 0;
  122.         _nop_();
  123.         _nop_();
  124.         LCD_EN = 1;
  125.         tmp = LCD_DATA;
  126.         return tmp;
  127.         }
  128. void         LCD_Goto(unsigned char x,unsigned char y)
  129. {
  130.         unsigned char tmp;
  131.         if(y)                                //若是第二行;
  132.                 {
  133.                         tmp = 0xc0 + x;
  134.                         LCD_WriteCmd(tmp);
  135.                         }
  136.         else
  137.                 {
  138.                         tmp = 0x80 + x;
  139.                         LCD_WriteCmd(tmp);
  140.                         }               
  141.         }


  142.         
  143. void LCD_Display(unsigned char row,unsigned char *str)
  144. {
  145.         if(row)
  146.                 {
  147.                         LCD_Goto(0,1);
  148.                         }
  149.   else
  150.           {
  151.                   LCD_Goto(0,0);
  152.                   }
  153.   while(*str != '\0')
  154.   {
  155.           LCD_WriteDat(*str++);
  156.           }
  157.         }


  158. void Delay20ms()   //粗略延时;
  159. {
  160.   unsigned int tmp = 50000;
  161.   while(tmp--);
  162.   }        



  163. /*2、DS18B2模块*/


  164. void delay_18B20(unsigned int i)
  165. {
  166. while(i--);
  167. }
  168. /**********ds18b20初始化函数**********************/
  169. void Init_DS18B20(void)
  170. {
  171. unsigned char x=0;
  172. DQ = 1;          //DQ复位
  173. delay_18B20(2); //稍做延时
  174. DQ = 0;          //单片机将DQ拉低
  175. delay_18B20(60); //精确延时 大于 480us
  176. DQ = 1;          //拉高总线
  177. delay_18B20(2);
  178. x=DQ;            //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
  179. delay_18B20(15);
  180. }
  181. /***********ds18b20读一个字节**************/
  182. unsigned char ReadOneChar(void)
  183. {
  184. unsigned char i=0;
  185. unsigned char dat = 0;
  186. for (i=8;i>0;i--)
  187. {
  188.     DQ = 0; // 给脉冲信号
  189.     dat>>=1;
  190.     DQ = 1; // 给脉冲信号
  191.     if(DQ)
  192.     dat |=0x80;
  193.     delay_18B20(4);
  194. }
  195.    return(dat);
  196. }
  197. /*************ds18b20写一个字节****************/
  198. void WriteOneChar(unsigned char dat)
  199. {
  200.    unsigned char i=0;
  201.    for (i=8; i>0; i--)
  202.    {
  203.     DQ = 0;
  204.     DQ = dat&0x01;
  205.     delay_18B20(2);
  206.     DQ = 1;
  207.     dat>>=1;
  208.   }
  209. }

  210. void ReadTemperature(void)
  211. {unsigned char readdata[2]={0,0};
  212. fuhao=0;
  213. temperature=0;
  214. delay_18B20(40);       // this message is very important
  215. Init_DS18B20();
  216. WriteOneChar(0xCC);    // 跳过读序号列号的操作
  217. WriteOneChar(0x44); // 启动温度转换
  218. delay_18B20(40);       // this message is wery important
  219. Init_DS18B20();
  220. WriteOneChar(0xCC); //跳过读序号列号的操作
  221. WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
  222. delay_18B20(40);
  223. readdata[0]=ReadOneChar();    //读取温度值低位
  224. readdata[1]=ReadOneChar();      //读取温度值高位

  225. if (readdata[1]>127)
  226.        {readdata[0]^=0xff;//求补码
  227.         readdata[1]^=0xff;
  228.         fuhao=1;//符号为“-”
  229.        }

  230. temperature =readdata[1]*256+readdata[0] ;
  231. temperature =temperature*0.625+0.5 ;//放大了10倍
  232. }


  233. /*3、AD模块*/

  234. void AD0809()//0809转换数据
  235. {
  236. START=0;_nop_();
  237. START=1;_nop_();
  238. START=0;_nop_();
  239. while(EOC==0);
  240. OE=1;_nop_();
  241. density=P1;_nop_();
  242. OE=0;
  243. }

  244. void timer0() interrupt 1 //这里输出蜂鸣器信号
  245. {TH0=254;//频率为1600hz时计时器初值
  246. TL0=200;
  247. speaker=!speaker;
  248. }


  249. void main()
  250. {unsigned char DEN=0;
  251. LCD_Init();//初始化LCD
  252. /*计时器0设置*/
  253. TMOD=0x11;//定时器1、2工作于方式1
  254. TH0=254;//频率为1600hz时计时器初值
  255. TL0=200;
  256. ET0=1;  
  257. EA=1;
  258. speaker=1;

  259. while(1)
  260.      {
  261.       /*LCD第一行显示温度*/
  262.       ReadTemperature();//读取温度值
  263.       
  264.      if (fuhao)
  265.          {dispBuff0[5]='-';}
  266.           else
  267.              {dispBuff0[5]='+';}
  268.           dispBuff0[6]=(temperature/1000)%10+'0';//温度值百位
  269.           dispBuff0[7]=(temperature/100)%10+'0';//温度值十位
  270.           dispBuff0[8]=(temperature/10)%10+'0';//温度值个位
  271.           dispBuff0[9]='.';
  272.           dispBuff0[10]=(temperature)%10+'0';//温度值小数点后一位;

  273.         /*LCD第2行显示浓度*/
  274.           AD0809();//ad转换,浓度
  275.                   DEN=(density*100/256);
  276.           dispBuff1[5]=(DEN/10)%10+'0';//浓度值十位
  277.           dispBuff1[6]=(DEN/1)%10+'0';//浓度值个位
  278.           LCD_Display(0,dispBuff0);//LCD第一行显示
  279.           LCD_Display(1,dispBuff1);//LCD第二行显示
  280.           delay(20);
  281.           /*报警程序*/
  282.           if (temperature>=400 && !fuhao)//温度大于40摄氏度
  283.              {LED1=on;}
  284.              else
  285.                 {LED1=off;}
  286.           if (density>=50)//浓度大于50
  287.              {LED2=on;}
  288.              else
  289.                 {LED2=off;}
  290.           if (temperature>=400 && !fuhao && DEN>=50)//响蜂鸣器
  291.              {TR0=1;}
  292.              else
  293.                 {TR0=0;}
  294.        }//while
  295. }//main
复制代码

所有资料51hei提供下载:
DS18B20温度传感器和MQ2烟雾传感器的火灾报警器设计.rar (95.25 KB, 下载次数: 169)


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

使用道具 举报

沙发
ID:418767 发表于 2019-4-16 22:12 | 只看该作者
感谢分享!
回复

使用道具 举报

板凳
ID:557709 发表于 2019-6-8 14:47 | 只看该作者
感谢分享
回复

使用道具 举报

地板
ID:628356 发表于 2019-10-26 17:08 | 只看该作者
感谢分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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