<li id="3wvrb"><label id="3wvrb"><pre id="3wvrb"></pre></label></li>

  1. 標(biāo)題: 基于51單片機(jī)的數(shù)字溫度計(jì),蜂鳴器為什么不響,幫我改一下程序。我是小白.... [打印本頁]

    作者: 胡仙森    時間: 2016-6-22 22:25
    標(biāo)題: 基于51單片機(jī)的數(shù)字溫度計(jì),蜂鳴器為什么不響,幫我改一下程序。我是小白....
    #include "reg51.h"
    #include "intrins.h"        //_nop_();延時函數(shù)用
    #define  dm P0              //段碼輸出口
    #define  uchar unsigned char
    #define  uint  unsigned int
    sbit DQ=P3^7;       //溫度輸入口
    sbit w0=P2^3;       //數(shù)碼管4
    sbit w1=P2^2;                //數(shù)碼管3
    sbit w2=P2^1;                //數(shù)碼管2
    sbit w3=P2^0;                 //數(shù)碼管1               
    sbit beep=P1^2;      //蜂鳴器
    sbit set=P2^7;        //溫度設(shè)置切換鍵  
    sbit add=P2^6;        //溫度加
    sbit dec=P2^5;        //溫度減
    int temp1=0;          //顯示當(dāng)前溫度和設(shè)置溫度的標(biāo)志位為0時顯示當(dāng)前溫度
    uint h;
    uint temp;
    uchar r;
    uchar high=30,low=15; //溫度范圍設(shè)置為15-30
    uchar sign;
    uchar q=0;
    uchar tt=0;
    uchar scale;
    //**************溫度小數(shù)部分用查表法***********//
    uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};                 //小數(shù)斷碼表
    uchar code table_dm[12]={~0x3f,~0x06,~0x5b,~0x4f,~0x66,~0x6d,~0x7d,~0x07,~0x7f,~0x6f,~0x00,~0x40};
    //共陽極數(shù)碼管LED段碼表        "0"  "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9" "不亮" "-"  
    uchar table_dm1[]={~0xbf,~0x86,~0xdb,~0xcf,~0xe6,~0xed,~0xfd,~0x87,~0xff,~0xef};  //個位帶小數(shù)點(diǎn)的斷碼表
      
    uchar data temp_data[2]={0x00,0x00};             //讀出溫度暫放
    uchar data display[5]={0x00,0x00,0x00,0x00,0x00};     //顯示單元數(shù)據(jù),共4個數(shù)據(jù)和一個運(yùn)算暫用
    /*****************11us延時函數(shù)*************************/
    void delay(uint t)
    {
      for (;t>0;t--);
    }
    void scan()
    {
    int j;
            for(j=0;j<4;j++)
            {
                    switch (j)
                    {
                            case 0: dm=table_dm[display[0]];w0=0;delay(50);w0=1;//xiaoshu
                            case 1: dm=table_dm1[display[1]];w1=0;delay(50);w1=1;//gewei
                            case 2: dm=table_dm[display[2]];w2=0;delay(50);w2=1;//shiwei
                            case 3: dm=table_dm[display[3]];w3=0;delay(50);w3=1;//baiwei
                                    //        else{dm=table_dm[b3];w3=0;delay(50);w3=1;}
            }
            }
    }
    //***************DS18B20復(fù)位函數(shù)************************/
    ow_reset(void)
    {
    char presence=1;
    while(presence)
    {
      while(presence)
       {
        DQ=1;_nop_();_nop_();//從高拉倒低
    DQ=0;                                       
    delay(50);           //550 us
    DQ=1;                                       
    delay(6);            //66 us
    presence=DQ;         //presence=0 復(fù)位成功,繼續(xù)下一步
       }
       delay(45);            //延時500 us
       presence=~DQ;         
    }
    DQ=1;                   //拉高電平
    }
    /****************DS18B20寫命令函數(shù)************************/
    //1-WIRE 總線上寫1個字節(jié)
    void write_byte(uchar val)
    {
      uchar i;
      for(i=8;i>0;i--)
      {
       DQ=1;_nop_();_nop_();                  //從高拉倒低
       DQ=0;_nop_();_nop_();_nop_();_nop_();  //5 us
       DQ=val&0x01;                           //最低位移出
       delay(6);                              //66 us
       val=val/2;                             //右移1
       }
       DQ=1;
       delay(1);
    }
    /****************DS18B201字節(jié)函數(shù)************************/
    //從總線上取1個字節(jié)
    uchar read_byte(void)
    {
    uchar i;
    uchar value=0;
    for(i=8;i>0;i--)
    {
      DQ=1;_nop_();_nop_();
      value>>=1;
      DQ=0;_nop_();_nop_();_nop_();_nop_();         //4 us
      DQ=1;_nop_();_nop_();_nop_();_nop_();         //4 us
      if(DQ)value|=0x80;
      delay(6);                                     //66 us
    }
    DQ=1;
    return(value);
    }
    /*****************讀出溫度函數(shù)************************/
    read_temp()
    {
      ow_reset();                  //總線復(fù)位
      delay(200);
      write_byte(0xcc);            //發(fā)命令
      write_byte(0x44);            //發(fā)轉(zhuǎn)換命令
      ow_reset();
      delay(1);
      write_byte(0xcc);            //發(fā)命令
      write_byte(0xbe);
      temp_data[0]=read_byte();    //讀溫度值的第字節(jié)
      temp_data[1]=read_byte();    //讀溫度值的高字節(jié)
      temp=temp_data[1];
      temp<<=8;                                               
      temp=temp|temp_data[0];      // 兩字節(jié)合成一個整型變量。
    return temp;                 //返回溫度值
    }
    /****************溫度數(shù)據(jù)處理函數(shù)************************/
    //二進(jìn)制高字節(jié)的低半字節(jié)和低字節(jié)的高半字節(jié)組成一字節(jié),這個
    //字節(jié)的二進(jìn)制轉(zhuǎn)換為十進(jìn)制后,就是溫度值的百、十、個位值,而剩
    //下的低字節(jié)的低半字節(jié)轉(zhuǎn)化成十進(jìn)制后,就是溫度值的小數(shù)部分
    /********************************************************/
    work_temp(uint tem)
    {
    uchar n=0;
    if(tem>6348)                        // 溫度值正負(fù)判斷
         {tem=65536-tem;n=1;}            // 負(fù)溫度求補(bǔ)碼,標(biāo)志位置1
          display[4]=tem&0x0f;           // 取小數(shù)部分的值
      display[0]=ditab[display[4]];  // 存入小數(shù)部分顯示值
          display[4]=tem>>4;             // 取中間八位,即整數(shù)部分的值
    display[3]=display[4]/100;     // 取百位數(shù)據(jù)暫存
      display[1]=display[4]%100;     // 取后兩位數(shù)據(jù)暫存
      display[2]=display[1]/10;      // 取十位數(shù)據(jù)暫存
      display[1]=display[1]%10;     //個位數(shù)據(jù)
      r=display[1]+display[2]*10+display[3]*100;
    /////符號位顯示判斷/////
      if(!display[3])
      {
        display[3]=0x0a;           //最高位為0時不顯示
        if(!display[2])
    {
       display[2]=0x0a;        //次高位為0時不顯示
    }
      }
      if(n){display[3]=0x0b;}      //負(fù)溫度時最高位顯示"-"
    }
    void BEEP()
    {
            if((r>=high&&r<129)||r<low)
            {
                    beep=!beep;
                    beep=0;
            }
            else
            {
                    beep=1;
                   
            }
    }
    //*********設(shè)置溫度顯示轉(zhuǎn)換************//
    void xianshi(int horl)
    {
            int n=0;
            if(horl>128)
            {
                    horl=256-horl;n=1;
            }
            display[3]=horl/100;
            display[3]=display[3]&0x0f;
            display[2]=horl%100/10;
            display[1]=horl%10;
            display[0]=0;
            if(!display[3])
            {
                display[3]=0x0a;          //最高位為0時不顯示
                if(!display[2])
                    {
                       display[2]=0x0a;        //次高位為0時不顯示
                    }
            }
              if(n)
              {
                      display[3]=0x0b; //負(fù)溫度時最高位顯示"-"
              }     
    }
    //*********按鍵查詢程序**************//
    void keyscan()
    {
            int temp1;   //最高溫度和最低溫度標(biāo)志位
            if(set==0)        
            {
                    while(1)
                    {        
                            delay(500);//消抖
                            if(set==0)
                            {        
                                    temp1++;
                                    while(!set)
                                    scan();
                            }
                            if(temp1==1)
                            {
                                    xianshi(high);
                                    scan();
                                    if(add==0)
                                    {
                                            while(!add)
                                            scan();
                                            high+=1;
                                    }
                                    if(dec==0)
                                    {
                                            while(!dec)
                                            scan();
                                            high-=1;
                                    }
                            }               
                            
                            if(temp1==2)
                            {
                                    xianshi(low);
                                    if(add==0)
                                    {
                                            while(!add)
                                            scan();
                                            low+=1;
                                    }
                                    if(dec==0)
                                    {
                                            while(!dec)
                                            scan();
                                            low-=1;        
                                    }
                                    scan();
                            }
                            if(temp1>=3)
                            {
                                    temp1=0;
                                    break;
                            }
                    }
            }
    }
    /****************主函數(shù)************************/
    void main()
    {
            
             dm=0x00;                 //初始化端口
             w0=1;
             w1=1;
             w2=1;
             w3=1;
             for(h=0;h<4;h++)              //開機(jī)顯示"0000"
             {
                    display[h]=0;
             }
             ow_reset();                   //開機(jī)先轉(zhuǎn)換一次
             write_byte(0xcc);             //Skip ROM
             write_byte(0x44);             //發(fā)轉(zhuǎn)換命令
             for(h=0;h<100;h++)            //開機(jī)顯示"0000"
             {
                     scan();
             }
             while(1)
             {               
                     if (temp1==0)
                    {
                              work_temp(read_temp());     //處理溫度數(shù)據(jù)
                    BEEP();               
                            scan();                    //顯示溫度值
                    keyscan();
                    }
                       else
                             keyscan();
                      }
    }

    作者: ktzrkt    時間: 2016-7-13 22:28
    void BEEP()
    {
            if((r>=high&&r<129)||r<low)
            {
                    beep=!beep;
                    beep=0;
            }
            else
            {
                    beep=1;
                   
            }
    }
    換成
    void delay(uint z)
    {
    uint x,y;
    for(x=z;x>0;x--)
    for(y=110;y>0;y--);
    }

    void BEEP_ing()
    {
      For(int i=0;i<10;i++)
      {
          delay(100);
       beep =0;
    delay(100);
            beep =1;
        }
    }
    void BEEP()
    {
            if((r>=high&&r<129)||r<low)
            {
                   BEEP_ing();
            }
            else
            {
                 //   beep=1;
                   
            }
    }

    作者: zl2168    時間: 2016-7-14 09:47
    實(shí)例97  一線式DS18B20測溫


    Proteus仿真一下,確認(rèn)有效。
    實(shí)例97 DS18B20測溫.rar (51.78 KB, 下載次數(shù): 33)


    以上摘自張志良編著《單片機(jī)實(shí)驗(yàn)實(shí)訓(xùn)100例》 ISBN 978-7-5124-1603-1,北航社出版


    書中電路和程序設(shè)計(jì)有詳細(xì)說明,程序語句條條有注解。





    作者: songdaxuan    時間: 2016-7-14 21:54
    beep=0;
    delay(100);
    beep=1;
    作者: 陳小賤賤啊    時間: 2020-5-25 17:36
    你做的有成功嗎
    作者: 陳小賤賤啊    時間: 2020-5-25 17:49
    不曉得


    作者: 陳小賤賤啊    時間: 2020-5-25 17:50
    我也在做這個設(shè)計(jì),誰能幫幫我





    歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1