找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1551|回复: 0
打印 上一主题 下一主题
收起左侧

单片机+lcd1602的值不随着ds18b20改变,不知道咋弄

[复制链接]
跳转到指定楼层
楼主
#include<reg51.h>
#include<intrins.h>
#include<absacc.h>
#define uchar unsigned char
#define uint  unsigned int
#define BUSY  0x80

void Delay(uint);
void init_LCD(void);
void LCD_Command(uchar,uchar);
void LCD_Data(uchar);
void ReadyLCD(void);
void Display_char(uchar,uchar,uchar);
void Display_str(uchar,uchar,uchar code *Data);
void Change(void);
void Display(void);
void init_18B20(void);
uchar Read_18B20(void);
void Write_18B20(uchar);
void Read_temp(void);
void Delay_us(uchar i);
void Key_scan(void);
void Key_set(void);
void Key_inc(void);
void Key_dec(void);
void Alarm(void);

sbit LCD_RS=P2^0;
sbit LCD_RW=P2^1;
sbit LCD_EN=P2^2;
sbit DQ=P1^7;
sbit Normal=P2^4;
sbit Alarm_H=P2^5;
sbit Alarm_L=P2^6;
sbit Alarm_BEEP=P2^7;

uchar Set_flag=0;
uchar Temp_mea,Temp_set1,Temp_set2;
uchar Temp_high_1,Temp_high_2;
uchar Temp_low_1,Temp_low_2;
uchar Temp_true_1,Temp_true_2;

extern uchar code str0[]={"High:  C Low:  C"};
extern uchar code str1[]={"Mode:    Deg:  C"};
extern uchar code str2[]={"    Hellow!!    "};
extern uchar code str3[]={"0123456789"};
extern uchar code mode[]={"NHL"};

/********主程序********/
void main(void)
{
        P1=0xff;
        P2|=0x70;
        P2&=0x7f;
        Temp_set1=35;          //上限报警温度初值35
        Temp_set2=5;          //下限报警温度初值5
        Delay(500);             //延时500ms启动
        init_LCD();              //LCD初始化
        init_18B20();            //DS18B20初始化
        Display_str(0,0,str2);     //开机界面
        Display_str(0,1,str2);     //开机界面
        Delay(2000);
        Display_str(0,0,str0);
        Display_str(0,1,str1);
        while(1)
        {
                Key_scan();       //扫描键盘
                Read_temp();     //读取温度
                Change();
                Display();        //显示
                Alarm();         //指示灯与报警程序
                Delay(1000);
        }
}

/********延时kms********/
void Delay(uint k)
{
        uint i,j;
        for(i=0;i<k;i++)
        {
                for(j=0;j<60;j++)
                {
                        ;
                }
        }
}
/********显示模块********/
/********LCD初始化********/
void init_LCD(void)
{
        P0=0;
        Delay(15);
        LCD_Command(0x38,0);
        Delay(5);
        LCD_Command(0x38,0);
        Delay(5);
        LCD_Command(0x38,0);
        Delay(5);
        LCD_Command(0x38,1);  //8位数据传送,2行显示,5*7字形
        LCD_Command(0x08,1);  //关闭显示
        LCD_Command(0x01,1);  //清屏
        LCD_Command(0x06,1);  //显示光标右移设置
        LCD_Command(0x0c,1);  //显示屏打开,光标不显示不闪烁
}

/********写指令数据到LCD********/
void LCD_Command(uchar LC,uchar BC)
{
        if(BC) ReadyLCD();
        P0=LC;
        LCD_RS=0;      //选中指令寄存器
        LCD_RW=0;      //写模式
        LCD_EN=1;
        _nop_();
        _nop_();
        _nop_();
        LCD_EN=0;
}

/********写显示数据到LCD********/
void LCD_Data(uchar LD)
{
        ReadyLCD();
        P0=LD;
        LCD_RS=1;      //选中数据寄存器
        LCD_RW=0;      //写模式
        LCD_EN=1;
        _nop_();
        _nop_();
        _nop_();
        LCD_EN=0;
}

/********检测LCD忙状态********/
void ReadyLCD(void)
{
        P0=0xff;
        LCD_EN=1;
        LCD_RS=0;
        LCD_RW=1;
        _nop_();
        while(P0&BUSY)
        {
                LCD_EN=0;
                _nop_();
          _nop_();
                LCD_EN=1;
                _nop_();
          _nop_();
        }
  LCD_EN=0;
}

/********显示一个字符********/
void Display_char(uchar X,uchar Y,uchar Data)
{
        Y&=0x01;
        X&=0x0f;
        if(Y) X|=0x40;
        X|=0x80;
        LCD_Command(X,0);
        LCD_Data(Data);
}

/********显示一串字符********/
void Display_str(uchar X,uchar Y,uchar code *Data)
{
        uchar List=0;
        Y&=0x01;
        X&=0x0f;
        while(X<16)
        {
                Display_char(X,Y,Data[List]);
                List++;
                X++;
        }               
}

