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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于單片機的溫度測量系統(畢業設計軟件程序)

[復制鏈接]
跳轉到指定樓層
樓主
ID:71259 發表于 2014-12-30 23:18 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. 用Keil寫的。溫度傳感器用DS18B20,單片機AT89C51.

  2. /*溫度范圍-55.0度~+99.9度,用四個七段LED顯示出來*/
  3. #include <reg51.h>
  4. #include <intrins.h>
  5. #include <math.h>  //要用到取絕對值函數
  6. sbit DQ=P3^7;//DS18B20的數據線和單片機的P3.7口相接,且定義DQ為變量名
  7. sbit led3_g=P2^4;//單片機的P2.4口定義為LED1的g段,表示溫度的正負
  8. sbit led0_off=P3^3;//led0熄滅信號接到P3.3口
  9. sbit led1_off=P3^4;//led0熄滅信號接到P3.4口
  10. sbit led2_off=P3^5;//led0熄滅信號接到P3.5口
  11. float low_limitedTmp,high_limitedTmp;
  12.                                     //設置的報警最低溫度和最高溫度,因為要在幾個函數中用,故為全局變量
  13. int Final_tmpvalue;  //存放最終得到的十進制有符號并放大10倍的溫度值
  14. unsigned char key_value;//存放鍵值
  15. unsigned char sys_state;//存放系統狀態,共有3態
  16.                                             //正常測溫狀態sys_state=0、調最低溫度狀態sys_state=1、
  17.                                              //調最高溫度狀態sys_state=2
  18. unsigned char led_pst;//存放正在設置的led位置值
  19.                                            //led_pst=0表示正在設置最右邊的LED,加1依次往左表示


  20. /*****************延時函數**************
  21. *************功能:延時Nx15us***********/
  22. void  delay_multi_15us(unsigned int N)
  23. {
  24.       do{
  25.         _nop_();//1
  26.         _nop_();//2
  27.         _nop_();//3
  28.         _nop_();//4
  29.         _nop_();//5
  30.         _nop_();//6
  31.         _nop_();//7
  32.         _nop_();//8
  33.         _nop_();//9
  34.         _nop_();//10
  35.         _nop_();//11
  36.         _nop_();//12
  37.         _nop_();//13
  38.         N--;//計滿15us后N減1
  39.       }while(N);
  40. }

  41. /*********************初始化函數******************************
  42. ***********功能:初始化DS18B20,以便能進行后續讀寫操作********/
  43. bit  Init_DS18B20(void)//返回為位的函數,以便檢測是否成功啟動
  44. {
  45.    DQ=0;//先拉低延時一段時間
  46.    delay_multi_15us(50);//延時750us,協議要求480us~980us,滿足要求
  47.    DQ=1;//再拉高延時
  48.    delay_multi_15us(6);//延時等待返回低電平
  49.    return(DQ);
  50.    delay_multi_15us(26);//再延時一段時間
  51. }

  52. /****************** 寫一字節數據函數*********************
  53. ************功能:向DS18B20寫一個字節的數據內容**********/
  54. void  WritetoDS_onebyte(char command)
  55. {
  56.    unsigned char i; //8位數據記位,為了節約資源定義為8位
  57.    bit temp;
  58.    for(i=0;i<8;i++)
  59.    {
  60.      temp=command&0x01;//將最低位提取出來
  61.      command>>1;//將其右移一位
  62.      if(temp)//如果寫入的是1,則按1的操作:先置DQ=0,延時15us,再置DQ=1,延時45us
  63.      {
  64.     DQ=0;
  65.     delay_multi_15us(1);//延時15us
  66.     DQ=1;
  67.     delay_multi_15us(3);//延時45us
  68.      }
  69.   else //如果寫入的是0,則按0的操作:先置DQ=0,延時60us,再置DQ=1
  70.   {
  71.     DQ=0;
  72.     delay_multi_15us(4);//延時60us
  73.     DQ=1;
  74.   }
  75.    }
  76. }

  77. /****************** 讀一字節數據函數*********************
  78. ************功能:從DS18B20讀一個字節的數據內容**********/
  79. unsigned char  ReadfromDS_onebyte()//char類型函數,最后要返回一個字節數據
  80. {
  81.    unsigned char i,dat;
  82.    dat=0;//初始化存放讀取內容的變量
  83.    for(i=0;i<8;i++)
  84.    {
  85.       DQ=0;    //先拉低約4us,符合至少1us的要求
  86.    _nop_();
  87.    _nop_();
  88.    _nop_();
  89.    _nop_();
  90.    DQ=1;  //再拉高延時
  91.    delay_multi_15us(1);//延時15us
  92.    _nop_();//為了保證大于15us再延時幾us
  93.    _nop_();
  94.    _nop_();
  95.    if(DQ) //如果讀出為1,按1讀:
  96.    {
  97.       dat=dat|0x80;//存進最高位,待會右移
  98.    }
  99.    else
  100.    {
  101.       dat=dat|0x00;//存進最高位,待會右移
  102.    }
  103.    dat=dat>>1;
  104.    delay_multi_15us(4);//延時60us
  105.    }
  106.    return(dat);
  107. }      

  108. /************************發送溫度轉換命令函數 ****************************
  109. **************功能:發送溫度轉換命令到DS18B20,啟動溫度轉換功能************/
  110. void   SendCommand_TmpConvert(void)
  111. {
  112.    while(Init_DS18B20());//初始化DS18B20,等待返回低電平信號
  113.    WritetoDS_onebyte(0xcc);//寫入跳過序列號命令字 Skip Rom
  114.    WritetoDS_onebyte(0x44);//寫入溫度轉換命令字 Convert T,啟動溫度轉換功能
  115. }

  116. /************************發送讀取溫度命令函數 ****************************
  117. **************功能:發送溫度讀取命令到DS18B20,讀取DS18B20中的溫度值************/
  118. void   SendCommand_TmpRead(void)
  119. {
  120.    while(Init_DS18B20());//初始化DS18B20,等待返回低電平信號
  121.    WritetoDS_onebyte(0xcc);//寫入跳過序列號命令字 Skip Rom
  122.    WritetoDS_onebyte(0xbe);//寫入溫度讀取命令字 ,以便后續讀取溫度值
  123. }

  124. /******************************溫度值獲取和計算函數***********************
  125. ***************功能:獲得溫度值并進行計算,得到最終十進制溫度值***********/
  126. int  Get_TmpValue(void)//返回溫度最終十進制值
  127. {
  128.    unsigned  int Temp_tmpvalue;//存放中間溫度變量
  129.    float temp;//存放中間的浮點數,因為分辨率為0.0625,故先算出來的應該為浮點數
  130.    unsigned char low,high;//存放讀取出來的溫度低、高字節
  131.    SendCommand_TmpRead();//送讀取溫度命令
  132.    low=ReadfromDS_onebyte();//讀取兩個字節的數據,先送入低字節
  133.    high=ReadfromDS_onebyte();//再送入高字節
  134.    Temp_tmpvalue=high;//數據處理,將兩個字節合并
  135.    Temp_tmpvalue<<=8;
  136.    Temp_tmpvalue|=low;
  137.    Final_tmpvalue=Temp_tmpvalue;//直接將無符號數變為有符號數
  138.                                 //因為計算機中對于負數是利用補碼來表示的
  139.                     //若是負值, 讀取出來的數值是用補碼表示的, 可直接賦值給int型的Final_tmpvalue
  140.    temp=Final_tmpvalue*0.0625; //使用DS18B20的默認分辨率12位, 精確度為0.0625度,
  141.                                                          //即讀回數據的最低位代表0.0625度
  142.    Final_tmpvalue=temp*10+(Final_tmpvalue>0?0.5:-0.5); //將它放大10倍,
  143.                                                         //使顯示時可顯示小數點后1位, 并對小數點后第二進行4舍5入
  144.                                                        //如t=11.0625, 進行計數后, 得到value = 1106, 即11.06 度
  145.                                                        //如t=-11.0625, 進行計數后, 得到value = -1106, 即-11.06 度
  146.                                                        //大于0加0.5, 小于0減0.5
  147.    return(Final_tmpvalue);//最終返回放大10倍的十進制有符號溫度值
  148. }

  149. /**************************溫度LED顯示函數*****************************
  150. *******************功能:將溫度值顯示在LED數碼管上*********************/
  151. void  Display_TmpValue(int tmp)//參數將引用函數Get_TmpValue(),
  152.                                                         //或者直接引用全局變量Final_tmpvalue
  153.                                //或者顯示設置的最高或者最低溫度high_limitedTmp*10、low_limitedTmp*10
  154. {
  155.    unsigned char dat[3]={0,0,0};//定義分別存溫度的十、個、小數三位值
  156.    unsigned char temp;
  157.    unsigned int v;
  158.    LED1_g=tmp>0?0:1;//確定負號顯示與否:溫度為正不點亮LED1_g,
  159.                                           //為負則置P2.4=1,即點亮LED1_g,顯示為一個“-”號
  160.    v=abs(tmp); //取溫度的絕對值
  161.    dat[0]=v%100; //計算十位數值
  162.    dat[1]=(v-(dat[0]*100))%10; //計算個位數值
  163.    dat[2]=v-(dat[0]*100)-(dat[1]*10);//計算小數位數值
  164.    temp=dat[0];//將十位和個位合并送到P0口顯示
  165.    temp<<=4;
  166.    temp|=dat[1];
  167.    P0=temp;//已包含reg51.h頭文件,可以直接用P口
  168.    P2&=0x10;//先將P2口低4位清0,高4位不改變
  169.    P2|=dat[2];//將小數位送到P2口低4位顯示:不改變高4位,把低4位送入P2口低4位
  170. }

  171. /************************************報警函數**************************************
  172. **************功能:當溫度超過設置的最高值或者低于最低值時系統報警*****************/
  173. void  Alarm_tmp(int tmp)   //參數將引用函數Get_TmpValue()
  174.                                                 //得出的溫度值全局變量Final_tmpvalue
  175. {
  176.    sbit  BUZZER=P2^5; //定義蜂鳴器口為P2.5口
  177.    sbit  LED_R=P2^6; //定義紅燈為P2.6口
  178.    sbit  LED_G=P2^7; //定義綠燈為P2.7口
  179.    float temp;
  180.    temp=tmp/10.0; //因為tmp為放大10倍的溫度值,要再縮小10倍
  181.    if((temp>=high_limitedTmp)||(temp<=low_limitedTmp))  //高于設置最高溫或者低于最低溫
  182.    {
  183.        BUZZER=1;  //蜂鳴器響
  184.     LED_R=1;   //紅燈亮
  185.     LED_G=0;   //綠燈滅
  186.    }
  187.    else      //正常
  188.    {
  189.     BUZZER=0;  //蜂鳴器停
  190.     LED_R=0;   //紅燈滅
  191.     LED_G=1;   //綠燈亮
  192.    }
  193. }

  194. /**********************************鍵盤掃描函數************************************
  195. ***************功能:當有鍵盤中斷時,進入鍵盤查詢鍵值,得出按下的鍵值**************/
  196. void Int0_key_Calculate()  interrupt 0  //中斷程序,用外部中斷0
  197. {
  198.     unsigned char row,col;//分別存放鍵盤為0的行和列號
  199. int temp;
  200. sbit P1_4=P1^4;
  201. sbit P1_5=P1^5;
  202. sbit P1_6=P1^6;
  203. sbit P1_7=P1^7;
  204. EA=0;//關cpu中斷,在完成一個鍵的過程中不能有中斷產生
  205. delay_multi_15us(800);//進入中斷,說明有鍵按下,先延時12ms去抖
  206. if((P1|0x10)!=1)//有鍵按下,進入查詢程序
  207. {
  208.      switch(P1)//根據P1口來查哪一行為低電平,P1=1111xxxx,其中xxxx中只有一個為0
  209.   {
  210.     case 0x0FE:row=0;break;  //如果P1=1111 1110,則置row=0
  211.     case 0x0FD:row=1;break;  //如果P1=1111 1101,則置row=1
  212.     case 0x0FB:row=2;break;
  213.     case 0x0F7:row=3;break;
  214.     default:break;
  215.   }
  216.   P1_5=1;//先置P0.4口為0,P0.5~P0.7為1
  217.   P1_6=1;
  218.   P1_7=1;
  219.   if((P1|0x10)!=1) //如果P0.0~P0.3中有0,則列號為P0.4,置col=0標志
  220.      col=0;
  221.   else  //否則繼續查P0.5
  222.   {
  223.      P1_4=1;//置P0.5口為0
  224.      P1_5=0;
  225.      P1_6=1;
  226.      P1_7=1;
  227.      if((P1|0x10)!=1) //如果P0.0~P0.3中有0,則列號為P0.5,置col=1標志
  228.         col=1;
  229.      else  //否則繼續查P0.6
  230.     {
  231.        P1_4=1;//再置P0.6口為0
  232.        P1_5=1;
  233.        P1_6=0;
  234.        P1_7=1;
  235.        if((P1|0x10)!=1) //如果P0.0~P0.3中有0,則列號為P0.6,置col=2標志
  236.           col=2;
  237.     else  //否則繼續查P0.7
  238.       {
  239.          P1_4=1;//再置P0.5口為0
  240.          P1_5=1;
  241.          P1_6=1;
  242.          P1_7=0;
  243.          if((P1|0x10)!=1) //如果P0.0~P0.3中有0,則列號為P0.7,置col=3標志
  244.              col=3;
  245.       }
  246.     }
  247.   }
  248.   temp=row;//將row和col合并,以便查鍵值
  249.   temp<<=8;
  250.   temp|=col;
  251.   switch(temp)//鍵值查詢賦值
  252.   {
  253.      case 0x0000:key_value=1;break;//第0行第0列,鍵值為1
  254.      case 0x0001:key_value=2;break;//第0行第1列,鍵值為2
  255.      case 0x0002:key_value=3;break;
  256.      case 0x0003:key_value=4;break;
  257.      case 0x0100:key_value=5;break;//第1行第0列,鍵值為5
  258.      case 0x0101:key_value=6;break;//第1行第1列,鍵值為6
  259.      case 0x0102:key_value=7;break;
  260.      case 0x0103:key_value=8;break;
  261.      case 0x0200:key_value=9;break;
  262.      case 0x0201:key_value=0;break;
  263.      case 0x0202:key_value='L';break;//表示要設置最低溫度
  264.      case 0x0203:key_value='H';break;//表示要設置最高溫度
  265.      case 0x0300:key_value='l';break;//表示按下向左鍵
  266.      case 0x0301:key_value'r';break;//表示按下向右鍵
  267.      case 0x0302:key_value='F';break;//表示改變正負號的標志flag
  268.      case 0x0303:key_value='E';break;//表示按下了確認鍵
  269.      default:key_value=FALSE;break;//無按鍵按下
  270.   }
  271. }
  272.   else
  273.       key_value=FALSE; //無鍵按下,將鍵值置為FALSE
  274.       
  275.   if(key_value!=FALSE)
  276.       Tmp_Setting();//每一次有鍵按下進行一次狀態查詢和溫度設置
  277.   
  278.   EA=1;//開cpu中斷,準備下次中斷
  279.   P1=0x01;//將鍵盤掃描口低4位寫入全1,高四位寫入全0,以查下次中斷
  280. }

  281. /***************************************單LED跳動顯示函數***************************************
  282. ***功能:根據LED的位置參數led_pos跳動此位置的單個LED,其他的靜止顯示************/
  283. void Single_LED_twinkle(void)
  284. {
  285.    unsigned char i;
  286.    
  287.       switch(led_pst)
  288.    {
  289.      case 0:for(i=0;i<2;i++) //正在設置小數位led0,閃2次
  290.          {
  291.          led0_off=0;//將led0熄滅
  292.       delay_multi_15us(20000);//延時300ms,大于人視覺暫留時間
  293.       led0_off=1;//將led0點亮
  294.       delay_multi_15us(20000);//延時300ms,大于人視覺暫留時間
  295.       }  
  296.       break;
  297.   case 1:for(i=0;i<2;i++) //正在設置個位led1,閃2次
  298.          {
  299.          led1_off=0;//將led1熄滅
  300.       delay_multi_15us(20000);//延時300ms,大于人視覺暫留時間
  301.       led1_off=1;//將led1點亮
  302.       delay_multi_15us(20000);//延時300ms,大于人視覺暫留時間
  303.       }
  304.       break;
  305.   case 2:for(i=0;i<2;i++) //正在設置十位led2,閃2次
  306.          {
  307.          led2_off=0;//將led2熄滅
  308.       delay_multi_15us(20000);//延時300ms,大于人視覺暫留時間
  309.       led2_off=1;//將led2點亮
  310.       delay_multi_15us(20000);//延時300ms,大于人視覺暫留時間
  311.       }
  312.       break;
  313.   case 3:for(i=0;i<2;i++) //正在設置符號位led3,閃2次
  314.          {
  315.          led3_g=0;//將led0熄滅
  316.       delay_multi_15us(20000);//延時300ms,大于人視覺暫留時間
  317.       led3_g=1;//將led0熄滅
  318.       delay_multi_15us(20000);//延時300ms,大于人視覺暫留時間
  319.       }
  320.       break;
  321.    }
  322. }

  323. /******************全4個LED跳動顯示函數*************************************
  324. *功能:在進入最低極限溫度或者最高極限溫度設置的初始時將4個LED全部跳動閃爍幾下***/
  325. void All_LED_twinkle(int lmt_tmp)//參數將引用low_limitedTmp或者high_limitedTmp
  326. {
  327.    unsigned char i;
  328.    Display_TmpValue(lmt_tmp*10);//先顯示上次設置的極限溫度
  329.    for(i=0;i<3;i++)//跳動3次
  330.    {
  331.    delay_multi_15us(40000);//延時延時600ms
  332.    led0_off=0;//將led0熄滅
  333.    led1_off=0;//將led1熄滅
  334.    led2_off=0;//將led2熄滅
  335.    led3_g=0;//將led0熄滅
  336.    delay_multi_15us(40000);//延時延時600ms
  337.    led0_off=1;//將led0點亮
  338.    led1_off=1;//將led1點亮
  339.    led2_off=1;//將led2點亮
  340.    led3_g=1;//將led0點亮
  341.    }
  342. }

  343. /******************************************溫度設置函數*****************************************
  344. ************功能:根據鍵盤掃描值設置報警的最低溫度和最高溫度*************************/
  345. void Tmp_Setting(void)
  346. {
  347. unsigned char lmt_low_tmp[3];//lmt_low_tmp[0]、lmt_low_tmp[1]、
  348.                                                      //lmt_low_tmp[2]、lmt_low_tmp[3]分別表示
  349.                                  //調節中的小數位數字、個位數字、十位數字、正負號(正用0,負用1表示)
  350. unsigned char lmt_high_tmp[3];//lmt_high_tmp[0]、lmt_high_tmp[1]、
  351.                                                       //lmt_high_tmp[2]、lmt_high_tmp[3]分別表示
  352.                                 //調節中的小數位數字、個位數字、十位數字、正負號(正用0,負用1表示)
  353. unsigned int tmp[2];//存放low_limitedTmp、 high_limitedTmp的絕對值放大10倍的值
  354.    tmp[0]=abs(low_limitedTmp*10);
  355. tmp[1]=abs(high_limitedTmp*10);
  356. unsigned int tmp;
  357.    if(sys_state==0)//查狀態為狀態0:正常測溫狀態
  358. {
  359.     switch(key_value)//查此時按下的鍵值
  360.     {
  361.       case 1:
  362.    case 2:
  363.    case 3:
  364.    case 4:
  365.    case 5:
  366.    case 6:
  367.    case 7:
  368.    case 8:
  369.    case 9:
  370.    case 0:
  371.    case 'l':
  372.    case 'r':
  373.    case 'F':
  374.    case 'E':break; //在sys_state=0正常測溫下,按以上鍵均無效
  375.    case 'L':sys_state=1;//按“VL”,則轉換為設置溫度下限狀態
  376.             led_pst=0;//默認為最右邊的led0設置
  377.             
  378.       lmt_low_tmp[3]=(low_limitedTmp>0?0:1);//提取分離極限最低溫度的每一位數值
  379.       lmt_low_tmp[2]=tmp[0]%100;
  380.       lmt_low_tmp[1]=(tmp[0]-lmt_tmp[2]*100)%10;
  381.       lmt_low_tmp[0]=tmp[0]-lmt_tmp[2]*100-lmt_tmp[1]*10;
  382.    
  383.       All_LED_twinkle(low_limitedTmp);//全部閃爍3次
  384.       Single_LED_twinkle(led_pst);//再默認為最右邊的led閃爍設置
  385.       break;
  386.    case 'H':sys_state=2;//按“VH”,則轉換為設置溫度下限狀態
  387.             led_pst=0; //默認為最右邊的led0設置
  388.             lmt_high_tmp[3]=(high_limitedTmp>0?0:1);//提取分離極限最高溫度的每一位數值
  389.       lmt_high_tmp[2]=tmp[1]%100;
  390.       lmt_high_tmp[1]=(tmp[1]-lmt_tmp[2]*100)%10;
  391.       lmt_high_tmp[0]=tmp[1]-lmt_tmp[2]*100-lmt_tmp[1]*10;
  392.       All_LED_twinkle(low_limitedTmp);//全部閃爍3次
  393.       Single_LED_twinkle(led_pst);//再默認為最右邊的led閃爍設置
  394.       break;
  395.     }
  396. }

  397. if(sys_state==1)//查狀態為狀態1:設置最低極限溫度狀態
  398. {
  399.     switch(key_value)//查此時按下的鍵值
  400.     {
  401.       case 1:switch(led_pst)
  402.           {
  403.       case 0:lmt_low_tmp[0]=1;//小數位為1
  404.              Single_LED_twinkle(led_pst);//相應led閃爍
  405.              break;
  406.       case 1:lmt_low_tmp[1]=1;//個位為1
  407.              Single_LED_twinkle(led_pst);//相應led閃爍
  408.              break;
  409.       case 2:lmt_low_tmp[2]=1;//十位為1
  410.              Single_LED_twinkle(led_pst);//相應led閃爍
  411.              break;
  412.       case 3:Single_LED_twinkle(led_pst);//相應led閃爍
  413.              break;//無效
  414.     }break;
  415.    case 2:switch(led_pst)
  416.           {
  417.       case 0:lmt_low_tmp[0]=2;//小數位為2
  418.              Single_LED_twinkle(led_pst);//相應led閃爍
  419.              break;
  420.       case 1:lmt_low_tmp[1]=2;//個位為2
  421.              Single_LED_twinkle(led_pst);//相應led閃爍
  422.              break;
  423.       case 2:lmt_low_tmp[2]=2;//十位為2
  424.              Single_LED_twinkle(led_pst);//相應led閃爍
  425.              break;
  426.       case 3:Single_LED_twinkle(led_pst);//相應led閃爍
  427.              break;//無效
  428.     }break;

  429.    case 3:switch(led_pst)
  430.           {
  431.       case 0:lmt_low_tmp[0]=3;
  432.              Single_LED_twinkle(led_pst);
  433.              break;
  434.       case 1:lmt_low_tmp[1]=3;
  435.              Single_LED_twinkle(led_pst);
  436.              break;
  437.       case 2:lmt_low_tmp[2]=3;
  438.              Single_LED_twinkle(led_pst);
  439.              break;
  440.       case 3:Single_LED_twinkle(led_pst);
  441.              break;
  442.     }break;

  443.    case 4:switch(led_pst)
  444.           {
  445.       case 0:lmt_low_tmp[0]=4;
  446.              Single_LED_twinkle(led_pst);
  447.              break;
  448.       case 1:lmt_low_tmp[1]=4;
  449.              Single_LED_twinkle(led_pst);
  450.              break;
  451.       case 2:lmt_low_tmp[2]=4;
  452.              Single_LED_twinkle(led_pst);
  453.              break;
  454.       case 3:Single_LED_twinkle(led_pst);
  455.              break;
  456.     }break;
  457.   
  458.    case 5:switch(led_pst)
  459.           {
  460.       case 0:lmt_low_tmp[0]=5;
  461.              Single_LED_twinkle(led_pst);
  462.              break;
  463.       case 1:lmt_low_tmp[1]=5;
  464.              Single_LED_twinkle(led_pst);
  465.              break;
  466.       case 2:lmt_low_tmp[2]=5;
  467.              Single_LED_twinkle(led_pst);
  468.              break;
  469.       case 3:Single_LED_twinkle(led_pst);
  470.              break;
  471.     }break;

  472.    case 6:switch(led_pst)
  473.           {
  474.       case 0:lmt_low_tmp[0]=6;
  475.              Single_LED_twinkle(led_pst);
  476.              break;
  477.       case 1:lmt_low_tmp[1]=6;
  478.              Single_LED_twinkle(led_pst);
  479.              break;
  480.       case 2:lmt_low_tmp[2]=6;
  481.              Single_LED_twinkle(led_pst);
  482.              break;
  483.       case 3:Single_LED_twinkle(led_pst);
  484.              break;
  485.     }break;
  486.    case 7:switch(led_pst)
  487.           {
  488.       case 0:lmt_low_tmp[0]=7;
  489.              Single_LED_twinkle(led_pst);
  490.              break;
  491.       case 1:lmt_low_tmp[1]=7;
  492.              Single_LED_twinkle(led_pst);
  493.              break;
  494.       case 2:lmt_low_tmp[2]=7;
  495.              Single_LED_twinkle(led_pst);
  496.              break;
  497.       case 3:Single_LED_twinkle(led_pst);
  498.              break;
  499.     }break;

  500.    case 8:switch(led_pst)
  501.           {
  502.       case 0:lmt_low_tmp[0]=8;
  503.              Single_LED_twinkle(led_pst);
  504.              break;
  505.       case 1:lmt_low_tmp[1]=8;
  506.              Single_LED_twinkle(led_pst);
  507.              break;
  508.       case 2:lmt_low_tmp[2]=8;
  509.              Single_LED_twinkle(led_pst);
  510.              break;
  511.       case 3:Single_LED_twinkle(led_pst);
  512.              break;
  513.     }break;

  514.    case 9:switch(led_pst)
  515.           {
  516.       case 0:lmt_low_tmp[0]=9;
  517.              Single_LED_twinkle(led_pst);
  518.              break;
  519.       case 1:lmt_low_tmp[1]=9;
  520.              Single_LED_twinkle(led_pst);
  521.              break;
  522.       case 2:lmt_low_tmp[2]=9;
  523.              Single_LED_twinkle(led_pst);
  524.              break;
  525.       case 3:Single_LED_twinkle(led_pst);
  526.              break;
  527.     }break;

  528.    case 0:switch(led_pst)
  529.           {
  530.       case 0:lmt_low_tmp[0]=0;
  531.              Single_LED_twinkle(led_pst);
  532.              break;
  533.       case 1:lmt_low_tmp[1]=0;
  534.              Single_LED_twinkle(led_pst);
  535.              break;
  536.       case 2:lmt_low_tmp[2]=0;
  537.              Single_LED_twinkle(led_pst);
  538.              break;
  539.       case 3:Single_LED_twinkle(led_pst);
  540.              break;
  541.     }break;

  542.    case 'l':switch(led_pst)
  543.            {
  544.       case 0:led_pst=1;//按一次向左鍵led向左移一次,改變設置的位數
  545.              Single_LED_twinkle(led_pst);//換閃爍的led
  546.              break;
  547.       case 1:led_pst=2;
  548.              Single_LED_twinkle(led_pst);
  549.              break;
  550.       case 2:led_pst=3;
  551.              Single_LED_twinkle(led_pst);
  552.              break;
  553.       case 3:led_pst=0;//到最左邊的led再按向左回到最右邊的led0
  554.              Single_LED_twinkle(led_pst);
  555.              break;
  556.      }break;

  557.    case 'r':switch(led_pst)
  558.            {
  559.       case 0:led_pst=3;//按一次向右鍵led向右移一次,改變設置的位數
  560.              Single_LED_twinkle(led_pst);//換閃爍的led
  561.              break;
  562.       case 1:led_pst=0;
  563.              Single_LED_twinkle(led_pst);
  564.              break;
  565.       case 2:led_pst=1;
  566.              Single_LED_twinkle(led_pst);
  567.              break;
  568.       case 3:led_pst=2;//到最左邊的led再按向左回到最右邊的led0
  569.              Single_LED_twinkle(led_pst);
  570.              break;
  571.      }break;
  572.    case 'F':switch(led_pst)
  573.            {
  574.       case 0:Single_LED_twinkle(led_pst);//設置符號正負的鍵,對小數位、個位、十位不起作用
  575.              break;
  576.       case 1:Single_LED_twinkle(led_pst);
  577.              break;
  578.       case 2:Single_LED_twinkle(led_pst);
  579.              break;
  580.       case 3:if(lmt_low_tmp[3]==0) lmt_low_tmp[3]=1;
  581.                                                                         //對符號位取反,如果以前是正,則按下后變為負
  582.              else  lmt_low_tmp[3]=0;
  583.              Single_LED_twinkle(led_pst);
  584.              break;
  585.      }break;
  586.    case 'E':sys_state=0;//系統設置溫度完成,回到正常測溫時候
  587.             if(lmt_low_tmp[3]==0)//最低溫度是正溫度時
  588.       {
  589.         low_limitedTmp=(lmt_low_tmp[2]*100+lmt_low_tmp[1]*10+lmt_low_tmp[0])/10.0;
  590.                                                                                                   //計算并確認設置后的最低溫度
  591.       }
  592.       else   //最低溫度是負溫度時
  593.       {
  594.         low_limitedTmp=-(lmt_low_tmp[2]*100+lmt_low_tmp[1]*10+lmt_low_tmp[0])/10.0;
  595.       }
  596.       break;
  597.    case 'L':Single_LED_twinkle(led_pst);//正在設置報警低溫,不起作用,相應led閃爍
  598.       break;
  599.    case 'H':sys_state=2;//按“VH”,則轉換為設置溫度上限狀態
  600.             led_pst=0;
  601.       lmt_high_tmp[3]=(high_limitedTmp>0?0:1);//提取分離極限最高溫度的每一位數值
  602.       lmt_high_tmp[2]=tmp[1]%100;
  603.       lmt_high_tmp[1]=(tmp[1]-lmt_tmp[2]*100)%10;
  604.       lmt_high_tmp[0]=tmp[1]-lmt_tmp[2]*100-lmt_tmp[1]*10;
  605.       All_LED_twinkle(high_limitedTmp);//全部閃爍3次
  606.       Single_LED_twinkle(led_pst);//再默認為最右邊的led閃爍設置
  607.       break;
  608.     }
  609. }
  610. if(sys_state==2)//查狀態為狀態2:設置最高極限溫度狀態
  611. {
  612.     switch(key_value)//查此時按下的鍵值
  613.     {
  614.       case 1:switch(led_pst)
  615.           {
  616.       case 0:lmt_high_tmp[0]=1;//小數位為1
  617.              Single_LED_twinkle(led_pst);//相應led閃爍
  618.              break;
  619.       case 1:lmt_high_tmp[1]=1;//個位為1
  620.              Single_LED_twinkle(led_pst);//相應led閃爍
  621.              break;
  622.       case 2:lmt_high_tmp[2]=1;//十位為1
  623.              Single_LED_twinkle(led_pst);//相應led閃爍
  624.              break;
  625.       case 3:Single_LED_twinkle(led_pst);//相應led閃爍
  626.              break;//無效
  627.     }break;
  628.    case 2:switch(led_pst)
  629.           {
  630.       case 0:lmt_high_tmp[0]=2;//小數位為2
  631.              Single_LED_twinkle(led_pst);//相應led閃爍
  632.              break;
  633.       case 1:lmt_high_tmp[1]=2;//個位為2
  634.              Single_LED_twinkle(led_pst);//相應led閃爍
  635.              break;
  636.       case 2:lmt_high_tmp[2]=2;//十位為2
  637.              Single_LED_twinkle(led_pst);//相應led閃爍
  638.              break;
  639.       case 3:Single_LED_twinkle(led_pst);//相應led閃爍
  640.              break;//無效
  641.     }break;

  642.    case 3:switch(led_pst)
  643.           {
  644.       case 0:lmt_high_tmp[0]=3;
  645.              Single_LED_twinkle(led_pst);
  646.              break;
  647.       case 1:lmt_high_tmp[1]=3;
  648.              Single_LED_twinkle(led_pst);
  649.              break;
  650.       case 2:lmt_high_tmp[2]=3;
  651.              Single_LED_twinkle(led_pst);
  652.              break;
  653.       case 3:Single_LED_twinkle(led_pst);
  654.              break;
  655.     }break;

  656.    case 4:switch(led_pst)
  657.           {
  658.       case 0:lmt_high_tmp[0]=4;
  659.              Single_LED_twinkle(led_pst);
  660.              break;
  661.       case 1:lmt_high_tmp[1]=4;
  662.              Single_LED_twinkle(led_pst);
  663.              break;
  664.       case 2:lmt_high_tmp[2]=4;
  665.              Single_LED_twinkle(led_pst);
  666.              break;
  667.       case 3:Single_LED_twinkle(led_pst);
  668.              break;
  669.     }break;
  670.   
  671.    case 5:switch(led_pst)
  672.           {
  673.       case 0:lmt_high_tmp[0]=5;
  674.              Single_LED_twinkle(led_pst);
  675.              break;
  676.       case 1:lmt_high_tmp[1]=5;
  677.              Single_LED_twinkle(led_pst);
  678.              break;
  679.       case 2:lmt_high_tmp[2]=5;
  680.              Single_LED_twinkle(led_pst);
  681.              break;
  682.       case 3:Single_LED_twinkle(led_pst);
  683.              break;
  684.     }break;

  685.    case 6:switch(led_pst)
  686.           {
  687.       case 0:lmt_high_tmp[0]=6;
  688.              Single_LED_twinkle(led_pst);
  689.              break;
  690.       case 1:lmt_high_tmp[1]=6;
  691.              Single_LED_twinkle(led_pst);
  692.              break;
  693.       case 2:lmt_high_tmp[2]=6;
  694.              Single_LED_twinkle(led_pst);
  695.              break;
  696.       case 3:Single_LED_twinkle(led_pst);
  697.              break;
  698.     }break;
  699.    case 7:switch(led_pst)
  700.           {
  701.       case 0:lmt_high_tmp[0]=7;
  702.              Single_LED_twinkle(led_pst);
  703.              break;
  704.       case 1:lmt_high_tmp[1]=7;
  705.              Single_LED_twinkle(led_pst);
  706.              break;
  707.       case 2:lmt_high_tmp[2]=7;
  708.              Single_LED_twinkle(led_pst);
  709.              break;
  710.       case 3:Single_LED_twinkle(led_pst);
  711.              break;
  712.     }break;

  713.    case 8:switch(led_pst)
  714.           {
  715.       case 0:lmt_high_tmp[0]=8;
  716.              Single_LED_twinkle(led_pst);
  717.              break;
  718.       case 1:lmt_high_tmp[1]=8;
  719.              Single_LED_twinkle(led_pst);
  720.              break;
  721.       case 2:lmt_high_tmp[2]=8;
  722.              Single_LED_twinkle(led_pst);
  723.              break;
  724.       case 3:Single_LED_twinkle(led_pst);
  725.              break;
  726.     }break;

  727.    case 9:switch(led_pst)
  728.           {
  729.       case 0:lmt_high_tmp[0]=9;
  730.              Single_LED_twinkle(led_pst);
  731.              break;
  732.       case 1:lmt_high_tmp[1]=9;
  733.              Single_LED_twinkle(led_pst);
  734.              break;
  735.       case 2:lmt_high_tmp[2]=9;
  736.              Single_LED_twinkle(led_pst);
  737.              break;
  738.       case 3:Single_LED_twinkle(led_pst);
  739.              break;
  740.     }break;

  741.    case 0:switch(led_pst)
  742.           {
  743.       case 0:lmt_high_tmp[0]=0;
  744.              Single_LED_twinkle(led_pst);
  745.              break;
  746.       case 1:lmt_high_tmp[1]=0;
  747.              Single_LED_twinkle(led_pst);
  748.              break;
  749.       case 2:lmt_high_tmp[2]=0;
  750.              Single_LED_twinkle(led_pst);
  751.              break;
  752.       case 3:Single_LED_twinkle(led_pst);
  753.              break;
  754.     }break;

  755.    case 'l':switch(led_pst)
  756.            {
  757.       case 0:led_pst=1;//按一次向左鍵led向左移一次,改變設置的位數
  758.              Single_LED_twinkle(led_pst);//換閃爍的led
  759.              break;
  760.       case 1:led_pst=2;
  761.              Single_LED_twinkle(led_pst);
  762.              break;
  763.       case 2:led_pst=3;
  764.              Single_LED_twinkle(led_pst);
  765.              break;
  766.       case 3:led_pst=0;//到最左邊的led再按向左回到最右邊的led0
  767.              Single_LED_twinkle(led_pst);
  768.              break;
  769.      }break;

  770.    case 'r':switch(led_pst)
  771.            {
  772.       case 0:led_pst=3;//按一次向右鍵led向右移一次,改變設置的位數
  773.              Single_LED_twinkle(led_pst);//換閃爍的led
  774.              break;
  775.       case 1:led_pst=0;
  776.              Single_LED_twinkle(led_pst);
  777.              break;
  778.       case 2:led_pst=1;
  779.              Single_LED_twinkle(led_pst);
  780.              break;
  781.       case 3:led_pst=2;//到最左邊的led再按向左回到最右邊的led0
  782.              Single_LED_twinkle(led_pst);
  783.              break;
  784.      }break;
  785.    case 'F':switch(led_pst)
  786.            {
  787.       case 0:Single_LED_twinkle(led_pst);//設置符號正負的鍵,對小數位、個位、十位不起作用
  788.              break;
  789.       case 1:Single_LED_twinkle(led_pst);
  790.              break;
  791.       case 2:Single_LED_twinkle(led_pst);
  792.              break;
  793.       case 3:if(lmt_high_tmp[3]==0)
  794.                 lmt_high_tmp[3]=1;//對符號位取反,如果以前是正,則按下后變為負
  795.              else  
  796.           lmt_high_tmp[3]=0;
  797.              Single_LED_twinkle(led_pst);
  798.              break;
  799.      }break;
  800.    case 'E':sys_state=0;//系統設置溫度完成,回到正常測溫時候
  801.             if(lmt_high_tmp[3]==0)//最低溫度是正溫度時
  802.       {
  803.         high_limitedTmp=(lmt_high_tmp[2]*100+lmt_high_tmp[1]*10+lmt_high_tmp[0])/10.0;
  804.                                                                                       //計算并確認設置后的最低溫度
  805.       }
  806.       else   //最低溫度是負溫度時
  807.       {
  808.         high_limitedTmp=-(lmt_high_tmp[2]*100+lmt_high_tmp[1]*10+lmt_high_tmp[0])/10.0;
  809.       }
  810.       break;
  811.    case 'L':sys_state=1;//按“VL”,則轉換為設置溫度下限狀態
  812.             led_pst=0;
  813.       lmt_low_tmp[3]=(low_limitedTmp>0?0:1);//提取分離極限最低溫度的每一位數值
  814.       lmt_low_tmp[2]=tmp[0]%100;
  815.       lmt_low_tmp[1]=(tmp[0]-lmt_tmp[2]*100)%10;
  816.       lmt_low_tmp[0]=tmp[0]-lmt_tmp[2]*100-lmt_tmp[1]*10;
  817.       All_LED_twinkle(low_limitedTmp);//全部閃爍3次
  818.       Single_LED_twinkle(led_pst);//再默認為最右邊的led閃爍設置
  819.       break;
  820.    case 'H':Single_LED_twinkle(led_pst);//正在設置報警高溫,不起作用,相應led閃爍
  821.       break;
  822.     }
  823. }
  824. }

  825. /***********************************主程序***************************************/
  826. void main()
  827. {
  828.    EA=1;//開cpu中斷和INT0中斷
  829.    EX0=1;
  830.    P1=0x01;//將鍵盤掃描口低4位寫入全1,高四位寫入全0
  831.    sys_state=0;//初始化系統狀態為測溫狀態0
  832.    led0_off=1;//把led全部點亮
  833.    led1_off=1;
  834.    led2_off=1;
  835.    low_limitedTmp=-40.0;//設置初始報警溫度下限
  836.    high_limitedTmp=50.0;//設置初始報警溫度下限
  837.    Final_tmpvalue=100;//設置初始10倍放大溫度以便滅報警器和紅燈
  838.    Alarm_tmp(Final_tmpvalue);//初始化報警設備
  839.    
  840.    while(1)   //實時顯示溫度值
  841.    {
  842.        SendCommand_TmpConvert();//啟動溫度轉換
  843.     Display_TmpValue(Get_TmpValue());//顯示溫度值
  844.     Alarm_tmp(Final_tmpvalue);//調用報警函數
  845.    
  846.    }
  847. }
