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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3073|回復(fù): 0
收起左側(cè)

基于DS18B20的體溫監(jiān)測聲光報警裝置源程序Proteus仿真

[復(fù)制鏈接]
ID:700721 發(fā)表于 2020-12-8 10:27 | 顯示全部樓層 |閱讀模式
(1)本裝置為基于51單片機(jī)的溫度檢測報警裝置(C語言),調(diào)節(jié)范圍(-55℃~+128℃)
(2)手動調(diào)節(jié)DS18B20溫度大小,此時L1602液晶顯示器同步顯示溫度值(℃)保留小數(shù)點(diǎn)后一位。
(3)當(dāng)前溫值大于等于37.3℃,紅燈亮起,蜂鳴器開始發(fā)聲報警,低于37.3℃綠燈常亮。
(4)當(dāng)檢測溫度為負(fù)值或超出100℃,則判定為裝置出現(xiàn)故障,黃燈亮起。
(5)當(dāng)裝置判定為故障時,需重啟裝置后再去檢測,裝置通電時會有“BI~”的一聲提示

裝置預(yù)覽圖.png

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png

單片機(jī)源程序如下:
  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口  寫指令低,寫數(shù)據(jù)高
  11. sbit LCD_EN=P2^1;                                //液晶屏EN口  高脈沖使能 寫指令/數(shù)據(jù),低跳變執(zhí)行

  12. uchar TempData[7];                          //溫度存儲顯示值
  13. bit ReadTempFlag;                          //讀時間標(biāo)志

  14. void WriteOneChar(uchar dat);             //寫入DS18B20一個字節(jié)
  15. uchar ReadOneChar(void);                 //讀取DS18B20一個字節(jié)
  16. uint ReadTemperature(void);             //讀取DS18B20溫度值
  17. bit Init_DS18B20(void);                //初始化DS18B20
  18. void Time0(void);                     //定時器初始化
  19. void Delay2us(uchar t);             //2微秒延時函數(shù)
  20. void Delay1ms(uchar t);              //1毫秒延時函數(shù)
  21. void LCDinit();                                           //設(shè)置顯示模式
  22. void write_com(uchar com);                  //液晶寫指令程序
  23. void write_date(uchar date);         //液晶寫數(shù)據(jù)程序
  24. void delay100us(uint x);             //100us延時程序

  25. void main()
  26. {                  
  27.         uchar i;
  28.         uint temp;
  29.         long tempM;
  30.         bit negative;              //負(fù)數(shù)標(biāo)志
  31.         uchar TempH,TempL,TempK;
  32.         Time0();                          //定時器初始化
  33.         LCDinit();                                //設(shè)置顯示模式
  34.         while(1)         
  35.         {
  36.                 if(ReadTempFlag==1)      //定時標(biāo)志
  37.                 {
  38.                         ReadTempFlag=0;
  39.                         temp=ReadTemperature();//讀取溫度
  40.                         if(temp&0x8000)
  41.                         {            
  42.                                 negative=1;                //負(fù)號標(biāo)志
  43.                                 temp=~temp;                //取反加1
  44.                                 temp +=1;
  45.                                                         
  46.                         }
  47.                         else negative=0;        //正數(shù)

  48.                         tempM=temp*0.0625*100;        //換算為10進(jìn)制溫度值再放大100倍        12位精度直接乘0.625
  49.                         TempH=tempM/100;             //取整數(shù)      
  50.                         TempL=tempM%100;            //取小數(shù)
  51.                         TempL=(TempL+TempL)/2+0.5;// 小數(shù)取兩次平均值加四舍五入更為精確
  52.                         TempK=TempL;                          //準(zhǔn)確的小數(shù)部分

  53.                         if(negative==1)
  54.                                 TempData[0]='-';//顯示負(fù)號
  55.                         else if(TempH/100==0)     //溫度值為兩位數(shù)
  56.                                 TempData[0]=' ';  //百位消隱不顯示
  57.                         else
  58.                                 TempData[0]=TempH/100+'0';  //顯示百位溫度
  59.       
  60.                         if((TempH/100==0)&&((TempH%100)/10==0))                //溫度值為一位數(shù)
  61.                                 TempData[1]=' ';                   //十位消隱不顯示
  62.                         else
  63.                         TempData[1]=(TempH%100)/10+'0';                //顯示十位溫度
  64.                         TempData[2]=(TempH%100)%10+'0';               //顯示個位溫度
  65.                         TempData[3]='.';                             //顯示小數(shù)點(diǎn)
  66.                         TempData[4]=TempL/10+'0';                   //顯示溫度小數(shù)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);                          //數(shù)據(jù)指針第一行起始0x80位置,左側(cè)第一個值開始
  98.                         for(i=0;i<7;i++)                          //每循環(huán)一次寫一個字節(jié)數(shù)據(jù)
  99.                         {
  100.                                 write_date(TempData[i]);        //寫一個字節(jié)數(shù)據(jù)               
  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開關(guān)打開
  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;  //讀標(biāo)志位置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復(fù)位
  152.         Delay2us(5);   //稍做延時
  153.         DQ = 0;         //單片機(jī)將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.                     讀取一個字節(jié)
  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.                     寫入一個字節(jié)
  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); // 啟動溫度轉(zhuǎn)換         44H開啟溫度轉(zhuǎn)換
  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;        //初始設(shè)置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;        //低跳變執(zhí)行
  234.       
  235. }
  236. /*******液晶寫數(shù)據(jù)程序********/
  237. void write_date(uchar date)
  238. {
  239.         LCD_RS=1;             //允許寫數(shù)據(jù)
  240.         P0 =date;            //傳遞數(shù)據(jù)
  241.         delay100us(10);        //延時1ms
  242.         LCD_EN=1;           //使能寫入
  243.         delay100us(10);        //延時1ms
  244.         LCD_EN=0;           //低跳變執(zhí)行
  245.       
  246. }
  247. /*******液晶初始化程序********/
  248. void LCDinit()                //設(shè)置顯示模式、
  249. {
  250.         write_com(0x38);//設(shè)置16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口
  251.         write_com(0x01);//顯示清零,數(shù)據(jù)指針清零
  252.         write_com(0x0c);//設(shè)置開顯示,不顯光標(biāo)
  253.         write_com(0x06);//設(shè)置寫一個字符后地址指針加1
  254.         write_com(0x80);//數(shù)據(jù)指針初始化,設(shè)置顯示初始位置
  255. }
復(fù)制代碼

所有資料51hei提供下載:
基于 DS18B20 的體溫監(jiān)測聲光報警裝置.zip (316.51 KB, 下載次數(shù): 66)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 暖暖成人免费视频 | 亚洲精品无| 久久久久久免费观看 | 日本精品一区 | 国产精品久久久99 | 亚洲乱码国产乱码精品精98午夜 | 国产精品视频区 | 成人a免费 | 欧美一区二区三区在线视频 | 久久精品99久久 | 九七午夜剧场福利写真 | 国产欧美综合在线 | 久久av一区 | 精品视频在线免费观看 | 日本一二区视频 | 五月激情综合 | 亚洲日本三级 | 国产精品免费av | 午夜激情视频 | av先锋资源 | www.欧美.com| 国户精品久久久久久久久久久不卡 | 一区二区三区影院 | 久久曰视频 | 欧美三级视频在线观看 | 午夜在线视频 | 99久热在线精品视频观看 | 男人的天堂在线视频 | 免费视频99| 视频1区| 一区二区三区四区不卡视频 | 欧美在线激情 | 欧美一级二级三级 | 综合九九| 成人免费福利视频 | 亚洲精品二区 | 国产精品99久久久久 | 国产在线1| 午夜影视 | 国产在线一区二区三区 | 特级毛片|