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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4007|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

溫度檢測報(bào)警程序(可調(diào)上下限)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char

sbit DQ=P2^2;//ds18b20與單片機(jī)連接口
sbit RS=P1^0;
sbit RW=P1^1;
sbit EN=P2^5;
sbit en573=P2^6;
sbit en1573=P2^7;

uchar data disdata[5];
uint tvalue,CurrentT=0;//溫度值
uchar tflag;//溫度正負(fù)標(biāo)志

               
#define LCD_BUS P0

sbit SetKey= P3^4;
sbit UpKey= P3^5;
sbit DnKey= P3^6;
sbit BEEP= P2^3;


unsigned char AlarmTempLow=10,AlarmTempTop=40,Set=0,NG=0;






void delayms(uint ms)                 //延時(shí)xx毫秒
{
        uchar i;
        while(ms--)
        {
                 for(i=0;i<120;i++);
        }
}



void command(uint com)         //LCD寫指令
{
   RS=0;                                  //RS為0
   LCD_BUS=com;          //裝載指令
   delayms(5);                 //延時(shí)5ms
   EN=1;                                 //LCD使能
   delayms(5);                //延時(shí)5ms
   EN=0;                                //LCD不使能
}

void write_dat(uchar dat)          //LCD寫數(shù)據(jù)
{
   RS=1;                                        //RS為1
   LCD_BUS=dat;                //裝載數(shù)據(jù)
   delayms(5);                         //延時(shí)5ms
   EN=1;                                         //LCD使能
   delayms(5);                         //延時(shí)5ms
   EN=0;                                         //LCD不使能
}

void writestring(uchar x,uchar y,uchar *s) //LCD 寫字符串
{     
        if (y == 0)  command(0x80 + x);     //表示第一行
        else         command(0xC0 + x);      //表示第二行

        while (*s)                         //判斷是否字符串的結(jié)尾
        {     
     write_dat( *s);    //顯示當(dāng)前字符
                s ++;                             //字符串地址加1
        }
}

void writeChar(uchar x,uchar y,uchar s) //LCD 寫字符串
{     
        if (y == 0)  command(0x80 + x);     //表示第一行
        else         command(0xC0 + x);      //表示第二行

        {     
     write_dat( s);    //顯示當(dāng)前字符
        }
}


void LCD_Initial()                //LCD初始化
{

   EN=0;                                  //LCD不使能
   RW=0;                                  //RW為0
   command(0x38);                //發(fā)送初始化指令
   command(0x0c);                //發(fā)送初始化指令
   command(0x06);          //發(fā)送初始化指令
   command(0x01);          //發(fā)送初始化指令
   command(0x80+0x02);        //發(fā)送LCD初始位置
}


/*************************DS1820程序****************************/
void delay_18B20(unsigned int i)//延時(shí)1微秒
{
   while(i--);
}

void ds1820rst(void)/*ds1820復(fù)位*/
{
        unsigned char x=0;
        DQ = 1;          //DQ復(fù)位
        delay_18B20(4); //延時(shí)
        DQ = 0;          //DQ拉低
        delay_18B20(100); //精確延時(shí)大于480us
        DQ = 1;          //拉高
        delay_18B20(40);
}

uchar ds1820rd(void)/*讀數(shù)據(jù)*/
{
        unsigned char i=0;
        unsigned char dat = 0;
        for (i=8;i>0;i--)
        {   
                DQ = 0; //給脈沖信號(hào)
                dat>>=1;
                DQ = 1; //給脈沖信號(hào)
                if(DQ)
                dat|=0x80;
                delay_18B20(10);
        }
   return(dat);
}

void ds1820wr(uchar wdata)/*寫數(shù)據(jù)*/
{
        unsigned char i=0;
   for (i=8; i>0; i--)
   {
                DQ = 0;
                DQ = wdata&0x01;
                delay_18B20(10);
                DQ = 1;
                wdata>>=1;
   }
}

unsigned int Read_Temperature(void)/*讀取溫度值并轉(zhuǎn)換*/
{
        uchar a,b;
        ds1820rst();   
        ds1820wr(0xcc);//*跳過讀序列號(hào)*/
        ds1820wr(0x44);//*啟動(dòng)溫度轉(zhuǎn)換*/
        ds1820rst();   
        ds1820wr(0xcc);//*跳過讀序列號(hào)*/
        ds1820wr(0xbe);//*讀取溫度*/
        a=ds1820rd();
        b=ds1820rd();
        tvalue=b;
        tvalue<<=8;
        tvalue=tvalue|a;
   if(tvalue<0x0fff)   tflag=0;
   else   {tvalue=~tvalue+1;tflag=1;}
        tvalue=tvalue*(0.625);//溫度值擴(kuò)大10倍,精確到1位小數(shù)
        CurrentT=tvalue;
        return(tvalue);
}

