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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1827|回復: 0
打印 上一主題 下一主題
收起左側

單片機帶負溫度顯示檢測報警Proteus仿真電路程序

[復制鏈接]
跳轉到指定樓層
樓主
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. #include "reg52.h"  
  2. //---重定義關鍵詞---//
  3. #define uchar unsigned char
  4. #define uint unsigned int


  5. //--定義使用的IO口--//
  6. sbit DQ =P3^6;
  7. sbit BEEP=P3^7;               //定義蜂鳴器   
  8. sbit ALAM=P1^3;                //定義燈光報警
  9. sbit SET=P3^1;                 //定義調整鍵
  10. sbit ADD=P3^3;
  11. sbit DEC=P3^2;

  12. bit shanshuo_st;                            //閃爍間隔標志
  13. bit beep_st;                                     //蜂鳴器間隔標志
  14. char shangxian=38;                  //上限報警溫度,默認值為38
  15. char xiaxian=-6;                   //下限報警溫度,默認值為-6
  16. uchar set_st=0;                             //狀態標志

  17. uchar m;                    //溫度值全局變量(整數)
  18. char Signed_Current_temp;
  19. uchar n;                             //溫度值全局變量(小數)

  20. char num=0;
  21. uchar DisplayData[8];

  22. uchar code DSY_CODE[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
  23. uchar data DSY_IDX[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
  24. uchar code df_table[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};
  25. void Alarm();

  26. /*******************************************************************************
  27. * 函 數 名         : delay
  28. * 函數功能                   : 延時函數,i=1時,大約延時10us
  29. *******************************************************************************/
  30. void delay(uint i)
  31. {
  32.         while(i--);        
  33. }

  34. void Delay1ms(uint y)
  35. {
  36.         uint x;
  37.         for( ; y>0; y--)
  38.         {
  39.                 for(x=110; x>0; x--);
  40.         }
  41. }

  42. void datapros(void)         
  43. {
  44.    
  45.         
  46.         DisplayData[1] = DSY_CODE[m/10];
  47.         DisplayData[2] = DSY_CODE[m%10]&0x7F;
  48.         DisplayData[3] = DSY_CODE[n];

  49. }
  50. //=====================================================================================
  51. //=====================================================================================
  52. //=====================================================================================

  53. /*****延時子程序*****/
  54. void Delay_DS18B20(int num)
  55. {
  56.   while(num--) ;
  57. }
  58. /*****初始化DS18B20*****/
  59. void Init_DS18B20(void)
  60. {
  61.   unsigned char x=0;
  62.   DQ = 1;         //DQ復位
  63.   Delay_DS18B20(28);    //稍做延時
  64.   DQ = 0;         //單片機將DQ拉低
  65.   Delay_DS18B20(80);   //精確延時,大于480us
  66.   DQ = 1;         //拉高總線
  67.   Delay_DS18B20(14);
  68.   x = DQ;           //稍做延時后,如果x=0則初始化成功,x=1則初始化失敗
  69.   Delay_DS18B20(20);
  70. }
  71. /*****讀一個字節*****/
  72. unsigned char ReadOneChar(void)
  73. {
  74.   unsigned char i=0;
  75.   unsigned char dat = 0;
  76.   for (i=8;i>0;i--)
  77.   {
  78.     DQ = 0;     // 給脈沖信號
  79.     dat>>=1;
  80.     DQ = 1;     // 給脈沖信號
  81.     if(DQ)
  82.     dat|=0x80;
  83.     Delay_DS18B20(4);
  84.   }
  85.   return(dat);
  86. }
  87. /*****寫一個字節*****/
  88. void WriteOneChar(unsigned char dat)
  89. {
  90.   unsigned char i=0;
  91.   for (i=8; i>0; i--)
  92.   {
  93.     DQ = 0;
  94.     DQ = dat&0x01;
  95.     Delay_DS18B20(5);
  96.     DQ = 1;
  97.     dat>>=1;
  98.   }
  99. }
  100. /*****讀取溫度*****/
  101. void ReadTemperature(void)
  102. {
  103.   unsigned char a=0;
  104.   unsigned char b=0;
  105.   //unsigned int t=0;

  106.   uchar ng=0;
  107.   //float tt=0;
  108.   Init_DS18B20();
  109.   WriteOneChar(0xCC);  //跳過讀序號列號的操作
  110.   WriteOneChar(0x44);  //啟動溫度轉換
  111.           Delay1ms(15);

  112.   Init_DS18B20();
  113.   WriteOneChar(0xCC);  //跳過讀序號列號的操作
  114.   WriteOneChar(0xBE);  //讀取溫度寄存器
  115.   a=ReadOneChar();     //讀低8位
  116.   b=ReadOneChar();    //讀高8位
  117.     if((b&0XF8)==0XF8)
  118.    {
  119.       b=~b;
  120.       a=~a+1;
  121.       if(a==0X00)b++;
  122.       ng=1;               //為負數
  123.      
  124.    }
  125.     n=df_table[a&0X0F];
  126.    if(ng==1)
  127.    {
  128.        DisplayData[0] = 0xbf;
  129.    }
  130.    else
  131.    {
  132.       DisplayData[0] = 0xff;
  133.    }
  134.    m=((a&0Xf0)>>4)|((b&0X07)<<4);
  135.    Signed_Current_temp=ng?-m:m;
  136.   

  137.   //t=b;                                   //高8位轉移到t
  138. // t<<=8;                           //t數據左移8位
  139. // t=t|a;                           //將t和a按位或,得到一個16位的數
  140.   //tt=t*0.0625;                   //將t乘以0.0625得到實際溫度值(溫度傳感器設置12位精度,最小分辨率是0.0625)
  141. // t= tt*10+0.5;     //放大10倍(將小數點后一位顯示出來)輸出并四舍五入
  142.   //return(t);                   //返回溫度值
  143. }

  144. /*****讀取溫度*****/
  145. void check_wendu(void)
  146. {
  147.     //uint a,b,c,i;
  148.      uint i;
  149.     for( i=2;i>0;i--){          //重復3次
  150.              ReadTemperature();                          //獲取溫度值
  151.         //a=c/100;                                                     //計算得到十位數字
  152.         //b=c/10-a*10;                                            //計算得到個位數字
  153.        // m=c/10;                                                      //計算得到整數位
  154.        // n=c-a*100-b*10;                                    //計算得到小數位
  155.        // if(m<0){m=0;n=0;}                                   //設置溫度顯示上限
  156.         if(m>99){m=99;n=9;}                                   //設置溫度顯示上限   
  157.          }
  158. }

  159. /*******************************************************************************
  160. * 函數名         :DigDisplay()
  161. * 函數功能                 :數碼管顯示函數
  162. * 輸入           : 無
  163. * 輸出                  : 無
  164. *******************************************************************************/
  165. void DigDisplay()
  166. {

  167.         uint i;
  168.         P0=0xff;
  169.         P2=0x00;
  170.         for(i=30;i>0;i--){
  171.         
  172.                                 P2=DSY_IDX[0];
  173.                                         P0=DisplayData[0];//發送數據
  174.                 delay(150); //間隔一段時間掃描        
  175.                 P0=0xff;//消隱
  176.         
  177.                         P2=DSY_IDX[1];
  178.                                 P0=DisplayData[1];//發送數據
  179.                 delay(150); //間隔一段時間掃描        
  180.                 P0=0xff;//消隱
  181.                
  182.                                 P2=DSY_IDX[2];
  183.                                         P0=DisplayData[2];//發送數據
  184.                 delay(150); //間隔一段時間掃描        
  185.                 P0=0xff;//消隱
  186.                         
  187.                                 P2=DSY_IDX[3];
  188.                                         P0=DisplayData[3];//發送數據
  189.                 delay(250); //間隔一段時間掃描        
  190.                 P0=0xff;//消隱
  191.         
  192.          Alarm();   //報警檢測
  193.         }


  194. }

  195. /*****報警子程序*****/
  196. void Alarm()
  197. {
  198.         float tem,xiaoshu;
  199.                   tem=Signed_Current_temp;
  200.                   xiaoshu=n;
  201.                   xiaoshu=xiaoshu*0.1;
  202.         if(((tem+xiaoshu)>=shangxian)||((tem-xiaoshu)<xiaxian))
  203.         {
  204.                   
  205.                                  BEEP=!BEEP;
  206.                 ALAM=0;
  207.                
  208.         }
  209.         else
  210.         {
  211.                 BEEP=1;
  212.                 ALAM=1;
  213.         }
  214. }

  215. /*****顯示報警溫度子程序*****/
  216. void Disp_alarm(char baojing)
  217. {
  218.         uint i;
  219.         P0=0xff;
  220.         P2=0x00;

  221.    for(i=2;i>0;i--){
  222.        P2=DSY_IDX[0];
  223.       if(set_st==1)P0=0x89;       //上限H
  224.         else if(set_st==2)P0=0xC7; //下限L標示
  225.         
  226.         delay(100);
  227.             P0=0xff;//消隱

  228. P2=DSY_IDX[1];
  229. if(baojing<0)
  230.    {
  231.        P0 = 0xbf;
  232.                  baojing=-baojing;
  233.    }
  234.    else
  235.    {
  236.       P0 = 0xff;

  237.    }
  238. delay(100);
  239.          P0=0xff;//消隱

  240.      P2=DSY_IDX[2];
  241.      P0=DSY_CODE[baojing/10];
  242.      delay(100);
  243.          P0=0xff;//消隱

  244.      P2=DSY_IDX[3];
  245.      P0=DSY_CODE[baojing%10];
  246.      delay(200);
  247.          P0=0xff;//消隱

  248.     }

  249. }



  250. /*******************************************************************************
  251. * 函 數 名       : main
  252. * 函數功能                 : 主函數
  253. * 輸    入       : 無
  254. * 輸    出             : 無
  255. *******************************************************************************/
  256. void main()
  257. {        
  258.    EA=1;
  259.   
  260.   IT0=1;     //外部中斷的觸發方式,下降沿觸發      
  261.    IT1=1;
  262.                 check_wendu();
  263.                 Delay1ms(900);
  264.                 check_wendu();
  265.                 datapros();
  266.          BEEP=1;
  267.     ALAM=1;
  268.         while(1)
  269.         {
  270.         if(SET==0)
  271.       {
  272.           delay(2000);
  273.           do{}while(SET==0);
  274.           set_st++;shanshuo_st=1;
  275.           if(set_st>2)set_st=0;
  276.       }
  277.        if(set_st==0)
  278.       {
  279.                  BEEP=1;
  280.    
  281.           EX0=0;    //關閉外部中斷0
  282.           EX1=0;    //關閉外部中斷1
  283.                   check_wendu();
  284.             datapros();
  285.             DigDisplay();
  286.         //Alarm();   //報警檢測
  287.        }
  288.        else if(set_st==1)
  289.       {
  290.           BEEP=1;    //關閉蜂鳴器
  291.           ALAM=1;
  292.           EX0=1;    //開啟外部中斷0
  293.           EX1=1;    //開啟外部中斷1
  294.          
  295.          if(shanshuo_st) {Disp_alarm(shangxian);}
  296.       }
  297.       else if(set_st==2)
  298.       {
  299.           BEEP=1;    //關閉蜂鳴器
  300.           ALAM=1;
  301.           EX0=1;    //開啟外部中斷0
  302.           EX1=1;    //開啟外部中斷1
  303.          
  304.           if(shanshuo_st) {Disp_alarm(xiaxian);}
  305.       }

  306.    }

  307. }



  308. /*****外部中斷0服務程序*****/
  309. void int0(void) interrupt 0
  310. {

  311.        EX0=0;      //關外部中斷0
  312. ……………………

  313. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei附件下載:
仿真代碼.7z (65.18 KB, 下載次數: 26)

評分

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

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一区二区电影 | 久草a√ | 青草福利 | 日韩综合在线 | 欧美日韩一区在线 | 欧美一区二区三区在线观看 | 做a的各种视频 | 91久久爽久久爽爽久久片 | 在线观看免费av片 | 天天曰天天曰 | 中文字幕在线精品 | 久久99视频免费观看 | 亚洲成人999 | 欧美一级久久 | 亚洲欧美一区二区三区1000 | 欧美日韩成人在线 | 一区二区三区视频在线免费观看 | 成人福利在线 | 国产一区二区av | 综合色婷婷 | 精品国偷自产在线 | 国产精品久久久av | 99伊人网| 久久成人av| 国产亚洲精品久久午夜玫瑰园 | 精品亚洲永久免费精品 | 欧美国产日韩精品 | 国产精品久久久久久久久久免费看 | www.蜜桃av.com| 99亚洲视频 | 国内精品久久久久久久影视简单 | 日韩视频在线免费观看 | 国产91丝袜在线播放 | 国产精品久久久久久 | 草草视频在线观看 | 色噜噜狠狠色综合中国 | 日本小电影网站 | 在线观看中文字幕 | 国产伦精品一区二区三区精品视频 | 久久99国产精品久久99果冻传媒 | 国产精品1区2区3区 一区中文字幕 |