/********显示字型转换********/
void Change(void)
{
        Temp_high_1=Temp_set1/10;
        Temp_high_2=Temp_set1%10;
        Temp_low_1=Temp_set2/10;
        Temp_low_2=Temp_set2%10;
        Temp_true_1=Temp_mea/10;
        Temp_true_2=Temp_mea%10;
}

/********显示子程序********/
void Display(void)
{
        Display_char(5,0,str3[Temp_high_1]);
        Display_char(6,0,str3[Temp_high_2]);
        Display_char(13,0,str3[Temp_low_1]);
        Display_char(14,0,str3[Temp_low_2]);
        Display_char(5,1,mode[Set_flag]);
        Display_char(13,1,str3[Temp_true_1]);
        Display_char(14,1,str3[Temp_true_2]);
}

/********温度测量模块********/
/********DS18B20初始化********/
void init_18B20(void)
{
        uchar x=0;
        DQ=1;            //DQ复位
        Delay_us(4);       //延时
        DQ=0;            //将DQ拉低
        Delay_us(250);     //精确延时大于480us
        DQ=1;            //拉高总线
        Delay_us(40);
        x=DQ;
        Delay_us(20);
}

/********从DS18B20读取一个字节数据********/
uchar Read_18B20(void)
{
        uchar i=0;
        uchar dat=0;
        for(i=8;i>0;i--)
        {
                DQ=0;
                _nop_();
                dat>>=1;
                DQ=1;
                Delay_us(1);
                if(DQ) dat|=0x80;
                Delay_us(10);
        }
return(dat);
}


/********向DS18B20写入一个字节数据********/
void Write_18B20(uchar dat)
{
        uchar i=0;
        for(i=8;i>0;i--)
        {
                DQ=0;
                _nop_();
                DQ=dat&0x01;
                Delay_us(10);
                DQ=1;
                dat>>=1;
                Delay_us(10);
        }
}

/********从DS18B20读取温度********/
void Read_temp(void)
{
        uchar a=0;
        uchar b=0;
        uchar t=0;
        init_18B20();
        Write_18B20(0xcc);
        Write_18B20(0x44);
        init_18B20();
        Write_18B20(0xcc);
        Write_18B20(0xbe);
        a=Read_18B20();
        b=Read_18B20();
        t=b;
        t<<=8;
        t=t|a;
  Temp_mea=t*(0.0625);
}

/********精确延时********/
void Delay_us(uchar i)
{
  while(--i);
}

/********键盘扫描程序********/
void Key_scan(void)
{
        uchar temp;
        P1=0xff;
        if(P1!=0xff)
        {
                Delay(20);  //延时消抖
                if(P1!=0xff)
                {
                        temp=P1;
                        switch(temp)
                        {
                                case 0xfe:Key_set();break; //P1.0按下,功能选择
                                case 0xfd:Key_inc();break; //P1.1按下,数字加一
                                case 0xfb:Key_dec();break; //P1.2按下,数字减一
                                default:break;
                        }
                }
        }
}

/********工作模式子程序********/
void Key_set(void)
{
        Set_flag++;
        if(Set_flag>=3)  //Set_flag=1,设定上限值
                Set_flag=0;    //Set_flag=2,设定下限值
}

/********按键加一子程序********/
void Key_inc(void)
{
        switch(Set_flag)
        {
                case 1:Temp_set1++;
                       if(Temp_set1>=99) Temp_set1=99;break;
                case 2:Temp_set2++;
                       if(Temp_set2>=Temp_set1) Temp_set2=Temp_set1;break;
                default:break;
        }
}

/********按键减一子程序********/
void Key_dec(void)
{
        //Delay(150);
        switch(Set_flag)
        {
                case 1:Temp_set1--;
                       if(Temp_set1<=Temp_set2) Temp_set1=Temp_set2;break;
                case 2:Temp_set2--;
                       if(Temp_set2<=1) Temp_set2=1;break;
                default:break;
        }
}

/********报警和指示程序********/
void Alarm(void)
{
        uchar High;
        uchar Low;
        High=Temp_set1+1;
        Low=Temp_set2-1;
        if(Temp_mea>High)
        {
                Normal=1;
                Alarm_H=0;
                Alarm_L=1;
                Alarm_BEEP=1;
  }
        else
        {if(Temp_mea<Low)
                {
                        Normal=1;
                        Alarm_H=1;
                        Alarm_L=0;
                        Alarm_BEEP=1;
                }
                else
                {
                        Normal=0;
                        Alarm_H=1;
                        Alarm_L=1;
                        Alarm_BEEP=0;
    }
        }
}

捕获2.JPG (81.63 KB, 下载次数: 56)

捕获2.JPG

捕获.JPG (339.52 KB, 下载次数: 54)

捕获.JPG
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表