void Display_Temperature()                //顯示溫度
{
        uchar flagdat;
   disdata[0]=tvalue/1000+0x30;//百位數(shù)
   disdata[1]=tvalue%1000/100+0x30;//十位數(shù)
   disdata[2]=tvalue%100/10+0x30;//個(gè)位數(shù)
   disdata[3]=tvalue%10+0x30;//小數(shù)位

   if(tflag==0)   flagdat=0x20;//正溫度不顯示符號(hào)
   else   flagdat=0x2d;//負(fù)溫度顯示負(fù)號(hào):-
   //if(disdata[0]==0x30)
   //{
        //        disdata[0]=0x20;//如果百位為0,不顯示
        //        if(disdata[1]==0x30)         disdata[1]=0x20;//如果百位為0,十位為0也不顯示
   //}
        if(tflag==1)
        {
                writeChar(10,0,flagdat);//wr_com(0x8a);wr_dat(flagdat);//顯示符號(hào)位
                writeChar(11,0,disdata[0]);//wr_com(0x8b);wr_dat(disdata[0]);//顯示百位
                writeChar(12,0,disdata[1]);//wr_com(0x8c);wr_dat(disdata[1]);//顯示十位
                writeChar(13,0,disdata[2]);//wr_com(0x8d);wr_dat(disdata[2]);//顯示個(gè)位
                writeChar(14,0,0X2E);//wr_com(0x8e);wr_dat(0x2e);//顯示小數(shù)點(diǎn)
                writeChar(15,0,disdata[3]);//wr_com(0x8f);                wr_dat(disdata[3]);//顯示小數(shù)位
        }
        else
        {
                writeChar(10,0,disdata[0]);//wr_com(0x8a);wr_dat(disdata[0]);//顯示百位
                writeChar(11,0,disdata[1]);//wr_com(0x8b);wr_dat(disdata[1]);//顯示十位
                writeChar(12,0,disdata[2]);//wr_com(0x8c);wr_dat(disdata[2]);//顯示個(gè)位
                writeChar(13,0,0X2e);//wr_com(0x8d);wr_dat(0x2e);//顯示小數(shù)點(diǎn)
                writeChar(14,0,disdata[3]);//wr_com(0x8e);wr_dat(disdata[3]);//顯示小數(shù)位
        }
}

void SetFun(void)
{
        unsigned char i1=0,i2=0,i3=0,i4=0,i5=0,i6=0;
        if(SetKey==0)
        {
                delayms(20);
                if(SetKey==0)
                {
                        if(Set<2)        Set++;
                        else Set=0;
                }
                switch(Set)
                {
                        case 0:  writestring(0,1," ");writestring(8,1," ");break;
                        case 1:        writestring(0,1,">");writestring(8,1," ");break;
                        case 2:        writestring(0,1," ");writestring(8,1,">");break;
                }
                while(SetKey==0);
        }
       
        if((UpKey==0)&&(Set!=0))
        {
                delayms(20);
                if(UpKey==0)
                {
                        switch(Set)
                        {
                                case 1:        if(AlarmTempLow<99) AlarmTempLow++;else AlarmTempLow=99; break;
                                case 2:        if(AlarmTempTop<99) AlarmTempTop++;else AlarmTempTop=99; break;
                        }
                        i1 = AlarmTempLow/100;          //獲得溫度值的百位
                   i2 = AlarmTempLow%100/10;         //獲得溫度值的十位
                        i3 = AlarmTempLow%10;                 //獲得溫度值的個(gè)位
                       
                        i4 = AlarmTempTop/100;          //獲得溫度值的百位
                   i5 = AlarmTempTop%100/10;         //獲得溫度值的十位
                        i6 = AlarmTempTop%10;                 //獲得溫度值的個(gè)位
                        writestring(5,1,"   ");
                        writestring(13,1,"     ");
                        if(i1!=0)        writeChar(5,1,i1+'0');
                        if((i1==0)&&(i2!=0)) writeChar(5,1,i2+'0');
                        if(i1!=0) writeChar(6,1,i2+'0');
                        if((i1==0)&&(i2==0))        writeChar(5,1,i3+'0');
                        else if((i1==0)&&(i2!=0))        writeChar(6,1,i3+'0');
                        if((i1!=0))         writeChar(7,1,i3+'0');
                       
                        if(i4!=0)        writeChar(13,1,i4+'0');
                        if((i4==0)&&(i5!=0)) writeChar(13,1,i5+'0');
                        if(i4!=0) writeChar(14,1,i5+'0');
                        if((i4==0)&&(i5==0))        writeChar(13,1,i6+'0');
                        else if((i4==0)&&(i5!=0))        writeChar(14,1,i6+'0');
                        if((i4!=0)) writeChar(15,1,i6+'0');
                        while(UpKey==0);
                }
        }
       
        if((DnKey==0)&&(Set!=0))
        {
                delayms(20);
                if(DnKey==0)
                {
                        switch(Set)
                        {
                                case 1:        if(AlarmTempLow>0) AlarmTempLow--;else AlarmTempLow=0; break;
                                case 2:        if(AlarmTempTop>0) AlarmTempTop--;else AlarmTempTop=0; break;
                        }
                        i1 = AlarmTempLow/100;          //獲得溫度值的百位
                   i2 = AlarmTempLow%100/10;         //獲得溫度值的十位
                        i3 = AlarmTempLow%10;                 //獲得溫度值的個(gè)位
                       
                        i4 = AlarmTempTop/100;          //獲得溫度值的百位
                   i5 = AlarmTempTop%100/10;         //獲得溫度值的十位
                        i6 = AlarmTempTop%10;                 //獲得溫度值的個(gè)位
                       
                        writestring(5,1,"   ");
                        writestring(13,1,"     ");
                        if(i1!=0)        writeChar(5,1,i1+'0');
                        if((i1==0)&&(i2!=0)) writeChar(5,1,i2+'0');
                        if(i1!=0) writeChar(6,1,i2+'0');
                        if((i1==0)&&(i2==0))        writeChar(5,1,i3+'0');
                        else if((i1==0)&&(i2!=0))        writeChar(6,1,i3+'0');
                        if((i1!=0))         writeChar(7,1,i3+'0');
                       
                        if(i4!=0)        writeChar(13,1,i4+'0');
                        if((i4==0)&&(i5!=0)) writeChar(13,1,i5+'0');
                        if(i4!=0) writeChar(14,1,i5+'0');
                        if((i4==0)&&(i5==0))        writeChar(13,1,i6+'0');
                        else if((i4==0)&&(i5!=0))        writeChar(14,1,i6+'0');
                        if((i4!=0)) writeChar(15,1,i6+'0');
                       
                        /*writeChar(4,1,i1+'0');
                        writeChar(5,1,i2+'0');
                        writeChar(6,1,i3+'0');
                        writeChar(12,1,i4+'0');
                        writeChar(13,1,i5+'0');
                        writeChar(14,1,i6+'0');*/
                        while(DnKey==0);
                }
        }
}

