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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5486|回復: 3
收起左側

用1602LCD與DS18B20的溫度報警器的仿真+單片機代碼設計

[復制鏈接]
ID:417541 發表于 2018-11-28 20:11 | 顯示全部樓層 |閱讀模式
用1602LCD與DS18B20設計的溫度報警器仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png

單片機源程序如下:
  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)


回復

使用道具 舉報

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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜精品久久久 | 亚洲巨乳自拍在线视频 | 精品日韩在线 | 国产精品日韩 | 国产亚洲一区二区三区在线 | 四虎首页 | 成人伊人| 男人天堂视频在线观看 | 一区二区在线看 | 久久久久久艹 | 99精品欧美一区二区三区综合在线 | 成年人视频免费在线观看 | 精品一二三区 | 国产一级在线视频 | 免费看的av| 欧美在线国产精品 | 亚洲成人精品一区二区 | 国精品一区 | 国产视频二区在线观看 | 午夜视频在线观看视频 | 亚洲一区二区三区免费观看 | 亚洲精品aⅴ | 日韩成人精品视频 | 欧美bondage紧缚视频 | 粉嫩一区二区三区国产精品 | 久久午夜国产精品www忘忧草 | 成人深夜福利在线观看 | 色99视频 | 国产三区精品 | 高清国产一区二区 | 欧美中文字幕在线观看 | 久久人人网 | 国产亚洲一区二区三区 | 在线观看国产精品视频 | 天堂色区| av影音资源| 一区二区成人 | 国产精品免费在线 | 毛片com| 色婷婷国产精品综合在线观看 | 亚洲欧美中文日韩在线v日本 |