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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1721|回復: 0
收起左側

51溫控報警

[復制鏈接]
ID:444679 發表于 2018-12-25 16:18 | 顯示全部樓層 |閱讀模式
#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;//設置按鍵
uint th=360;//設定 高溫
uint tl=350;//設定 低溫
uint ta;//實際溫度
uchar code t0[]="WD=  .          ";
uchar code t1[]="TH=  .  TL=  .  ";
uchar code wendu[]="0123456789";        //利用一個溫度表解決溫度顯示亂碼
sbit DQ=P2^3;//定義DS18B20總線IO
uchar position;//設置的位置
//延時子函數
void delay(uint z)
{
        uint x,y;
        for(x=100;x>1;x--)
                for(y=z;y>1;y--);
}
//LCD1602液晶寫命令子函數
void write_com(uchar com)
{
        RS=0;
        P0=com;                                       
        delay(5);
        E=1;
        delay(5);
        E=0;
}
//LCD1602液晶寫數據子函數
void write_date(uchar date)
{
        RS=1;
        P0=date;
        delay(5);
        E=1;
        delay(5);
        E=0;
}
//LCD1602液晶初始化子函數
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);
        }
}
//延時子函數
void tmpDelay(int num)
{
        while(num--);
}        
//DS18B20溫度傳感器初始化子函數
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溫度傳感器讀一個字節子函數
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溫度傳感器寫一個字節子函數
void WriteOneChar(uchar dat)
{
        uchar i=0;
        for(i=8;i>0;i--)
        {
                DQ=0;
                DQ=dat&0x01;
                tmpDelay(5);
                DQ=1;
                dat>>=1;
        }
}
//讀取溫度子函數
uint Readtemp()
{
        uchar a=0;
        uchar b=0;
        uint t=0;
        float tt=0;        
        DS18B20_init();
        WriteOneChar(0xCC); // 跳過讀序號列號的操作
        WriteOneChar(0x44); // 啟動溫度轉換
        DS18B20_init();
        WriteOneChar(0xCC); //跳過讀序號列號的操作
        WriteOneChar(0xBE); //讀取溫度寄存器
        a=ReadOneChar();   //連續讀兩個字節數據   //讀低8位
        b=ReadOneChar();                          //讀高8位
        t=b;
        t<<=8;
        t=t|a; //兩字節合成一個整型變量。
        tt=t*0.0625;  //得到真實十進制溫度值,因為DS18B20可以精確到0.0625度,所以讀回數據的最低位代表的是0.0625度
        t=tt*10+0.5; //放大十倍,這樣做的目的將小數點后第一位也轉換為可顯示數字,同時進行一個四舍五入操作。
        return(t);
}
//LCD1602液晶顯示子函數
void display()
{
           uint shi,ge,xiaoshu;            //這里的num,shi,ge,xiaoshu 必須用unsigned int無符號整數來表示,用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]);
}
//報警子函數
void temp_check()
{
        uint shi,ge,xiaoshu;            //這里的num,shi,ge,xiaoshu 必須用unsigned int無符號整數來表示,用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]);
}
//按鍵掃描子函數
void key()
{        
        if(k3==0)                 //set 按鍵 按下
        {
                delay(1);
                if(k3==0)
                {                                                        //設置位置設定
                        position++;
                        if(position>2)
                                position=0;
                        if(position==0)                  // 無設置位置
                        {
                                write_com(0x80+0x40+7);
                                write_date(' ');
                                write_com(0x80+0x40+15);
                                write_date(' ');
                        }
                        if(position==1)                //設置TH 在th后顯示< 標識當前位置
                        {
                                write_com(0x80+0x40+7);
                                write_date('<');
                                write_com(0x80+0x40+15);
                                write_date(' ');                  
                        }
                        if(position==2)          //設置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時  是個錯誤,這里避免此情況發生
                                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時  是個錯誤,這里避免此情況發生
                                if(th<=tl)
                                        th=tl+5;
                        }
                        if(position==2)
                        {        
                                if(tl<10)
                                        tl=10;
                                else
                                        tl-=5;
                        }        
                        display();
                }        
                while(k2==0);
        }
}
//主函數
void main()
{         
        uint i;
        LCD1602_init();
        display();
        while(1)
        {        
                delay(1);
                if((++i)>500) //500ms 檢測一次溫度
                {
                         temp_check();
                         i=0;
                }               
                key();               
        }
}


回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩视频在线一区 | 久久久精品一区 | 免费福利视频一区二区三区 | 久久这里只有精品首页 | 精品av天堂毛片久久久借种 | 成人国产精品久久 | 精品香蕉一区二区三区 | 成人精品国产免费网站 | 极品在线| 日日干干夜夜 | 精品在线一区二区三区 | 精品国产乱码久久久久久丨区2区 | 操操日| 久久黄色精品视频 | 日韩视频国产 | 香蕉av免费| 成人毛片视频在线播放 | 精品欧美乱码久久久久久 | 日韩免费1区二区电影 | 亚洲精品第一页 | 欧美一区二区久久 | 亚洲精品成人 | 九色国产 | 国产精品成人一区二区三区夜夜夜 | 免费一级黄色 | 偷拍第一页| 久久精品这里精品 | 欧美一区2区三区4区公司 | 国产欧美一区二区三区在线看蜜臀 | 成人免费看片网 | 九色porny自拍视频 | 天天成人综合网 | 久久狠狠| 日韩电影中文字幕 | 日日碰狠狠躁久久躁婷婷 | 日韩一级免费观看 | 久久久亚洲综合 | 91原创视频| 精品国产一区二区三区日日嗨 | 亚洲一区二区久久久 | 18av在线播放 |