復制代碼



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

使用道具 舉報

沙發
ID:75749 發表于 2015-3-30 23:55 | 只看該作者
支持一下
回復

使用道具 舉報

板凳
ID:44267 發表于 2015-11-16 11:41 | 只看該作者
diy的精神讓人欽佩
回復

使用道具 舉報

地板
ID:789913 發表于 2020-6-26 03:00 來自手機 | 只看該作者
我想找基于stm32的溫度測量系統課程設計
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 激情久久久久 | 久久一区二区免费视频 | 亚洲免费高清 | 九九热精品视频在线观看 | 亚洲韩国精品 | 国产1区| 99久久精品免费看国产四区 | 国产成人免费 | 能看的av | 欧美精品久久久 | 国产午夜在线 | 91精品国产色综合久久不卡蜜臀 | 色一情一乱一伦一区二区三区 | 久久久www成人免费无遮挡大片 | 日韩精品一区二区三区 | 一区二区免费 | 国产精品18久久久久久久 | 亚洲先锋影音 | 韩国精品一区二区三区 | 久久男人天堂 | 久久无毛 | 99久久久久 | 精品一级| 免费国产黄网站在线观看视频 | 99精品久久99久久久久 | 黄色大片网站 | 亚洲a在线观看 | 91 久久| 超碰97在线免费 | 麻豆精品国产91久久久久久 | 欧美一区二区在线 | 色悠悠久 | 日本不卡免费新一二三区 | 本道综合精品 | 欧美精品网站 | 久久亚洲一区二区三区四区 | 91精品欧美久久久久久久 | 在线观看视频一区 | 欧美精品一区久久 | 久久综合久 | 国产一区二区三区在线 |