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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

溫度檢測報警程序(可調上下限)

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

sbit DQ=P2^2;//ds18b20與單片機連接口
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;//溫度正負標志

               
#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)                 //延時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);                 //延時5ms
   EN=1;                                 //LCD使能
   delayms(5);                //延時5ms
   EN=0;                                //LCD不使能
}

void write_dat(uchar dat)          //LCD寫數據
{
   RS=1;                                        //RS為1
   LCD_BUS=dat;                //裝載數據
   delayms(5);                         //延時5ms
   EN=1;                                         //LCD使能
   delayms(5);                         //延時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)                         //判斷是否字符串的結尾
        {     
     write_dat( *s);    //顯示當前字符
                s ++;                             //字符串地址加1
        }
}

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

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


void LCD_Initial()                //LCD初始化
{

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


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

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

uchar ds1820rd(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_18B20(10);
        }
   return(dat);
}

void ds1820wr(uchar wdata)/*寫數據*/
{
        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)/*讀取溫度值并轉換*/
{
        uchar a,b;
        ds1820rst();   
        ds1820wr(0xcc);//*跳過讀序列號*/
        ds1820wr(0x44);//*啟動溫度轉換*/
        ds1820rst();   
        ds1820wr(0xcc);//*跳過讀序列號*/
        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);//溫度值擴大10倍,精確到1位小數
        CurrentT=tvalue;
        return(tvalue);
}

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

   if(tflag==0)   flagdat=0x20;//正溫度不顯示符號
   else   flagdat=0x2d;//負溫度顯示負號:-
   //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);//顯示符號位
                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]);//顯示個位
                writeChar(14,0,0X2E);//wr_com(0x8e);wr_dat(0x2e);//顯示小數點
                writeChar(15,0,disdata[3]);//wr_com(0x8f);                wr_dat(disdata[3]);//顯示小數位
        }
        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]);//顯示個位
                writeChar(13,0,0X2e);//wr_com(0x8d);wr_dat(0x2e);//顯示小數點
                writeChar(14,0,disdata[3]);//wr_com(0x8e);wr_dat(disdata[3]);//顯示小數位
        }
}

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;                 //獲得溫度值的個位
                       
                        i4 = AlarmTempTop/100;          //獲得溫度值的百位
                   i5 = AlarmTempTop%100/10;         //獲得溫度值的十位
                        i6 = AlarmTempTop%10;                 //獲得溫度值的個位
                        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;                 //獲得溫度值的個位
                       
                        i4 = AlarmTempTop/100;          //獲得溫度值的百位
                   i5 = AlarmTempTop%100/10;         //獲得溫度值的十位
                        i6 = AlarmTempTop%10;                 //獲得溫度值的個位
                       
                        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);                //延時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);
                        }
                }
        }       

}




評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

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

你仿真成功了嗎?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 色必久久 | 久久成人精品 | 日韩在线 | 久久国产一区 | 国产欧美日韩精品在线观看 | 国产成人精品午夜 | 伊人超碰在线 | 精品国产一区二区三区四区在线 | 一区二区成人 | 一级大黄 | 久久爱一区 | 亚洲欧美日本国产 | 91麻豆精品国产91久久久久久 | 日本欧美在线观看视频 | 毛片一级片 | 国产一区日韩在线 | 激情麻豆视频 | 国产精品精品视频 | 99精品视频免费观看 | 91精品在线观看入口 | 国产欧美精品区一区二区三区 | 精品一级 | 久久高清国产 | 日日摸日日添日日躁av | 国产美女在线观看 | 日韩成人 | 欧美色综合 | 91p在线观看 | 99在线精品视频 | 亚洲 欧美 日韩在线 | 国产成年人视频 | 亚洲国产成人在线 | 91夜色在线观看 | 在线观看av网站 | 精品日韩一区二区三区av动图 | 美女天天操 | 97久久精品午夜一区二区 | 国产精品久久网 | 一区二区三区亚洲 | 久久久久久久久91 | 国产视频一区在线 |