找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 18552|回復: 12
打印 上一主題 下一主題
收起左側(cè)

基于51單片機的數(shù)字溫度報警器源程序

  [復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:128215 發(fā)表于 2017-2-14 20:15 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include<reg51.h>
typedef unsigned char uchar;
typedef unsigned int  uint;
uchar i;
sbit RS=P2^7;
sbit RW=P2^6;
sbit E=P2^5;
sbit D1=P1^0;
sbit D2=P1^1;
sbit k1=P2^1;//加按鍵
sbit k2=P2^2;//減按鍵
sbit k3=P2^0;//設(shè)置按鍵
uint th=360;//設(shè)定 高溫
uint tl=350;//設(shè)定 低溫
uint ta;//實際溫度
uchar code t0[]="WD=  .          ";
uchar code t1[]="TH=  .  TL=  .  ";
uchar code wendu[]="0123456789";        //利用一個溫度表解決溫度顯示亂碼
sbit DQ=P2^3;//定義DS18B20總線IO
uchar position;//設(shè)置的位置
//延時子函數(shù)
void delay(uint z)
{
        uint x,y;
        for(x=100;x>1;x--)
                for(y=z;y>1;y--);
}
//LCD1602液晶寫命令子函數(shù)
void write_com(uchar com)
{
        RS=0;
        P0=com;                                       
        delay(5);
        E=1;
        delay(5);
        E=0;
}
//LCD1602液晶寫數(shù)據(jù)子函數(shù)
void write_date(uchar date)
{
        RS=1;
        P0=date;
        delay(5);
        E=1;
        delay(5);
        E=0;
}
//LCD1602液晶初始化子函數(shù)
void LCD1602_init()
{
        E=0;
        RW=0;
        write_com(0x38);
        write_com(0x01);
        write_com(0x0c);
        write_com(0x06);
        write_com(0x80);       
        for(i=0;i<16;i++)
        {
                write_date(t0[i]);
                delay(0);
        }
        write_com(0x80+0x40);
        for(i=0;i<16;i++)
        {
                write_date(t1[i]);
                delay(0);
        }
}
//延時子函數(shù)
void tmpDelay(int num)
{
        while(num--);
}       
//DS18B20溫度傳感器初始化子函數(shù)
void DS18B20_init()
{
        uchar x=0;
        DQ=1;    //DQ復位
        tmpDelay(8);  //稍做延時
        DQ=0;    //單片機將DQ拉低
        tmpDelay(80); //精確延時 大于 480us
        DQ=1;    //拉高總線
        tmpDelay(14);
        x=DQ;      //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
        tmpDelay(20);
}
//DS18B20溫度傳感器讀一個字節(jié)子函數(shù)
uchar ReadOneChar()
{
        uchar i=0;
        uchar dat=0;
        for(i=8;i>0;i--)
        {
                DQ=0; // 給脈沖信號
                dat>>=1;
                DQ=1; // 給脈沖信號
                if(DQ)
                        dat|=0x80;
                tmpDelay(4);
        }
        return(dat);
}
//DS18B20溫度傳感器寫一個字節(jié)子函數(shù)
void WriteOneChar(uchar dat)
{
        uchar i=0;
        for(i=8;i>0;i--)
        {
                DQ=0;
                DQ=dat&0x01;
                tmpDelay(5);
                DQ=1;
                dat>>=1;
        }
}
//讀取溫度子函數(shù)
uint Readtemp()
{
        uchar a=0;
        uchar b=0;
        uint t=0;
        float tt=0;       
        DS18B20_init();
        WriteOneChar(0xCC); // 跳過讀序號列號的操作
        WriteOneChar(0x44); // 啟動溫度轉(zhuǎn)換
        DS18B20_init();
        WriteOneChar(0xCC); //跳過讀序號列號的操作
        WriteOneChar(0xBE); //讀取溫度寄存器
        a=ReadOneChar();   //連續(xù)讀兩個字節(jié)數(shù)據(jù)   //讀低8位
        b=ReadOneChar();                          //讀高8位
        t=b;
        t<<=8;
        t=t|a; //兩字節(jié)合成一個整型變量。
        tt=t*0.0625;  //得到真實十進制溫度值,因為DS18B20可以精確到0.0625度,所以讀回數(shù)據(jù)的最低位代表的是0.0625度
        t=tt*10+0.5; //放大十倍,這樣做的目的將小數(shù)點后第一位也轉(zhuǎn)換為可顯示數(shù)字,同時進行一個四舍五入操作。
        return(t);
}
//LCD1602液晶顯示子函數(shù)
void display()
{
           uint shi,ge,xiaoshu;            //這里的num,shi,ge,xiaoshu 必須用unsigned int無符號整數(shù)來表示,用unshigned char  字符型則顯示錯誤
        shi=th/100;                  //顯示 最高溫度 Th
        ge=th/10%10;
        xiaoshu=th%10;
        write_com(0x80+0x40+3);
        write_date(wendu[shi]);
        write_com(0x80+0x40+4);
        write_date(wendu[ge]);                                       
        write_com(0x80+0x40+6);
        write_date(wendu[xiaoshu]);
        shi=tl/100;          //顯示 最低文帝 Tl  
        ge=tl/10%10;
        xiaoshu=tl%10;
        write_com(0x80+0x40+11);
        write_date(wendu[shi]);
        write_com(0x80+0x40+12);
        write_date(wendu[ge]);                                               
        write_com(0x80+0x40+14);
        write_date(wendu[xiaoshu]);
}
//報警子函數(shù)
void temp_check()
{
        uint shi,ge,xiaoshu;            //這里的num,shi,ge,xiaoshu 必須用unsigned int無符號整數(shù)來表示,用unshigned char  字符型則顯示錯誤
        ta=Readtemp();
        if(ta>th)
        {
                D1=0;
                D2=1;
        }
        else if(ta<tl)
        {
                D1=1;
                D2=0;
        }
        else
        {
                D1=1;
                D2=1;
        }
        shi=ta/100;         //顯示 實際溫度  
        ge=ta/10%10;
        xiaoshu=ta%10;
        write_com(0x80+3);
        write_date(wendu[shi]);
        write_com(0x80+4);
        write_date(wendu[ge]);                                                 
        write_com(0x80+6);
        write_date(wendu[xiaoshu]);
}
//按鍵掃描子函數(shù)
void key()
{       
        if(k3==0)                 //set 按鍵 按下
        {
                delay(1);
                if(k3==0)
                {                                                        //設(shè)置位置設(shè)定
                        position++;
                        if(position>2)
                                position=0;
                        if(position==0)                  // 無設(shè)置位置
                        {
                                write_com(0x80+0x40+7);
                                write_date(' ');
                                write_com(0x80+0x40+15);
                                write_date(' ');
                        }
                        if(position==1)                //設(shè)置TH 在th后顯示< 標識當前位置
                        {
                                write_com(0x80+0x40+7);
                                write_date('<');
                                write_com(0x80+0x40+15);
                                write_date(' ');                  
                        }
                        if(position==2)          //設(shè)置Tl   在tl后顯示< 標識當前位置
                        {
                                write_com(0x80+0x40+7);
                                write_date(' ');
                                write_com(0x80+0x40+15);
                                write_date('<');                  
                        }
                        while(k3==0);       
                }       
        }       
        if(k1==0)
        {
                delay(1);
                if(k1==0)
                {
                        if(position==1)
                        {
                                th+=5;
                                if(th>1000)
                                        th=990;
                        }
                        if(position==2)
                        {
                                tl+=5;                          //tl>th時  是個錯誤,這里避免此情況發(fā)生
                                if(tl>=th)
                                        tl=th-5;
                        }       
                        display();
                }       
                while(k1==0);
        }
        if(k2==0)
        {
                delay(1);
                if(k2==0)
                {
                        if(position==1)
                        {
                                th-=5;                         //th<tl時  是個錯誤,這里避免此情況發(fā)生
                                if(th<=tl)
                                        th=tl+5;
                        }
                        if(position==2)
                        {       
                                if(tl<10)
                                        tl=10;
                                else
                                        tl-=5;
                        }       
                        display();
                }       
                while(k2==0);
        }
}
//主函數(shù)
void main()
{         
        uint i;
        LCD1602_init();
        display();
        while(1)
        {       
                delay(1);
                if((++i)>500) //500ms 檢測一次溫度
                {
                         temp_check();
                         i=0;
                }               
                key();               
        }
}



2、仿真圖.zip

60.03 KB, 下載次數(shù): 223, 下載積分: 黑幣 -5

評分

參與人數(shù) 1黑幣 +5 收起 理由
3s. + 5 太想下了。

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:357435 發(fā)表于 2018-6-23 20:41 | 只看該作者
好東西  謝謝 樓主 分享
回復

使用道具 舉報

板凳
ID:353024 發(fā)表于 2018-6-25 14:42 | 只看該作者
想看!!
回復

使用道具 舉報

地板
ID:364106 發(fā)表于 2018-7-3 16:45 | 只看該作者
優(yōu)秀優(yōu)秀
回復

使用道具 舉報

5#
ID:366772 發(fā)表于 2018-7-7 13:16 | 只看該作者
超級想看
回復

使用道具 舉報

6#
ID:369264 發(fā)表于 2018-7-11 15:24 | 只看該作者
文檔是仿真圖?
回復

使用道具 舉報

7#
ID:369562 發(fā)表于 2018-7-11 16:18 | 只看該作者
呃呃,感覺有改進的地方
回復

使用道具 舉報

8#
ID:319537 發(fā)表于 2018-9-25 15:14 | 只看該作者
這個資料好
回復

使用道具 舉報

9#
ID:412814 發(fā)表于 2018-11-7 19:52 | 只看該作者
雖然還是有很多地方看不懂,但是還是覺得很厲害的樣子。
回復

使用道具 舉報

10#
ID:435832 發(fā)表于 2018-12-5 14:05 | 只看該作者
仿真圖打不開
回復

使用道具 舉報

11#
ID:457343 發(fā)表于 2018-12-28 15:19 | 只看該作者
謝謝dalao
回復

使用道具 舉報

12#
ID:490961 發(fā)表于 2019-3-14 19:15 | 只看該作者
電路圖清晰嗎
回復

使用道具 舉報

13#
ID:771301 發(fā)表于 2020-6-7 12:05 | 只看該作者
很棒,對大作業(yè)幫助很大
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表