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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2954|回復: 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, 下載次數: 66)

評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂1 踩
回復

使用道具 舉報

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

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 狠狠爱视频 | 日韩一区二区三区视频 | 亚洲精品亚洲人成人网 | 午夜激情视频在线 | 超碰97在线免费 | 国产在线一区二区三区 | 精品国产一区二区三区成人影院 | 久久精品视频99 | 91原创视频 | 亚洲福利 | 国产丝袜人妖cd露出 | 香蕉视频91 | 久久久久久久国产精品视频 | 亚洲国产中文字幕 | 欧美成人h版在线观看 | 日韩和的一区二在线 | 日本黄色片免费在线观看 | 国产欧美综合在线 | 亚洲精选一区二区 | 淫片一级国产 | 成人一区二区在线 | 91在线播 | 密色视频| 视频一区二区在线观看 | 日韩在线视频一区二区三区 | 久久av一区二区三区 | 欧美 日韩 中文 | 欧美一级片在线看 | 成人综合久久 | 久久久av一区 | 黄色网址免费在线观看 | 日韩亚洲欧美综合 | 成年人视频在线免费观看 | 国内在线视频 | 欧美日韩国产高清视频 | 天天人人精品 | 国产精品免费一区二区三区四区 | 黄色毛片黄色毛片 | 欧美一区两区 | 国产成人精品视频在线观看 | av日韩高清|