void main(void)
{
        unsigned char i=0; //P3=0xef;
        P2=0xef;BEEP=1;
        LCD_Initial();         //LCD 初始化
        P0=0x00;
        en573=1;
        en573=0;
        P0=0x00;
        en1573=1;
        en1573=0;
        Read_Temperature(); //讀取溫度值
        writestring(1,0,"DS18B20 Alarmer");          //顯示“DS18B20 Alarmer”
        delayms(1000);                //延時(shí)1S
        writestring(0,0,"Current T=      ");          //顯示“Current T= ”
        writestring(0,1," Low=10  Top=40 ");          //顯示“ Low=10  Top=40 ”
       
        NG=0;
        while(1)
        {
                 Read_Temperature();        //        //讀取溫度值
                Display_Temperature();                //顯示溫度值
                SetFun();
                if((CurrentT<(AlarmTempTop*10))&&(CurrentT>(AlarmTempLow*10)))
                {
                        BEEP=1;
                }

                else if((CurrentT>(AlarmTempTop*10)))
                {
                        while(1)
                        {
                                BEEP=0;
                                delayms(200);
                                BEEP=1;
                                delayms(200);
                        }
                               
                }
                else if((CurrentT<(AlarmTempLow*10))||(tflag==1))
                {
                        while(1)
                        {
                                BEEP=0;
                                delayms(1000);
                                BEEP=1;
                                delayms(1000);
                        }
                }
        }       

}




評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:567172 發(fā)表于 2019-6-19 19:43 | 只看該作者
很好,不錯(cuò),有幫助
回復(fù)

使用道具 舉報(bào)

板凳
ID:555328 發(fā)表于 2019-10-12 22:02 | 只看該作者
li123456l 發(fā)表于 2019-6-19 19:43
很好,不錯(cuò),有幫助

你仿真成功了嗎?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产精品成人综合久久久 | 日韩视频在线免费观看 | 99国内精品久久久久久久 | 欧美精品电影一区 | 亚洲成人av一区二区 | av在线免费网站 | 一区视频| 日韩成人在线观看 | 亚洲精品第一国产综合野 | a级毛片毛片免费观看久潮喷 | 亚洲精品日韩在线 | 亚洲天堂色 | 在线成人免费视频 | 国产成人精品综合 | a视频在线观看 | 亚洲第一天堂 | 精品毛片在线观看 | 一二三四在线视频观看社区 | 欧美激情视频一区二区三区在线播放 | 中文字幕第5页 | 成年免费大片黄在线观看岛国 | 国产精品国产亚洲精品看不卡15 | 亚洲福利视频网 | 狠狠婷婷综合久久久久久妖精 | www.日韩av.com | 日韩欧美三级在线 | 欧美理论片在线观看 | 婷婷色网 | 日韩一区二区在线免费观看 | 97精品一区二区 | 日本黄色短片 | 欧美5区| 搞av.com | 国产黄色大片 | 日韩精品亚洲专区在线观看 | 青青久久av北条麻妃海外网 | 国产精品免费一区二区三区四区 | 亚洲夜夜爽 | 91小视频| 成人精品免费视频 | 五月婷婷丁香婷婷 |