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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

求幫改下溫度計代碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:108622 發表于 2018-7-5 12:20 來自手機 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
無溫度探頭顯示0:0改30以上的(改后能打包.hex格式給我嗎)我以前就是把包都失敗/現在忘了怎么弄

做恒溫/溫度探頭被老鼠咬了/差點房子都燒起

#include<reg52.h>     //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
#include<math.h>
#include<INTRINS.H>

#define uchar unsigned char
#define uint   unsigned int

/******************************************************************/
/*                    定義端口                                    */
/******************************************************************/
sbit buzzer=P1^0;//蜂鳴器端口
sbit led1=P1^1;  //led指示燈,當前溫度高于設置的最高溫度時點亮
sbit led2=P1^2;  //led指示燈,當前溫度低于設置的最低溫度時點亮
sbit DQ=P1^4;         //ds18b20 端口

sbit key1=P3^4;  //按鍵
sbit key2=P3^5;
sbit key3=P3^6;
sbit key4=P3^7;

/******************************************************************/
/*                    全局變量                                    */
/******************************************************************/
uint temp;//當前溫度值
uchar TempH=0,TempL=0;
int temp_max,temp_min;//設定溫度的最大值和最小值
uchar flag_get,count,num;
uchar tab[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //0~~9段碼
uchar  str[4];//四位數碼管顯示字符
uchar display_mod;//數碼管顯示模式
/******************************************************************/
/*                   函數聲明                                     */
/******************************************************************/
unsigned int ReadTemperature(void);//讀取溫度函數
void Init_DS18B20(void);//18b20初始化函數
unsigned char ReadOneChar(void);//18B20讀一個字節
void WriteOneChar(unsigned char dat);//18B20寫一個字節
void delay(unsigned int i);//短延時
void delay_ms(uint z);//長延時
void alarm();//報警
void keyscan();//鍵盤掃描
/******************************************************************/
/*                    主函數                                      */
/******************************************************************/
main()
{
        uchar buzzer_delay=0;//蜂鳴器延時計數
        uchar buzzer_work=0;//蜂鳴器開始工作
        display_mod=0;//顯示當前溫度
        temp_min=10;//設置最低溫  
        temp_max=40;//設置最高溫
        TMOD|=0x01;//定時器設置
        TH0=0xef;  //定時器初值
        TL0=0xf0;
        IE=0x82;//EA=1,ET0=1
        TR0=1;  //開定時器
        P2=0xff;  
        count=0;
        buzzer=0;
        while(1)
        {
                  keyscan();//獨立按鍵掃描
                       
                if(flag_get==1)
                {   buzzer_delay++;
                        flag_get=0;// 獲取溫度標志清零
                        temp=ReadTemperature();//讀溫度值
                }                       

                if(display_mod==0)
                {
                        if(temp&0x8000)
                     {
                             str[0]=0xbf;//負號標志
                             temp=~temp; //取反加1
                                 temp +=1;
                         }
                        else
                        {
                                str[0]=0xff;
                        }
                        TempH=temp>>4;
                          TempL=temp&0x0F;
                          TempL=TempL*6/10;//小數近似處理
                       
                        str[1]=tab[(TempH%100)/10]; //十位溫度
                           str[2]=tab[(TempH%100)%10]&0x7f; //個位溫度,帶小數點
                           str[3]=tab[TempL];                       
                }
                else if(display_mod==1)//顯示最低溫
                {
                        str[0]=0xc7;//顯示L
                        str[1]=tab[temp_min/100]; //溫度百位
                           str[2]=tab[(temp_min%100)/10]; //溫度十位
                           str[3]=tab[temp_min%10];//溫度個位
                }
                else if(display_mod==2)//顯示最高溫
                {
                        str[0]=0x89;//顯示H
                        str[1]=tab[temp_max/100]; //溫度百位
                           str[2]=tab[(temp_max%100)/10]; //溫度十位
                           str[3]=tab[temp_max%10];//溫度個位       
                }
                if(buzzer_delay>5)//為了防止溫度獲取前就會出現報警
                {
                        buzzer_work=1;
                }
                if(buzzer_work==1)
                        alarm();

          }
}


/******************************************************************/
/*                  定時器中斷                                    */
/******************************************************************/
void tim(void) interrupt 1 using 1//中斷,用于數碼管掃描和溫度檢測間隔
{
        TH0=0xea;//定時器重裝值
        TL0=0xf0;
        num++;
        if (num==100)
    {
                num=0;
                  flag_get=1;//獲取溫度標志位有效
        }
        count++;
        if(count==1)
           {
                //P2=0Xfe;
                P2=0x01;
            P0=str[0];
        }//數碼管掃描
        if(count==2)
   {
                if(str[1]==tab[0])
                        str[1]=0xff;//顯示為空
                   //P2=0Xfd;
                P2=0x02;
            P0=str[1];
        }
        if(count==3)
   {
                //P2=0Xfb;
                P2=0x04;
             P0=str[2];
   }
        if(count==4)
   {
                //P2=0Xf7;
                P2=0x08;
             P0=str[3];
                count=0;
   }
}
/******************************************************************/
/*                    長延時函數                                  */
/******************************************************************/
void delay_ms(uint z) //長延時函數
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
/******************************************************************/
/*                    短延時函數                                  */
/******************************************************************/
void delay(unsigned int i)//短延時函數
{
        while(i--);
}

/******************************************************************/
/*                    初始化                                      */
/******************************************************************/
void Init_DS18B20(void)
{
        /*unsigned char x=0;
        DQ = 1;    //DQ復位
        delay(8);  //稍做延時
        DQ = 0;    //單片機將DQ拉低
        delay(80); //精確延時 大于 480us
        DQ = 1;    //拉高總線
        delay(10);
        x=DQ;      //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
        delay(5);*/
        unsigned char x=0;
        DQ = 1;    //DQ復位
        delay(8);  //稍做延時
        DQ = 0;    //單片機將DQ拉低
        delay(80); //精確延時 大于 480us
        DQ = 1;    //拉高總線
        delay(14);
        x=DQ;      //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
        delay(20);
}

/******************************************************************/
/*                    讀一個字節                                  */
/******************************************************************/
unsigned char ReadOneChar(void)
{
        unsigned char i=0;
        unsigned char dat = 0;
        for (i=8;i>0;i--)
        {
                  DQ = 0; // 給脈沖信號
                  dat>>=1;
                  DQ = 1; // 給脈沖信號
                  if(DQ)
                           dat|=0x80;
                  delay(5);
        }
        return(dat);
}

/******************************************************************/
/*                 寫一個字節                                     */
/******************************************************************/
void WriteOneChar(unsigned char dat)
{
        unsigned char i=0;
        for (i=8; i>0; i--)
        {
          DQ = 0;
          DQ = dat&0x01;
          delay(5);
          DQ = 1;
          dat>>=1;
        }
        delay(5);
}

/******************************************************************/
/*                   讀取溫度                                     */
/******************************************************************/
unsigned int ReadTemperature(void)
{       
        unsigned char a=0;
        unsigned int b=0;
        unsigned int t=0;
        Init_DS18B20();
        WriteOneChar(0xCC); // 跳過讀序號列號的操作
        WriteOneChar(0x44); // 啟動溫度轉換
        delay(200);
        Init_DS18B20();
        WriteOneChar(0xCC); //跳過讀序號列號的操作
        WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
        a=ReadOneChar();   //低位
        b=ReadOneChar();   //高位
        b<<=8;
        t=a+b;
        return(t);
}

/******************************************************************/
/*              獨立鍵盤掃描函數并顯示設定的溫度                  */
/******************************************************************/
void keyscan()  
{       
        static uchar keynum;//用于切換界面時按鍵計數
        P3=0xff;//拉高P3口,以讀取P3口的值
        if(key4==0)//設置鍵
        {
                delay_ms(5);//延時消抖
                if(key4==0)
                {
                        keynum++;
                        keynum%=2;//在0、1間變化
                        if(keynum==1)
                        {
                                display_mod=1;
                        }
                        else
                        {
                                display_mod=2;
                        }
                }
                while(!key4);//松手檢測
        }
        if(key3==0)//確定鍵
        {
                delay_ms(5);
                if(key3==0)
                {
                        keynum=0;
                        display_mod=0;
                }
                while(!key3);
        }
        if(key2==0)//加鍵
        {
                delay_ms(5);//延時消抖
                if(key2==0)
                {
                        if(display_mod==2)
                        {
                                temp_max++;
                                if(temp_max>=99)
                                        temp_max=99;
                        }
                        if(display_mod==1)
                        {
                                temp_min++;
                                if(temp_min>=temp_max)
                                        temp_min=temp_max;
                        }
                       
                }
                while(!key2);//松手檢測
        }
        if(key1==0)//減鍵
        {
                delay_ms(5);
                if(key1==0)
                {
                        if(display_mod==2)
                        {
                                temp_max--;
                                if(temp_max<=temp_min)
                                        temp_max=temp_min;
                        }
                        if(display_mod==1)
                        {
                                temp_min--;
                                if(temp_min<=0)
                                        temp_min=0;
                        }
                }
                while(!key1);//松手檢測
        }

}

/******************************************************************/
/*                  蜂鳴器報警程序                                */
/******************************************************************/
void alarm()
{
        if(display_mod==0)//在顯示當前溫度時報警才會動作
        {
        if(TempH<(temp_min))
        {
                led1=0;
                led2=1;
                buzzer=~buzzer;
        }
        else if(TempH>=(temp_max))
        {
                led1=1;
                led2=0;
                buzzer=~buzzer;
        }
        else
        {
                led1=1;
                led2=1;
                buzzer=0;
        }
        }
}

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

使用道具 舉報

沙發
ID:89286 發表于 2018-7-5 16:41 | 只看該作者
thanks for sharing
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 色久五月 | av黄色在线 | 男女羞羞免费网站 | 久久免费精彩视频 | 三级在线观看 | 日韩精品一区二区三区中文在线 | 精品一区免费 | 爱草在线 | 久久综合国产精品 | 亚洲精品成人av久久 | 日韩精品a在线观看图片 | 国产视频久久 | 国内精品久久精品 | 91看片网址 | 久久99视频精品 | 久久国| 久久av网| 在线中文字幕亚洲 | 欧美精品综合在线 | 免费av播放 | 国产乱码精品一区二区三区av | av三级在线观看 | 你懂的在线视频播放 | 99精品视频免费在线观看 | 精品久久久久久亚洲国产800 | 中文在线一区二区 | av网站在线免费观看 | 久久久久一区 | 一级毛片免费 | 在线观看免费高清av | 91黄在线观看| 91xxx在线观看 | 欧美5区 | 亚洲 自拍 另类 欧美 丝袜 | 91av免费看| 天堂在线91 | 欧美日韩在线一区二区三区 | 久久精品免费一区二区三 | 欧美一级免费看 | 成人影院免费视频 | 99热热热|