找回密码
 立即注册

QQ登录

只需一步,快速开始

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

lcd1602显示不出来 只有一个数字在跳

[复制链接]
跳转到指定楼层
楼主
有大神知道是什么问题么
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:222948 发表于 2018-3-29 18:10 | 只看该作者
硬件没什么问题,看看你的程序
回复

使用道具 举报

板凳
ID:299035 发表于 2018-3-29 18:50 | 只看该作者
上程序啊!
回复

使用道具 举报

地板
ID:299027 发表于 2018-3-29 18:51 | 只看该作者
应该是时序没设置好吧
回复

使用道具 举报

5#
ID:295009 发表于 2018-3-29 19:35 | 只看该作者
#include<reg51.h>//定义函数
#include<intrins.h>
typedef unsigned char uchar;//无符号8位整型变量   
typedef unsigned int  uint;//无符号16位整型变量   
sbit RS=P2^7;//LCD1602数据/命令选择端(H/L)
sbit RW=P2^6;//LCD1602读/写选择端(H/L)
sbit E=P2^5;//LCD1602使能信号端
sbit DATA=P3^6;
sbit SCK=P3^7;
sbit k1=P3^2;//总设置按键
sbit k2=P3^3;//设置按键
sbit k3=P3^4;//+按键
sbit k4=P3^5;//-按键
sbit beep=P2^0;
sbit D1=P1^0;//高温报警指示灯
sbit D2=P1^1;//低温报警指示灯
sbit D3=P1^2;//高湿度报警指示灯
sbit D4=P1^3;//低湿度报警指示灯
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
sbit IO=P1^5;         
sbit SCLK=P1^6;   
sbit RST=P1^7;
uchar idata wendu[6];                                 
uchar idata shidu[6];
uchar code table1[]="   2013-08-30   ";
uchar code table2[]="  QQ:383459194  ";
uchar code table3[]=" gaowenbaojing  ";
uchar code table4[]="  diwenbaojing  ";
uchar code table5[]="gaoshidubaojing ";
uchar code table6[]=" dishidubaojing ";
uchar code table7[]="gaowen+gaoshidu ";
uchar code table8[]=" gaowen+dishidu ";
uchar code table9[]=" diwen+gaoshidu ";
uchar code table10[]=" diwen+dishidu  ";
uchar code table11[]="   this is ok   ";
uchar code table12[]="                ";
uchar code table13[]="      :  :      ";
enum {TEMP,HUMI};
typedef union //定义共用同类型
{        
        uint i;
        float f;
}         value;
uchar a,b,c,d,num,flag=0,m=0,num1=0;
char miao,shi,fen;
uchar ccc,ri,yue,nian,zhou,flag1;
//延时子函数
void delay(uint z)
{      
        uint x,y;
        for(x=z;x>0;x--)
                for(y=120;y>0;y--);
}
//按键提示音子函数
void di()
{
        beep=0;
        delay(100);
        beep=1;
}
//往DS1302时钟芯片写入一字节子函数
void inputbyte(uchar add)
{
    uchar i;
    ACC=add;
    for(i=8;i>0;i--)
    {
        IO=ACC0;
        SCLK=1;
        SCLK=0;
        ACC=ACC>>1;
    }
}
//DS1302时钟芯片输出一字节子函数
uchar outputbyte()
{
    uchar i;
    for(i=8;i>0;i--)
    {
        ACC=ACC>>1;
        ACC7=IO;
        SCLK=1;
        SCLK=0;
    }
    return ACC;
}
//往DS1302时钟芯片写入数据子函数
void write_ds(uchar add,uchar ucda)
{
    RST=0;
    SCLK=0;
    RST=1;
    inputbyte(add);
    inputbyte(ucda);
    SCLK=1;
    RST=0;
}
//从DS1302时钟芯片读出数据子函数
uchar read_ds(uchar add)
{
    uchar ucda;
    RST=0;
    SCLK=0;
    RST=1;
    inputbyte(add);
    ucda=outputbyte();
    SCLK=1;
    RST=0;
    return(ucda);
}
//设置DS1302时钟芯片子函数
void write_setds(uchar addr,uchar date)
{
    write_ds(0x8e,0x00);
    write_ds(addr,date);
    write_ds(0x8e,0x80);
}
//检查LCD1602液晶忙位子函数
void LCD1602_busy()
{  
        uchar i=0;
        RS=0;
        RW=1;
        E=1;
        P0=0xff;
        i=0;
        while(((P0&0x80)==0x80)&&i<150)
                i++;
        E=0;
}
//LCD1602液晶写指令子函数
void write_com(uchar com)               
{
        LCD1602_busy();
        RS=0;
        RW=0;
        P0=com;       
        E=1;
        E=0;
}
//LCD1602液晶写数据子函数
void write_date(uchar date)               
{
        LCD1602_busy();
        RS=1;
        RW=0;
        P0=date;
        E=1;
        E=0;
}
//LCD1602液晶初始化子函数
void LCD1602_init()                                //初始化设置
{
        //uchar i;
        write_com(0x38);
        write_com(0x0c);
        write_com(0x06);
        write_com(0x01);
        /*write_com(0x80);
        for(i=0;i<16;i++)
        {
                write_date(table1[i]);
                delay(500);
        }
        write_com(0xc0);
        for(i=0;i<16;i++)
        {
                write_date(table2[i]);
                delay(500);
        }*/
        a=35;
        b=10;
        c=65;
        d=40;
}
//SHT10写字节子函数
char s_write_byte(uchar value)   
{
        uchar i,error=0;
        for(i=0x80;i>0;i>>=1)             //高位为1,循环右移
        {
                if(i&value)
                        DATA=1;//和要发送的数相与,结果为发送的位
            else
                        DATA=0;                        
            SCK=1;                          
            _nop_();
                _nop_();
                _nop_();//延时3us
            SCK=0;
        }
        DATA=1;                           //释放数据线
        SCK=1;                           
        error=DATA;                       //检查应答信号,确认通讯正常
        _nop_();
        _nop_();
        _nop_();
        SCK=0;        
        DATA=1;
        return error;                     //error=1 通讯错误
}
//SHT10读字节子函数
char s_read_byte(uchar ack)
{
        uchar i,val=0;
        DATA=1;                           //释放数据线
        for(i=0x80;i>0;i>>=1)             //高位为1,循环右移
        {
                SCK=1;                        
            if(DATA)
                        val=(val|i);             //读一位数据线的值
            SCK=0;      
        }
        DATA=!ack;                        //如果是校验,读取完后结束通讯;
        SCK=1;                           
        _nop_();
        _nop_();
        _nop_();//延时3us
        SCK=0;   
        _nop_();
        _nop_();
        _nop_();      
        DATA=1;                           //释放数据线
        return val;
}
//SHT10启动传输子函数
void s_transstart()
{
           DATA=1;
        SCK=0;                   //准备
           _nop_();
          SCK=1;
           _nop_();
           DATA=0;
           _nop_();
          SCK=0;
           _nop_();
         _nop_();
         _nop_();
           SCK=1;
           _nop_();
          DATA=1;     
          _nop_();
           SCK=0;     
}
//SHT10连接复位子函数
void s_connectionreset()
{
        uchar i;
        DATA=1;
        SCK=0;//准备
        for(i=0;i<9;i++)                  //DATA保持高,SCK时钟触发9次,发送启动传输,通迅即复位
        {
                SCK=1;
            SCK=0;
        }
        s_transstart();                   //启动传输
}
//SHT10温湿度检测子函数
char s_measure(uchar *p_value,uchar *p_checksum,uchar mode)
{
        unsigned error=0;
        uint i;
        s_transstart();                   //启动传输
        switch(mode)                      //选择发送命令
    {       
                case TEMP:         error+=s_write_byte(0x03);
                                        break;                   //测量温度
            case HUMI:        error+=s_write_byte(0x05);
                                        break;                   //测量湿度
            default:         break;
        }
        for(i=0;i<65535;i++)
                if(DATA==0)
                        break;        //等待测量结束
        if(DATA)
                error+=1;                              // 如果长时间数据线没有拉低,说明测量错误
        *(p_value)=s_read_byte(1);                    //读第一个字节,高字节 (MSB)
        *(p_value+1)=s_read_byte(1);                    //读第二个字节,低字节 (LSB)
        *p_checksum=s_read_byte(0);                //read CRC校验码
        return error;                                        // error=1 通讯错误
}
//SHT10温湿度值标度变换及温度补偿子函数
void calc_sth10(float *p_humidity ,float *p_temperature)
{
        const float C1=-4.0;              // 12位湿度精度 修正公式
        const float C2=+0.0405;           // 12位湿度精度 修正公式
        const float C3=-0.0000028;        // 12位湿度精度 修正公式
        const float T1=+0.01;             // 14位温度精度 5V条件  修正公式
        const float T2=+0.00008;          // 14位温度精度 5V条件  修正公式
        float rh=*p_humidity;             // rh:      12位 湿度
        float t=*p_temperature;           // t:       14位 温度
        float rh_lin;                     // rh_lin: 湿度 linear值
        float rh_true;                    // rh_true: 湿度 ture值
        float t_C;                        // t_C   : 温度 ℃
        t_C=t*0.01-40;                  //补偿温度
        rh_lin=C3*rh*rh+C2*rh+C1;     //相对湿度非线性补偿
        rh_true=(t_C-25)*(T1+T2*rh)+rh_lin;   //相对湿度对于温度依赖性补偿
        if(rh_true>100)
                rh_true=100;       //湿度最大修正
        if(rh_true<0.1)
                rh_true=0.1;       //湿度最小修正
        *p_temperature=t_C;               //返回温度结果
        *p_humidity=rh_true;              //返回湿度结果
}
//往LCD1602液晶写入日期子函数
void write_nyr(uchar add,uchar date)
{
    uchar shi,ge ;
    shi=date/10;
    ge=date%10;
    write_com(0x80+0x01+add);
    write_date(0x30+shi);
    write_date(0x30+ge);
}
//往LCD1602液晶写入时间子函数
void write_sfm1(uchar add,uchar date)
{
    uchar shi,ge;
    shi=date/10;
    ge=date%10;
    write_com(0x80+0x42+add);
    write_date(0x30+shi);
    write_date(0x30+ge);
}
//电子万年历显示子函数
void display1()
{       
        if(flag1!=1)
    {
            uchar d;
            d=read_ds(0x81);
            miao=(d/16)*10+(d%16);
            write_sfm1(8,miao);
            d=read_ds(0x83);
            fen=(d/16)*10+(d%16);
            write_sfm1(5,fen);
            d=read_ds(0x85);
            shi=(d/16)*10+(d%16);
            write_sfm1(2,shi);
            d=read_ds(0x87);
            ri=(d/16)*10+(d%16);
            write_nyr(8,ri);
            d=read_ds(0x89);
            yue=(d/16)*10+(d%16);
            write_nyr(5,yue);
                d=read_ds(0x8b);
            zhou=d%16;
            write_nyr(12,zhou);
            d=read_ds(0x8d);
            nian=(d/16)*10+(d%16);
            write_nyr(2,nian);
    }
}
//温湿度显示子函数
void display()
{
        write_com(0x80+1);
        write_date('T');
        write_com(0x80+2);
        write_date('=');
        write_com(0x80+3);
        write_date(wendu[0]);
        write_com(0x80+4);
        write_date(wendu[1]);
        write_com(0x80+5);
        write_date(wendu[2]);
        write_com(0x80+6);
        write_date(wendu[3]);
        write_com(0x80+7);
        write_date(wendu[4]);
        write_com(0x80+8);
        write_date(' ');
        write_com(0x80+9);
        write_date('R');
        write_com(0x80+10);
        write_date('=');
        write_com(0x80+11);
        write_date(shidu[0]);
        write_com(0x80+12);
        write_date(shidu[1]);
        write_com(0x80+13);
        write_date(shidu[2]);
        write_com(0x80+14);
        write_date(shidu[3]);
        write_com(0x80+15);
        write_date(shidu[4]);
}
//LCD1602液晶写参数子函数
void write_sfm(uchar aaa,uchar bbb)
{
        uchar shi,ge;
        shi=bbb/10;
        ge=bbb%10;
        write_com(0x80+0x40+aaa);
        write_date(0x30+shi);
        write_date(0x30+ge);
}
//按键扫描子函数
void keyscan()
{
        uchar i=100,e;
        if(k1==0&&num==0&&num1==0)
        {
                delay(10);
                if(k1==0&&num==0&&num1==0)
                {
                        while(k1==0&&num1==0&&num==0&&i)
                        {
                                i--;
                                delay(10);
                        }
                        di();
                        flag++;
                        if(flag==1)
                        {
                                write_com(0x01);
                                delay(5);
                                write_com(0x80+1);
                                write_date('2');
                                write_com(0x80+2);
                                write_date('0');
                                write_com(0x80+5);
                            write_date('-');
                                write_com(0x80+8);
                                   write_date('-');
                            write_com(0xc0+6);
                            write_date(':');
                            write_com(0xc0+9);
                            write_date(':');
                        }                       
                        if(flag>=2)
                        {
                                write_com(0x01);
                                delay(5);
                                flag=0;
                        }
                }
        }
        if(k2==0&&flag==0&&num1==0)
        {
                delay(10);
                if(k2==0&&flag==0&&num1==0)
                {
                        while(k2==0&&num1==0&&flag==0&&i)
                        {
                                i--;
                                delay(10);
                        }
                        di();
                        num++;
                        if(num==1)
                        {
                                write_com(0xc0);
                                for(e=0;e<16;e++)
                                        write_date(table12[e]);
                                write_com(0xc0+4);
                                write_date('T');
                                write_com(0xc0+5);
                                write_date('H');
                                write_com(0xc0+6);
                                write_date('=');
                                write_com(0xc0+7);
                                write_date(a/10+0x30);
                                write_com(0xc0+8);
                                write_date(a%10+0x30);
                                write_com(0xc0+9);
                                write_date(0xdf);
                                write_com(0xc0+10);
                                write_date(0x43);
                        }
                        if(num==2)
                        {
                                write_com(0xc0+4);
                                write_date('T');
                                write_com(0xc0+5);
                                write_date('L');
                                write_com(0xc0+6);
                                write_date('=');
                                write_com(0xc0+7);
                                write_date(b/10+0x30);
                                write_com(0xc0+8);
                                write_date(b%10+0x30);
                                write_com(0xc0+9);
                                write_date(0xdf);
                                write_com(0xc0+10);
                                write_date(0x43);
                        }
                        if(num==3)
                        {
                                write_com(0xc0);
                                for(e=0;e<16;e++)
                                        write_date(table12[e]);
                                write_com(0xc0+4);
                                write_date('R');
                                write_com(0xc0+5);
                                write_date('H');
                                write_com(0xc0+6);
                                write_date('=');
                                write_com(0xc0+7);
                                write_date(c/10+0x30);
                                write_com(0xc0+8);
                                write_date(c%10+0x30);
                                write_com(0xc0+9);
                                write_date('%');
                        }
                        if(num==4)
                        {
                                write_com(0xc0+4);
                                write_date('R');
                                write_com(0xc0+5);
                                write_date('L');
                                write_com(0xc0+6);
                                write_date('=');
                                write_com(0xc0+7);
                                write_date(d/10+0x30);
                                write_com(0xc0+8);
                                write_date(d%10+0x30);
                                write_com(0xc0+9);
                                write_date('%');
                        }
                        if(num>=5)
                        {
                                num=0;
                        }
                }
        }
        if(num!=0&&flag==0&&num1==0)
        {
                if(k3==0)
                {
                        delay(10);
                        if(k3==0)
                        {
                                while(k3==0&&i)
                                {
                                        i--;
                                        delay(10);
                                }
                                di();
                                if(num==1)
                                {
                                        a++;
                                        if(a==50)
                                                a=35;
                                        write_sfm(7,a);
                                        write_com(0xc0+8);       
                                }
                                if(num==2)
                                {
                                        b++;
                                        if(b==30)
                                                b=10;
                                        write_sfm(7,b);
                                        write_com(0xc0+8);       
                                }
                                if(num==3)
                                {
                                        c++;
                                        if(c==95)
                                                c=65;
                                        write_sfm(7,c);
                                        write_com(0xc0+8);       
                                }
                                if(num==4)
                                {
                                        d++;
                                        if(d==60)
                                                d=40;
                                        write_sfm(7,d);
                                        write_com(0xc0+8);       
                                }
                        }
                }
                if(k4==0)
                {
                        delay(10);
                        if(k4==0)
                        {
                                while(k4==0&&i)
                                {
                                        i--;
                                        delay(10);
                                }
                                di();
                                if(num==1)
                                {
                                        a--;
                                        if(a==15)
                                                a=35;
                                        write_sfm(7,a);
                                        write_com(0xc0+8);       
                                }
                                if(num==2)
                                {
                                        b--;
                                        if(b==0)
                                                b=10;
                                        write_sfm(7,b);
                                        write_com(0xc0+8);       
                                }
                                if(num==3)
                                {
                                        c--;
                                        if(c==40)
                                                c=65;
                                        write_sfm(7,c);
                                        write_com(0xc0+8);       
                                }
                                if(num==4)
                                {
                                        d--;
                                        if(d==0)
                                                d=40;
                                        write_sfm(7,d);
                                        write_com(0xc0+8);       
                                }
                        }
                }
        }
        if(k2==0&&flag==1&&num==0)
        {
                delay(10);
                if(k2==0&&flag==1&&num==0)
                {
                        while(k2==0&&flag==1&&num==0&&i)
                        {
                                i--;
                                delay(10);
                        }
                        di();
                        num1++;
                        if(num1==1)
                {   
                            flag1=1;
                    write_ds(0x8e,0x80);
                    write_com(0x80+0x40+10);       
                    write_com(0x0f);
                           write_ds(0x8e,0x00);
                    ccc=read_ds(0x81);
                    miao=(ccc/16)*10+ccc%16;
                    ccc=read_ds(0x83);
                    fen=(ccc/16)*10+ccc%16;
                    ccc=read_ds(0x85);
                    shi=(ccc/16)*10+ccc%16;
                    ccc=read_ds(0x87);
                    ri=(ccc/16)*10+ccc%16;
                    ccc=read_ds(0x89);
                    yue=(ccc/16)*10+ccc%16;
                    ccc=read_ds(0x8b);
                    zhou=(ccc/16)*10+ccc%16;
                    ccc=read_ds(0x8d);
                    nian=(ccc/16)*10+ccc%16;                       
                }
                if(num1==2)
                    write_com(0x80+0x40+7);
                if(num1==3)
                    write_com(0x80+0x40+4);
                if(num1==4)
                    write_com(0x80+0x0d);
                if(num1==5)
                    write_com(0x80+0x09);
                if(num1==6)
                     write_com(0x80+6);
                         if(num1==7)
                     write_com(0x80+3);
                if(num1==8)
                {
                    num1=0;
                    write_com(0x0c);
                          write_ds(0x8e,0x80);
                                   flag1=0;   
                }
                }       
        }
        if(num1!=0&&flag==1&&num==0)//判断num值
        {
                if(k3==0&&flag==1&&num==0)//判断k2按键是否按下
                {
                        delay(10);//延时5毫秒
                        if(k3==0&&flag==1&&num==0)//再次判断k2按键是否按下
                        {
                                while(k3==0&&flag==1&&num==0&&i)//判断按键松手检测
                                {
                                        i--;
                                        delay(10);
                                }
                                di();//调用蜂鸣器子函数
                                if(num1==1)
                    {        
                        miao++;
                        if(miao==61)
                            miao=1 ;
                        write_sfm1(8,miao);
                        write_com(0x80+0x4a);
                    }
                    if(num1==2)
                    {
                        fen++;
                        if(fen==60)
                            fen=0;
                        write_sfm1(5,fen);
                        write_com(0x80+0x48);
                    }
                    if(num1==3)
                    {
                        shi++;
                        if(shi==24)
                            shi=0;
                        write_sfm1(2,shi);
                        write_com(0x80+0x40+5);
                    }
                                 if(num1==4)
                    {
                        zhou++;
                        if(zhou==8)
                                   zhou=1;
                        write_nyr(12,zhou);
                        write_com(0x80+0x0d);
                    }
                    if(num1==5)
                    {
                        ri++;
                        if(ri==32)
                                   ri=1;
                        write_nyr(8,ri);
                        write_com(0x80+0x0a);
                    }       
                    if(num1==6)
                    {
                        yue++;
                        if(yue==13)
                            yue=1;
                        write_nyr(5,yue);
                        write_com(0x80+7);
                    }
                    if(num1==7)
                    {
                        nian++;
                        write_nyr(2,nian);
                        write_com(0x80+4);
                    }
                        }
                }
                if(k4==0&&flag==1&&num==0)//判断k3按键是否按下
                {
                        delay(10);//延时10毫秒
                        if(k4==0&&flag==1&&num==0)//再次判断k3按键是否按下
                        {
                                while(k4==0&&flag==1&&num==0&&i)//判断按键松手检测
                                {
                                        i--;
                                        delay(10);
                                }
                                di();//调用蜂鸣器子函数
                                if(num1==1)
                    {        
                        miao--;
                        if(miao==-1)
                            miao=59;
                        write_sfm1(8,miao);
                        write_com(0x80+0x4a);
                    }
                    if(num1==2)
                    {
                        fen--;
                        if(fen==-1)
                            fen=59;
                        write_sfm1(5,fen);
                        write_com(0x80+0x48);
                    }
                    if(num1==3)
                    {
                        shi--;
                        if(shi==-1)
                            shi=23;
                        write_sfm1(2,shi);
                        write_com(0x80+0x45);
                    }
                                if(num1==4)
                    {
                        zhou--;
                        if(zhou==0)
                                   zhou=7;
                        write_nyr(12,zhou);
                        write_com(0x80+0x0d);
                    }
                    if(num1==5)
                    {
                        ri--;
                        if(ri==-1)
                                   ri=1;
                        write_nyr(8,ri);
                        write_com(0x80+0x0a);
                    }
                    if(num1==6)
                    {
                        yue--;
                        if(yue==0)
                            yue=12;
                        write_nyr(5,yue);
                        write_com(0x87);
                    }
                    if(num1==7)
                    {
                        nian--;
                        write_nyr(2,nian);
                        write_com(0x84);
                    }
                        }
                }
                write_ds(0x80,(miao/10)*16+miao%10);
            write_ds(0x82,(fen/10)*16+fen%10);
            write_ds(0x84,(shi/10)*16+shi%10);
            write_ds(0x86,(ri/10)*16+ri%10);
            write_ds(0x88,(yue/10)*16+yue%10);
                write_ds(0x8a,(zhou/10)*16+zhou%10);
            write_ds(0x8c,(nian/10)*16+nian%10);
        }               
}
//主函数
void main()
{
        uint temp,humi,i;
        uint aa,bb,cc,dd;
        value humi_val,temp_val;                //定义两个共同体,一个用于湿度,一个用于温度
        uchar error;                    //用于检验是否出现错误
        uchar checksum;
        LCD1602_init();//调用LCD1602液晶初始化子函数
        //delay(5000);//延时
        //write_com(0x01);
        write_setds(0x80,0x50);           
    write_setds(0x82,0x59);  
    write_setds(0x84,0x10);         
    write_setds(0x86,0x17);      
    write_setds(0x88,0x03);
        write_setds(0x8a,0x03);
        write_setds(0x8c,0x10);
        write_setds(0x90,0xa4);
        s_connectionreset();
        while(1)//大循环
        {
                keyscan();
                if(flag==1)
                {
                        display1();
                }
                if(flag==0&&num==0&&error==0&&num1==0)
                {
                        aa=a*10;
                        bb=b*10;
                        cc=c*10;
                        dd=d*10;
                        if(temp>aa&&temp>bb&&humi<cc&&humi>dd)
                        {
                                D1=0;
                                D2=1;
                                D3=1;
                                D4=1;
                                write_com(0xc0);
                                for(i=0;i<16;i++)
                                {
                                        write_date(table3[i]);
                                }
                        }
                        if(temp<aa&&temp<bb&&humi<cc&&humi>dd)
                        {
                                D1=1;
                                D2=0;
                                D3=1;
                                D4=1;
                                write_com(0xc0);
                                for(i=0;i<16;i++)
                                {
                                        write_date(table4[i]);
                                }
                        }
                        if(temp<aa&&temp>bb&&humi>cc&&humi>dd)
                        {
                                D1=1;
                                D2=1;
                                D3=0;
                                D4=1;
                                write_com(0xc0);
                                for(i=0;i<16;i++)
                                {
                                        write_date(table5[i]);
                                }
                        }
                        if(temp<aa&&temp>bb&&humi<cc&&humi<dd)
                        {
                                D1=1;
                                D2=1;
                                D3=1;
                                D4=0;
                                write_com(0xc0);
                                for(i=0;i<16;i++)
                                {
                                        write_date(table6[i]);
                                }
                        }
                        if(temp>aa&&temp>bb&&humi>cc&&humi>dd)
                        {
                                D1=0;
                                D2=1;
                                D3=0;
                                D4=1;
                                write_com(0xc0);
                                for(i=0;i<16;i++)
                                {
                                        write_date(table7[i]);
                                }
                        }
                        if(temp>aa&&temp>bb&&humi<cc&&humi<dd)
                        {
                                D1=0;
                                D2=1;
                                D3=1;
                                D4=0;
                                write_com(0xc0);
                                for(i=0;i<16;i++)
                                {
                                        write_date(table8[i]);
                                }
                        }
                        if(temp<aa&&temp<bb&&humi>cc&&humi>dd)
                        {
                                D1=1;
                                D2=0;
                                D3=0;
                                D4=1;
                                write_com(0xc0);
                                for(i=0;i<16;i++)
                                {
                                        write_date(table9[i]);
                                }
                        }
                        if(temp<aa&&temp<bb&&humi<cc&&humi<dd)
                        {
                                D1=0;
                                D2=0;
                                D3=1;
                                D4=0;
                                write_com(0xc0);
                                for(i=0;i<16;i++)
                                {
                                        write_date(table10[i]);
                                }
                        }
                        if(temp<aa&&temp>bb&&humi<cc&&humi>dd)
                        {
                                D1=1;
                                D2=1;
                                D3=1;
                                D4=1;
                                write_com(0xc0);
                                for(i=0;i<16;i++)
                                {
                                        write_date(table11[i]);
                                }
                        }       
                }
                if(flag==0)
                {       
                        error=0;                                           //初始化error=0,即没有错误
                        error+=s_measure((uchar*)&temp_val.i,&checksum,TEMP); //温度测量
                        error+=s_measure((uchar*)&humi_val.i,&checksum,HUMI); //湿度测量
                    if(error!=0)
                                s_connectionreset();//如果发生错误,系统复位
                    else
                    {
                                humi_val.f=(float)humi_val.i;                   //转换为浮点数
                             temp_val.f=(float)temp_val.i;                   //转换为浮点数
                             calc_sth10(&humi_val.f,&temp_val.f);            //修正相对湿度及温度
                                   temp=temp_val.f*10;
                             humi=humi_val.f*10;
                              wendu[0]=temp/1000+'0';                     //温度百位
                              wendu[1]=temp%1000/100+'0';             //温度十位       
                                   wendu[2]=temp%100/10+'0';                        //温度个位
                              wendu[3]=0x2E;                                                //小数点
                                   wendu[4]=temp%10+'0';                                //温度小数点后第一位                                                 
                                shidu[0]=humi/1000+'0';                     //湿度百位
                              shidu[1]=humi%1000/100+'0';             //湿度十位       
                                   shidu[2]=humi%100/10+'0';                        //湿度个位
                              shidu[3]=0x2E;                                                //小数点
                                   shidu[4]=humi%10+'0';                                //湿度小数点后第一位
                                display();               
                    }  
                        delay(800);
                }                         
        }
}
回复

使用道具 举报

6#
ID:295009 发表于 2018-3-29 19:46 | 只看该作者
  1. #include<reg51.h>//定义函数
  2. #include<intrins.h>
  3. typedef unsigned char uchar;//无符号8位整型变量   
  4. typedef unsigned int  uint;//无符号16位整型变量   
  5. sbit RS=P2^7;//LCD1602数据/命令选择端(H/L)
  6. sbit RW=P2^6;//LCD1602读/写选择端(H/L)
  7. sbit E=P2^5;//LCD1602使能信号端
  8. sbit DATA=P3^6;
  9. sbit SCK=P3^7;
  10. sbit k1=P3^2;//总设置按键
  11. sbit k2=P3^3;//设置按键
  12. sbit k3=P3^4;//+按键
  13. sbit k4=P3^5;//-按键
  14. sbit beep=P2^0;
  15. sbit D1=P1^0;//高温报警指示灯
  16. sbit D2=P1^1;//低温报警指示灯
  17. sbit D3=P1^2;//高湿度报警指示灯
  18. sbit D4=P1^3;//低湿度报警指示灯
  19. sbit ACC0=ACC^0;
  20. sbit ACC7=ACC^7;
  21. sbit IO=P1^5;         
  22. sbit SCLK=P1^6;   
  23. sbit RST=P1^7;
  24. uchar idata wendu[6];                                 
  25. uchar idata shidu[6];
  26. uchar code table1[]="   2013-08-30   ";
  27. uchar code table2[]="  QQ:383459194  ";
  28. uchar code table3[]=" gaowenbaojing  ";
  29. uchar code table4[]="  diwenbaojing  ";
  30. uchar code table5[]="gaoshidubaojing ";
  31. uchar code table6[]=" dishidubaojing ";
  32. uchar code table7[]="gaowen+gaoshidu ";
  33. uchar code table8[]=" gaowen+dishidu ";
  34. uchar code table9[]=" diwen+gaoshidu ";
  35. uchar code table10[]=" diwen+dishidu  ";
  36. uchar code table11[]="   this is ok   ";
  37. uchar code table12[]="                ";
  38. uchar code table13[]="      :  :      ";
  39. enum {TEMP,HUMI};
  40. typedef union //定义共用同类型
  41. {        
  42.         uint i;
  43.         float f;
  44. }         value;
  45. uchar a,b,c,d,num,flag=0,m=0,num1=0;
  46. char miao,shi,fen;
  47. uchar ccc,ri,yue,nian,zhou,flag1;
  48. //延时子函数
  49. void delay(uint z)
  50. {      
  51.         uint x,y;
  52.         for(x=z;x>0;x--)
  53.                 for(y=120;y>0;y--);
  54. }
  55. //按键提示音子函数
  56. void di()
  57. {
  58.         beep=0;
  59.         delay(100);
  60.         beep=1;
  61. }
  62. //往DS1302时钟芯片写入一字节子函数
  63. void inputbyte(uchar add)
  64. {
  65.     uchar i;
  66.     ACC=add;
  67.     for(i=8;i>0;i--)
  68.     {
  69.         IO=ACC0;
  70.         SCLK=1;
  71.         SCLK=0;
  72.         ACC=ACC>>1;
  73.     }
  74. }
  75. //DS1302时钟芯片输出一字节子函数
  76. uchar outputbyte()
  77. {
  78.     uchar i;
  79.     for(i=8;i>0;i--)
  80.     {
  81.         ACC=ACC>>1;
  82.         ACC7=IO;
  83.         SCLK=1;
  84.         SCLK=0;
  85.     }
  86.     return ACC;
  87. }
  88. //往DS1302时钟芯片写入数据子函数
  89. void write_ds(uchar add,uchar ucda)
  90. {
  91.     RST=0;
  92.     SCLK=0;
  93.     RST=1;
  94.     inputbyte(add);
  95.     inputbyte(ucda);
  96.     SCLK=1;
  97.     RST=0;
  98. }
  99. //从DS1302时钟芯片读出数据子函数
  100. uchar read_ds(uchar add)
  101. {
  102.     uchar ucda;
  103.     RST=0;
  104.     SCLK=0;
  105.     RST=1;
  106.     inputbyte(add);
  107.     ucda=outputbyte();
  108.     SCLK=1;
  109.     RST=0;
  110.     return(ucda);
  111. }
  112. //设置DS1302时钟芯片子函数
  113. void write_setds(uchar addr,uchar date)
  114. {
  115.     write_ds(0x8e,0x00);
  116.     write_ds(addr,date);
  117.     write_ds(0x8e,0x80);
  118. }
  119. //检查LCD1602液晶忙位子函数
  120. void LCD1602_busy()
  121. {  
  122.         uchar i=0;
  123.         RS=0;
  124.         RW=1;
  125.         E=1;
  126.         P0=0xff;
  127.         i=0;
  128.         while(((P0&0x80)==0x80)&&i<150)
  129.                 i++;
  130.         E=0;
  131. }
  132. //LCD1602液晶写指令子函数
  133. void write_com(uchar com)               
  134. {
  135.         LCD1602_busy();
  136.         RS=0;
  137.         RW=0;
  138.         P0=com;       
  139.         E=1;
  140.         E=0;
  141. }
  142. //LCD1602液晶写数据子函数
  143. void write_date(uchar date)               
  144. {
  145.         LCD1602_busy();
  146.         RS=1;
  147.         RW=0;
  148.         P0=date;
  149.         E=1;
  150.         E=0;
  151. }
  152. //LCD1602液晶初始化子函数
  153. void LCD1602_init()                                //初始化设置
  154. {
  155.         //uchar i;
  156.         write_com(0x38);
  157.         write_com(0x0c);
  158.         write_com(0x06);
  159.         write_com(0x01);
  160.         /*write_com(0x80);
  161.         for(i=0;i<16;i++)
  162.         {
  163.                 write_date(table1[i]);
  164.                 delay(500);
  165.         }
  166.         write_com(0xc0);
  167.         for(i=0;i<16;i++)
  168.         {
  169.                 write_date(table2[i]);
  170.                 delay(500);
  171.         }*/
  172.         a=35;
  173.         b=10;
  174.         c=65;
  175.         d=40;
  176. }
  177. //SHT10写字节子函数
  178. char s_write_byte(uchar value)   
  179. {
  180.         uchar i,error=0;
  181.         for(i=0x80;i>0;i>>=1)             //高位为1,循环右移
  182.         {
  183.                 if(i&value)
  184.                         DATA=1;//和要发送的数相与,结果为发送的位
  185.             else
  186.                         DATA=0;                        
  187.             SCK=1;                          
  188.             _nop_();
  189.                 _nop_();
  190.                 _nop_();//延时3us
  191.             SCK=0;
  192.         }
  193.         DATA=1;                           //释放数据线
  194.         SCK=1;                           
  195.         error=DATA;                       //检查应答信号,确认通讯正常
  196.         _nop_();
  197.         _nop_();
  198.         _nop_();
  199.         SCK=0;        
  200.         DATA=1;
  201.         return error;                     //error=1 通讯错误
  202. }
  203. //SHT10读字节子函数
  204. char s_read_byte(uchar ack)
  205. {
  206.         uchar i,val=0;
  207.         DATA=1;                           //释放数据线
  208.         for(i=0x80;i>0;i>>=1)             //高位为1,循环右移
  209.         {
  210.                 SCK=1;                        
  211.             if(DATA)
  212.                         val=(val|i);             //读一位数据线的值
  213.             SCK=0;      
  214.         }
  215.         DATA=!ack;                        //如果是校验,读取完后结束通讯;
  216.         SCK=1;                           
  217.         _nop_();
  218.         _nop_();
  219.         _nop_();//延时3us
  220.         SCK=0;   
  221.         _nop_();
  222.         _nop_();
  223.         _nop_();      
  224.         DATA=1;                           //释放数据线
  225.         return val;
  226. }
  227. //SHT10启动传输子函数
  228. void s_transstart()
  229. {
  230.            DATA=1;
  231.         SCK=0;                   //准备
  232.            _nop_();
  233.           SCK=1;
  234.            _nop_();
  235.            DATA=0;
  236.            _nop_();
  237.           SCK=0;
  238.            _nop_();
  239.          _nop_();
  240.          _nop_();
  241.            SCK=1;
  242.            _nop_();
  243.           DATA=1;     
  244.           _nop_();
  245.            SCK=0;     
  246. }
  247. //SHT10连接复位子函数
  248. void s_connectionreset()
  249. {
  250.         uchar i;
  251.         DATA=1;
  252.         SCK=0;//准备
  253.         for(i=0;i<9;i++)                  //DATA保持高,SCK时钟触发9次,发送启动传输,通迅即复位
  254.         {
  255.                 SCK=1;
  256.             SCK=0;
  257.         }
  258.         s_transstart();                   //启动传输
  259. }
  260. //SHT10温湿度检测子函数
  261. char s_measure(uchar *p_value,uchar *p_checksum,uchar mode)
  262. {
  263.         unsigned error=0;
  264.         uint i;
  265.         s_transstart();                   //启动传输
  266.         switch(mode)                      //选择发送命令
  267.     {       
  268.                 case TEMP:         error+=s_write_byte(0x03);
  269.                                         break;                   //测量温度
  270.             case HUMI:        error+=s_write_byte(0x05);
  271.                                         break;                   //测量湿度
  272.             default:         break;
  273.         }
  274.         for(i=0;i<65535;i++)
  275.                 if(DATA==0)
  276.                         break;        //等待测量结束
  277.         if(DATA)
  278.                 error+=1;                              // 如果长时间数据线没有拉低,说明测量错误
  279.         *(p_value)=s_read_byte(1);                    //读第一个字节,高字节 (MSB)
  280.         *(p_value+1)=s_read_byte(1);                    //读第二个字节,低字节 (LSB)
  281.         *p_checksum=s_read_byte(0);                //read CRC校验码
  282.         return error;                                        // error=1 通讯错误
  283. }
  284. //SHT10温湿度值标度变换及温度补偿子函数
  285. void calc_sth10(float *p_humidity ,float *p_temperature)
  286. {
  287.         const float C1=-4.0;              // 12位湿度精度 修正公式
  288.         const float C2=+0.0405;           // 12位湿度精度 修正公式
  289.         const float C3=-0.0000028;        // 12位湿度精度 修正公式
  290.         const float T1=+0.01;             // 14位温度精度 5V条件  修正公式
  291.         const float T2=+0.00008;          // 14位温度精度 5V条件  修正公式
  292.         float rh=*p_humidity;             // rh:      12位 湿度
  293.         float t=*p_temperature;           // t:       14位 温度
  294.         float rh_lin;                     // rh_lin: 湿度 linear值
  295.         float rh_true;                    // rh_true: 湿度 ture值
  296.         float t_C;                        // t_C   : 温度 ℃
  297.         t_C=t*0.01-40;                  //补偿温度
  298.         rh_lin=C3*rh*rh+C2*rh+C1;     //相对湿度非线性补偿
  299.         rh_true=(t_C-25)*(T1+T2*rh)+rh_lin;   //相对湿度对于温度依赖性补偿
  300.         if(rh_true>100)
  301.                 rh_true=100;       //湿度最大修正
  302.         if(rh_true<0.1)
  303.                 rh_true=0.1;       //湿度最小修正
  304.         *p_temperature=t_C;               //返回温度结果
  305.         *p_humidity=rh_true;              //返回湿度结果
  306. }
  307. //往LCD1602液晶写入日期子函数
  308. void write_nyr(uchar add,uchar date)
  309. {
  310.     uchar shi,ge ;
  311.     shi=date/10;
  312.     ge=date%10;
  313.     write_com(0x80+0x01+add);
  314.     write_date(0x30+shi);
  315.     write_date(0x30+ge);
  316. }
  317. //往LCD1602液晶写入时间子函数
  318. void write_sfm1(uchar add,uchar date)
  319. {
  320.     uchar shi,ge;
  321.     shi=date/10;
  322.     ge=date%10;
  323.     write_com(0x80+0x42+add);
  324.     write_date(0x30+shi);
  325.     write_date(0x30+ge);
  326. }
  327. //电子万年历显示子函数
  328. void display1()
  329. {       
  330.         if(flag1!=1)
  331.     {
  332.             uchar d;
  333.             d=read_ds(0x81);
  334.             miao=(d/16)*10+(d%16);
  335.             write_sfm1(8,miao);
  336.             d=read_ds(0x83);
  337.             fen=(d/16)*10+(d%16);
  338.             write_sfm1(5,fen);
  339.             d=read_ds(0x85);
  340.             shi=(d/16)*10+(d%16);
  341.             write_sfm1(2,shi);
  342.             d=read_ds(0x87);
  343.             ri=(d/16)*10+(d%16);
  344.             write_nyr(8,ri);
  345.             d=read_ds(0x89);
  346.             yue=(d/16)*10+(d%16);
  347.             write_nyr(5,yue);
  348.                 d=read_ds(0x8b);
  349.             zhou=d%16;
  350.             write_nyr(12,zhou);
  351.             d=read_ds(0x8d);
  352.             nian=(d/16)*10+(d%16);
  353.             write_nyr(2,nian);
  354.     }
  355. }
  356. //温湿度显示子函数
  357. void display()
  358. {
  359.         write_com(0x80+1);
  360.         write_date('T');
  361.         write_com(0x80+2);
  362.         write_date('=');
  363.         write_com(0x80+3);
  364.         write_date(wendu[0]);
  365.         write_com(0x80+4);
  366.         write_date(wendu[1]);
  367.         write_com(0x80+5);
  368.         write_date(wendu[2]);
  369.         write_com(0x80+6);
  370.         write_date(wendu[3]);
  371.         write_com(0x80+7);
  372.         write_date(wendu[4]);
  373.         write_com(0x80+8);
  374.         write_date(' ');
  375.         write_com(0x80+9);
  376.         write_date('R');
  377.         write_com(0x80+10);
  378.         write_date('=');
  379.         write_com(0x80+11);
  380.         write_date(shidu[0]);
  381.         write_com(0x80+12);
  382.         write_date(shidu[1]);
  383.         write_com(0x80+13);
  384.         write_date(shidu[2]);
  385.         write_com(0x80+14);
  386.         write_date(shidu[3]);
  387.         write_com(0x80+15);
  388.         write_date(shidu[4]);
  389. }
  390. //LCD1602液晶写参数子函数
  391. void write_sfm(uchar aaa,uchar bbb)
  392. {
  393.         uchar shi,ge;
  394.         shi=bbb/10;
  395.         ge=bbb%10;
  396.         write_com(0x80+0x40+aaa);
  397.         write_date(0x30+shi);
  398.         write_date(0x30+ge);
  399. }
  400. //按键扫描子函数
  401. void keyscan()
  402. {
  403.         uchar i=100,e;
  404.         if(k1==0&&num==0&&num1==0)
  405.         {
  406.                 delay(10);
  407.                 if(k1==0&&num==0&&num1==0)
  408.                 {
  409.                         while(k1==0&&num1==0&&num==0&&i)
  410.                         {
  411.                                 i--;
  412.                                 delay(10);
  413.                         }
  414.                         di();
  415.                         flag++;
  416.                         if(flag==1)
  417.                         {
  418.                                 write_com(0x01);
  419.                                 delay(5);
  420.                                 write_com(0x80+1);
  421.                                 write_date('2');
  422.                                 write_com(0x80+2);
  423.                                 write_date('0');
  424.                                 write_com(0x80+5);
  425.                             write_date('-');
  426.                                 write_com(0x80+8);
  427.                                    write_date('-');
  428.                             write_com(0xc0+6);
  429.                             write_date(':');
  430.                             write_com(0xc0+9);
  431.                             write_date(':');
  432.                         }                       
  433.                         if(flag>=2)
  434.                         {
  435.                                 write_com(0x01);
  436.                                 delay(5);
  437.                                 flag=0;
  438.                         }
  439.                 }
  440.         }
  441.         if(k2==0&&flag==0&&num1==0)
  442.         {
  443.                 delay(10);
  444.                 if(k2==0&&flag==0&&num1==0)
  445.                 {
  446.                         while(k2==0&&num1==0&&flag==0&&i)
  447.                         {
  448.                                 i--;
  449.                                 delay(10);
  450.                         }
  451.                         di();
  452.                         num++;
  453.                         if(num==1)
  454.                         {
  455.                                 write_com(0xc0);
  456.                                 for(e=0;e<16;e++)
  457.                                         write_date(table12[e]);
  458.                                 write_com(0xc0+4);
  459.                                 write_date('T');
  460.                                 write_com(0xc0+5);
  461.                                 write_date('H');
  462.                                 write_com(0xc0+6);
  463.                                 write_date('=');
  464.                                 write_com(0xc0+7);
  465.                                 write_date(a/10+0x30);
  466.                                 write_com(0xc0+8);
  467.                                 write_date(a%10+0x30);
  468.                                 write_com(0xc0+9);
  469.                                 write_date(0xdf);
  470.                                 write_com(0xc0+10);
  471.                                 write_date(0x43);
  472.                         }
  473.                         if(num==2)
  474.                         {
  475.                                 write_com(0xc0+4);
  476.                                 write_date('T');
  477.                                 write_com(0xc0+5);
  478.                                 write_date('L');
  479.                                 write_com(0xc0+6);
  480.                                 write_date('=');
  481.                                 write_com(0xc0+7);
  482.                                 write_date(b/10+0x30);
  483.                                 write_com(0xc0+8);
  484.                                 write_date(b%10+0x30);
  485.                                 write_com(0xc0+9);
  486.                                 write_date(0xdf);
  487.                                 write_com(0xc0+10);
  488.                                 write_date(0x43);
  489.                         }
  490.                         if(num==3)
  491.                         {
  492.                                 write_com(0xc0);
  493.                                 for(e=0;e<16;e++)
  494.                                         write_date(table12[e]);
  495.                                 write_com(0xc0+4);
  496.                                 write_date('R');
  497.                                 write_com(0xc0+5);
  498.                                 write_date('H');
  499.                                 write_com(0xc0+6);
  500.                                 write_date('=');
  501.                                 write_com(0xc0+7);
  502.                                 write_date(c/10+0x30);
  503.                                 write_com(0xc0+8);
  504.                                 write_date(c%10+0x30);
  505.                                 write_com(0xc0+9);
  506.                                 write_date('%');
  507.                         }
  508.                         if(num==4)
  509.                         {
  510.                                 write_com(0xc0+4);
  511.                                 write_date('R');
  512.                                 write_com(0xc0+5);
  513.                                 write_date('L');
  514.                                 write_com(0xc0+6);
  515.                                 write_date('=');
  516.                                 write_com(0xc0+7);
  517.                                 write_date(d/10+0x30);
  518.                                 write_com(0xc0+8);
  519.                                 write_date(d%10+0x30);
  520.                                 write_com(0xc0+9);
  521.                                 write_date('%');
  522.                         }
  523.                         if(num>=5)
  524.                         {
  525.                                 num=0;
  526.                         }
  527.                 }
  528.         }
  529.         if(num!=0&&flag==0&&num1==0)
  530.         {
  531.                 if(k3==0)
  532.                 {
  533.                         delay(10);
  534.                         if(k3==0)
  535.                         {
  536.                                 while(k3==0&&i)
  537.                                 {
  538.                                         i--;
  539.                                         delay(10);
  540.                                 }
  541.                                 di();
  542.                                 if(num==1)
  543.                                 {
  544.                                         a++;
  545.                                         if(a==50)
  546.                                                 a=35;
  547.                                         write_sfm(7,a);
  548.                                         write_com(0xc0+8);       
  549.                                 }
  550.                                 if(num==2)
  551.                                 {
  552.                                         b++;
  553.                                         if(b==30)
  554.                                                 b=10;
  555.                                         write_sfm(7,b);
  556.                                         write_com(0xc0+8);       
  557.                                 }
  558.                                 if(num==3)
  559.                                 {
  560.                                         c++;
  561.                                         if(c==95)
  562.                                                 c=65;
  563.                                         write_sfm(7,c);
  564.                                         write_com(0xc0+8);       
  565.                                 }
  566.                                 if(num==4)
  567.                                 {
  568.                                         d++;
  569.                                         if(d==60)
  570.                                                 d=40;
  571.                                         write_sfm(7,d);
  572.                                         write_com(0xc0+8);       
  573.                                 }
  574.                         }
  575.                 }
  576.                 if(k4==0)
  577.                 {
  578.                         delay(10);
  579.                         if(k4==0)
  580.                         {
  581.                                 while(k4==0&&i)
  582.                                 {
  583.                                         i--;
  584.                                         delay(10);
  585.                                 }
  586.                                 di();
  587.                                 if(num==1)
  588.                                 {
  589.                                         a--;
  590.                                         if(a==15)
  591.                                                 a=35;
  592.                                         write_sfm(7,a);
  593.                                         write_com(0xc0+8);       
  594.                                 }
  595.                                 if(num==2)
  596.                                 {
  597.                                         b--;
  598.                                         if(b==0)
  599.                                                 b=10;
  600.                                         write_sfm(7,b);
  601.                                         write_com(0xc0+8);       
  602.                                 }
  603.                                 if(num==3)
  604.                                 {
  605.                                         c--;
  606.                                         if(c==40)
  607.                                                 c=65;
  608.                                         write_sfm(7,c);
  609.                                         write_com(0xc0+8);       
  610.                                 }
  611.                                 if(num==4)
  612.                                 {
  613.                                         d--;
  614.                                         if(d==0)
  615.                                                 d=40;
  616.                                         write_sfm(7,d);
  617.                                         write_com(0xc0+8);       
  618.                                 }
  619.                         }
  620.                 }
  621.         }
  622.         if(k2==0&&flag==1&&num==0)
  623.         {
  624.                 delay(10);
  625.                 if(k2==0&&flag==1&&num==0)
  626.                 {
  627.                         while(k2==0&&flag==1&&num==0&&i)
  628.                         {
  629.                                 i--;
  630.                                 delay(10);
  631.                         }
  632.                         di();
  633.                         num1++;
  634.                         if(num1==1)
  635.                 {   
  636.                             flag1=1;
  637.                     write_ds(0x8e,0x80);
  638.                     write_com(0x80+0x40+10);       
  639.                     write_com(0x0f);
  640.                            write_ds(0x8e,0x00);
  641.                     ccc=read_ds(0x81);
  642.                     miao=(ccc/16)*10+ccc%16;
  643.                     ccc=read_ds(0x83);
  644.                     fen=(ccc/16)*10+ccc%16;
  645.                     ccc=read_ds(0x85);
  646.                     shi=(ccc/16)*10+ccc%16;
  647.                     ccc=read_ds(0x87);
  648.                     ri=(ccc/16)*10+ccc%16;
  649.                     ccc=read_ds(0x89);
  650.                     yue=(ccc/16)*10+ccc%16;
  651.                     ccc=read_ds(0x8b);
  652.                     zhou=(ccc/16)*10+ccc%16;
  653.                     ccc=read_ds(0x8d);
  654.                     nian=(ccc/16)*10+ccc%16;                       
  655.                 }
  656.                 if(num1==2)
  657.                     write_com(0x80+0x40+7);
  658.                 if(num1==3)
  659.                     write_com(0x80+0x40+4);
  660.                 if(num1==4)
  661.                     write_com(0x80+0x0d);
  662.                 if(num1==5)
  663.                     write_com(0x80+0x09);
  664.                 if(num1==6)
  665.                      write_com(0x80+6);
  666.                          if(num1==7)
  667.                      write_com(0x80+3);
  668.                 if(num1==8)
  669.                 {
  670.                     num1=0;
  671.                     write_com(0x0c);
  672.                           write_ds(0x8e,0x80);
  673.                                    flag1=0;   
  674.                 }
  675.                 }       
  676.         }
  677.         if(num1!=0&&flag==1&&num==0)//判断num值
  678.         {
  679.                 if(k3==0&&flag==1&&num==0)//判断k2按键是否按下
  680.                 {
  681.                         delay(10);//延时5毫秒
  682.                         if(k3==0&&flag==1&&num==0)//再次判断k2按键是否按下
  683.                         {
  684.                                 while(k3==0&&flag==1&&num==0&&i)//判断按键松手检测
  685.                                 {
  686.                                         i--;
  687.                                         delay(10);
  688.                                 }
  689.                                 di();//调用蜂鸣器子函数
  690.                                 if(num1==1)
  691.                     {        
  692.                         miao++;
  693.                         if(miao==61)
  694.                             miao=1 ;
  695.                         write_sfm1(8,miao);
  696.                         write_com(0x80+0x4a);
  697.                     }
  698.                     if(num1==2)
  699.                     {
  700.                         fen++;
  701.                         if(fen==60)
  702.                             fen=0;
  703.                         write_sfm1(5,fen);
  704.                         write_com(0x80+0x48);
  705.                     }
  706.                     if(num1==3)
  707.                     {
  708.                         shi++;
  709.                         if(shi==24)
  710.                             shi=0;
  711.                         write_sfm1(2,shi);
  712.                         write_com(0x80+0x40+5);
  713.                     }
  714.                                  if(num1==4)
  715.                     {
  716.                         zhou++;
  717.                         if(zhou==8)
  718.                                    zhou=1;
  719.                         write_nyr(12,zhou);
  720.                         write_com(0x80+0x0d);
  721.                     }
  722.                     if(num1==5)
  723.                     {
  724.                         ri++;
  725.                         if(ri==32)
  726.                                    ri=1;
  727.                         write_nyr(8,ri);
  728.                         write_com(0x80+0x0a);
  729.                     }       
  730.                     if(num1==6)
  731.                     {
  732.                         yue++;
  733.                         if(yue==13)
  734.                             yue=1;
  735.                         write_nyr(5,yue);
  736.                         write_com(0x80+7);
  737.                     }
  738.                     if(num1==7)
  739.                     {
  740.                         nian++;
  741.                         write_nyr(2,nian);
  742.                         write_com(0x80+4);
  743.                     }
  744.                         }
  745.                 }
  746.                 if(k4==0&&flag==1&&num==0)//判断k3按键是否按下
  747.                 {
  748.                         delay(10);//延时10毫秒
  749.                         if(k4==0&&flag==1&&num==0)//再次判断k3按键是否按下
  750.                         {
  751.                                 while(k4==0&&flag==1&&num==0&&i)//判断按键松手检测
  752.                                 {
  753.                                         i--;
  754.                                         delay(10);
  755.                                 }
  756.                                 di();//调用蜂鸣器子函数
  757.                                 if(num1==1)
  758.                     {        
  759.                         miao--;
  760.                         if(miao==-1)
  761.                             miao=59;
  762.                         write_sfm1(8,miao);
  763.                         write_com(0x80+0x4a);
  764.                     }
  765.                     if(num1==2)
  766.                     {
  767.                         fen--;
  768.                         if(fen==-1)
  769.                             fen=59;
  770.                         write_sfm1(5,fen);
  771.                         write_com(0x80+0x48);
  772.                     }
  773.                     if(num1==3)
  774.                     {
  775.                         shi--;
  776.                         if(shi==-1)
  777.                             shi=23;
  778.                         write_sfm1(2,shi);
  779.                         write_com(0x80+0x45);
  780.                     }
  781.                                 if(num1==4)
  782.                     {
  783.                         zhou--;
  784.                         if(zhou==0)
  785.                                    zhou=7;
  786.                         write_nyr(12,zhou);
  787.                         write_com(0x80+0x0d);
  788.                     }
  789.                     if(num1==5)
  790.                     {
  791.                         ri--;
  792.                         if(ri==-1)
  793.                                    ri=1;
  794.                         write_nyr(8,ri);
  795.                         write_com(0x80+0x0a);
  796.                     }
  797.                     if(num1==6)
  798.                     {
  799.                         yue--;
  800.                         if(yue==0)
  801.                             yue=12;
  802.                         write_nyr(5,yue);
  803.                         write_com(0x87);
  804.                     }
  805.                     if(num1==7)
  806.                     {
  807.                         nian--;
  808.                         write_nyr(2,nian);
  809.                         write_com(0x84);
  810.                     }
  811.                         }
  812.                 }
  813.                 write_ds(0x80,(miao/10)*16+miao%10);
  814.             write_ds(0x82,(fen/10)*16+fen%10);
  815.             write_ds(0x84,(shi/10)*16+shi%10);
  816.             write_ds(0x86,(ri/10)*16+ri%10);
  817.             write_ds(0x88,(yue/10)*16+yue%10);
  818.                 write_ds(0x8a,(zhou/10)*16+zhou%10);
  819.             write_ds(0x8c,(nian/10)*16+nian%10);
  820.         }               
  821. }
  822. //主函数
  823. void main()
  824. {
  825.         uint temp,humi,i;
  826.         uint aa,bb,cc,dd;
  827.         value humi_val,temp_val;                //定义两个共同体,一个用于湿度,一个用于温度
  828.         uchar error;                    //用于检验是否出现错误
  829.         uchar checksum;
  830.         LCD1602_init();//调用LCD1602液晶初始化子函数
  831.         //delay(5000);//延时
  832.         //write_com(0x01);
  833.         write_setds(0x80,0x50);           
  834.     write_setds(0x82,0x59);  
  835.     write_setds(0x84,0x10);         
  836.     write_setds(0x86,0x17);      
  837.     write_setds(0x88,0x03);
  838.         write_setds(0x8a,0x03);
  839.         write_setds(0x8c,0x10);
  840.         write_setds(0x90,0xa4);
  841.         s_connectionreset();
  842.         while(1)//大循环
  843.         {
  844.                 keyscan();
  845.                 if(flag==1)
  846.                 {
  847.                         display1();
  848.                 }
  849.                 if(flag==0&&num==0&&error==0&&num1==0)
  850.                 {
  851.                         aa=a*10;
  852.                         bb=b*10;
  853.                         cc=c*10;
  854.                         dd=d*10;
  855.                         if(temp>aa&&temp>bb&&humi<cc&&humi>dd)
  856.                         {
  857.                                 D1=0;
  858.                                 D2=1;
  859.                                 D3=1;
  860.                                 D4=1;
  861.                                 write_com(0xc0);
  862.                                 for(i=0;i<16;i++)
  863.                                 {
  864.                                         write_date(table3[i]);
  865.                                 }
  866.                         }
  867.                         if(temp<aa&&temp<bb&&humi<cc&&humi>dd)
  868.                         {
  869.                                 D1=1;
  870.                                 D2=0;
  871.                                 D3=1;
  872.                                 D4=1;
  873.                                 write_com(0xc0);
  874.                                 for(i=0;i<16;i++)
  875.                                 {
  876.                                         write_date(table4[i]);
  877.                                 }
  878.                         }
  879.                         if(temp<aa&&temp>bb&&humi>cc&&humi>dd)
  880.                         {
  881.                                 D1=1;
  882.                                 D2=1;
  883.                                 D3=0;
  884.                                 D4=1;
  885.                                 write_com(0xc0);
  886.                                 for(i=0;i<16;i++)
  887.                                 {
  888.                                         write_date(table5[i]);
  889.                                 }
  890.                         }
  891.                         if(temp<aa&&temp>bb&&humi<cc&&humi<dd)
  892.                         {
  893.                                 D1=1;
  894.                                 D2=1;
  895.                                 D3=1;
  896.                                 D4=0;
  897.                                 write_com(0xc0);
  898.                                 for(i=0;i<16;i++)
  899.                                 {
  900.                                         write_date(table6[i]);
  901.                                 }
  902.                         }
  903.                         if(temp>aa&&temp>bb&&humi>cc&&humi>dd)
  904.                         {
  905.                                 D1=0;
  906.                                 D2=1;
  907.                                 D3=0;
  908.                                 D4=1;
  909.                                 write_com(0xc0);
  910.                                 for(i=0;i<16;i++)
  911.                                 {
  912.                                         write_date(table7[i]);
  913.                                 }
  914.                         }
  915.                         if(temp>aa&&temp>bb&&humi<cc&&humi<dd)
  916.                         {
  917.                                 D1=0;
  918.                                 D2=1;
  919.                                 D3=1;
  920.                                 D4=0;
  921.                                 write_com(0xc0);
  922.                                 for(i=0;i<16;i++)
  923.                                 {
  924.                                         write_date(table8[i]);
  925.                                 }
  926.                         }
  927.                         if(temp<aa&&temp<bb&&humi>cc&&humi>dd)
  928.                         {
  929.                                 D1=1;
  930.                                 D2=0;
  931.                                 D3=0;
  932.                                 D4=1;
  933.                                 write_com(0xc0);
  934.                                 for(i=0;i<16;i++)
  935.                                 {
  936.                                         write_date(table9[i]);
  937.                                 }
  938.                         }
  939.                         if(temp<aa&&temp<bb&&humi<cc&&humi<dd)
  940.                         {
  941.                                 D1=0;
  942.                                 D2=0;
  943.                                 D3=1;
  944.                                 D4=0;
  945.                                 write_com(0xc0);
  946.                                 for(i=0;i<16;i++)
  947.                                 {
  948.                                         write_date(table10[i]);
  949.                                 }
  950.                         }
  951.                         if(temp<aa&&temp>bb&&humi<cc&&humi>dd)
  952.                         {
  953.                                 D1=1;
  954.                                 D2=1;
  955.                                 D3=1;
  956.                                 D4=1;
  957.                                 write_com(0xc0);
  958.                                 for(i=0;i<16;i++)
  959.                                 {
  960.                                         write_date(table11[i]);
  961.                                 }
  962.                         }       
  963.                 }
  964.                 if(flag==0)
  965.                 {       
  966.                         error=0;                                           //初始化error=0,即没有错误
  967.                         error+=s_measure((uchar*)&temp_val.i,&checksum,TEMP); //温度测量
  968.                         error+=s_measure((uchar*)&humi_val.i,&checksum,HUMI); //湿度测量
  969.                     if(error!=0)
  970.                                 s_connectionreset();//如果发生错误,系统复位
  971.                     else
  972.                     {
  973.                                 humi_val.f=(float)humi_val.i;                   //转换为浮点数
  974.                              temp_val.f=(float)temp_val.i;                   //转换为浮点数
  975.                              calc_sth10(&humi_val.f,&temp_val.f);            //修正相对湿度及温度
  976.                                    temp=temp_val.f*10;
  977.                              humi=humi_val.f*10;
  978.                               wendu[0]=temp/1000+'0';                     //温度百位
  979.                               wendu[1]=temp%1000/100+'0';             //温度十位       
  980.                                    wendu[2]=temp%100/10+'0';                        //温度个位
  981.                               wendu[3]=0x2E;                                                //小数点
  982.                                    wendu[4]=temp%10+'0';                                //温度小数点后第一位                                                 
  983.                                 shidu[0]=humi/1000+'0';                     //湿度百位
  984.                               shidu[1]=humi%1000/100+'0';             //湿度十位       
  985.                                    shidu[2]=humi%100/10+'0';                        //湿度个位
  986.                               shidu[3]=0x2E;                                                //小数点
  987.                                    shidu[4]=humi%10+'0';                                //湿度小数点后第一位
  988.                                 display();               
  989.                     }  
  990.                         delay(800);
  991.                 }                         
  992.         }
  993. }

复制代码
回复

使用道具 举报

7#
ID:295009 发表于 2018-3-29 19:47 | 只看该作者
999333 发表于 2018-3-29 18:10
硬件没什么问题,看看你的程序

#include<reg51.h>//定义函数
#include<intrins.h>
typedef unsigned char uchar;//无符号8位整型变量   
typedef unsigned int  uint;//无符号16位整型变量   
sbit RS=P2^7;//LCD1602数据/命令选择端(H/L)
sbit RW=P2^6;//LCD1602读/写选择端(H/L)
sbit E=P2^5;//LCD1602使能信号端
sbit DATA=P3^6;
sbit SCK=P3^7;
sbit k1=P3^2;//总设置按键
sbit k2=P3^3;//设置按键
sbit k3=P3^4;//+按键
sbit k4=P3^5;//-按键
sbit beep=P2^0;
sbit D1=P1^0;//高温报警指示灯
sbit D2=P1^1;//低温报警指示灯
sbit D3=P1^2;//高湿度报警指示灯
sbit D4=P1^3;//低湿度报警指示灯
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
sbit IO=P1^5;         
sbit SCLK=P1^6;   
sbit RST=P1^7;
uchar idata wendu[6];                                 
uchar idata shidu[6];
uchar code table1[]="   2013-08-30   ";
uchar code table2[]="  QQ:383459194  ";
uchar code table3[]=" gaowenbaojing  ";
uchar code table4[]="  diwenbaojing  ";
uchar code table5[]="gaoshidubaojing ";
uchar code table6[]=" dishidubaojing ";
uchar code table7[]="gaowen+gaoshidu ";
uchar code table8[]=" gaowen+dishidu ";
uchar code table9[]=" diwen+gaoshidu ";
uchar code table10[]=" diwen+dishidu  ";
uchar code table11[]="   this is ok   ";
uchar code table12[]="                ";
uchar code table13[]="      :  :      ";
enum {TEMP,HUMI};
typedef union //定义共用同类型
{        
        uint i;
        float f;
}         value;
uchar a,b,c,d,num,flag=0,m=0,num1=0;
char miao,shi,fen;
uchar ccc,ri,yue,nian,zhou,flag1;
//延时子函数
void delay(uint z)
{      
        uint x,y;
        for(x=z;x>0;x--)
                for(y=120;y>0;y--);
}
//按键提示音子函数
void di()
{
        beep=0;
        delay(100);
        beep=1;
}
//往DS1302时钟芯片写入一字节子函数
void inputbyte(uchar add)
{
    uchar i;
    ACC=add;
    for(i=8;i>0;i--)
    {
        IO=ACC0;
        SCLK=1;
        SCLK=0;
        ACC=ACC>>1;
    }
}
//DS1302时钟芯片输出一字节子函数
uchar outputbyte()
{
    uchar i;
    for(i=8;i>0;i--)
    {
        ACC=ACC>>1;
        ACC7=IO;
        SCLK=1;
        SCLK=0;
    }
    return ACC;
}
//往DS1302时钟芯片写入数据子函数
void write_ds(uchar add,uchar ucda)
{
    RST=0;
    SCLK=0;
    RST=1;
    inputbyte(add);
    inputbyte(ucda);
    SCLK=1;
    RST=0;
}
//从DS1302时钟芯片读出数据子函数
uchar read_ds(uchar add)
{
    uchar ucda;
    RST=0;
    SCLK=0;
    RST=1;
    inputbyte(add);
    ucda=outputbyte();
    SCLK=1;
    RST=0;
    return(ucda);
}
//设置DS1302时钟芯片子函数
void write_setds(uchar addr,uchar date)
{
    write_ds(0x8e,0x00);
    write_ds(addr,date);
    write_ds(0x8e,0x80);
}
//检查LCD1602液晶忙位子函数
void LCD1602_busy()
{  
        uchar i=0;
        RS=0;
        RW=1;
        E=1;
        P0=0xff;
        i=0;
        while(((P0&0x80)==0x80)&&i<150)
                i++;
        E=0;
}
//LCD1602液晶写指令子函数
void write_com(uchar com)               
{
        LCD1602_busy();
        RS=0;
        RW=0;
        P0=com;       
        E=1;
        E=0;
}
//LCD1602液晶写数据子函数
void write_date(uchar date)               
{
        LCD1602_busy();
        RS=1;
        RW=0;
        P0=date;
        E=1;
        E=0;
}
//LCD1602液晶初始化子函数
void LCD1602_init()                                //初始化设置
{
        //uchar i;
        write_com(0x38);
        write_com(0x0c);
        write_com(0x06);
        write_com(0x01);
        /*write_com(0x80);
        for(i=0;i<16;i++)
        {
                write_date(table1);
                delay(500);
        }
        write_com(0xc0);
        for(i=0;i<16;i++)
        {
                write_date(table2);
                delay(500);
        }*/
        a=35;
        b=10;
        c=65;
        d=40;
}
//SHT10写字节子函数
char s_write_byte(uchar value)   
{
        uchar i,error=0;
        for(i=0x80;i>0;i>>=1)             //高位为1,循环右移
        {
                if(i&value)
                        DATA=1;//和要发送的数相与,结果为发送的位
            else
                        DATA=0;                        
            SCK=1;                          
            _nop_();
                _nop_();
                _nop_();//延时3us
            SCK=0;
        }
        DATA=1;                           //释放数据线
        SCK=1;                           
        error=DATA;                       //检查应答信号,确认通讯正常
        _nop_();
        _nop_();
        _nop_();
        SCK=0;        
        DATA=1;
        return error;                     //error=1 通讯错误
}
//SHT10读字节子函数
char s_read_byte(uchar ack)
{
        uchar i,val=0;
        DATA=1;                           //释放数据线
        for(i=0x80;i>0;i>>=1)             //高位为1,循环右移
        {
                SCK=1;                        
            if(DATA)
                        val=(val|i);             //读一位数据线的值
            SCK=0;      
        }
        DATA=!ack;                        //如果是校验,读取完后结束通讯;
        SCK=1;                           
        _nop_();
        _nop_();
        _nop_();//延时3us
        SCK=0;   
        _nop_();
        _nop_();
        _nop_();      
        DATA=1;                           //释放数据线
        return val;
}
//SHT10启动传输子函数
void s_transstart()
{
           DATA=1;
        SCK=0;                   //准备
           _nop_();
          SCK=1;
           _nop_();
           DATA=0;
           _nop_();
          SCK=0;
           _nop_();
         _nop_();
         _nop_();
           SCK=1;
           _nop_();
          DATA=1;     
          _nop_();
           SCK=0;     
}
//SHT10连接复位子函数
void s_connectionreset()
{
        uchar i;
        DATA=1;
        SCK=0;//准备
        for(i=0;i<9;i++)                  //DATA保持高,SCK时钟触发9次,发送启动传输,通迅即复位
        {
                SCK=1;
            SCK=0;
        }
        s_transstart();                   //启动传输
}
//SHT10温湿度检测子函数
char s_measure(uchar *p_value,uchar *p_checksum,uchar mode)
{
        unsigned error=0;
        uint i;
        s_transstart();                   //启动传输
        switch(mode)                      //选择发送命令
    {       
                case TEMP:         error+=s_write_byte(0x03);
                                        break;                   //测量温度
            case HUMI:        error+=s_write_byte(0x05);
                                        break;                   //测量湿度
            default:         break;
        }
        for(i=0;i<65535;i++)
                if(DATA==0)
                        break;        //等待测量结束
        if(DATA)
                error+=1;                              // 如果长时间数据线没有拉低,说明测量错误
        *(p_value)=s_read_byte(1);                    //读第一个字节,高字节 (MSB)
        *(p_value+1)=s_read_byte(1);                    //读第二个字节,低字节 (LSB)
        *p_checksum=s_read_byte(0);                //read CRC校验码
        return error;                                        // error=1 通讯错误
}
//SHT10温湿度值标度变换及温度补偿子函数
void calc_sth10(float *p_humidity ,float *p_temperature)
{
        const float C1=-4.0;              // 12位湿度精度 修正公式
        const float C2=+0.0405;           // 12位湿度精度 修正公式
        const float C3=-0.0000028;        // 12位湿度精度 修正公式
        const float T1=+0.01;             // 14位温度精度 5V条件  修正公式
        const float T2=+0.00008;          // 14位温度精度 5V条件  修正公式
        float rh=*p_humidity;             // rh:      12位 湿度
        float t=*p_temperature;           // t:       14位 温度
        float rh_lin;                     // rh_lin: 湿度 linear值
        float rh_true;                    // rh_true: 湿度 ture值
        float t_C;                        // t_C   : 温度 ℃
        t_C=t*0.01-40;                  //补偿温度
        rh_lin=C3*rh*rh+C2*rh+C1;     //相对湿度非线性补偿
        rh_true=(t_C-25)*(T1+T2*rh)+rh_lin;   //相对湿度对于温度依赖性补偿
        if(rh_true>100)
                rh_true=100;       //湿度最大修正
        if(rh_true<0.1)
                rh_true=0.1;       //湿度最小修正
        *p_temperature=t_C;               //返回温度结果
        *p_humidity=rh_true;              //返回湿度结果
}
//往LCD1602液晶写入日期子函数
void write_nyr(uchar add,uchar date)
{
    uchar shi,ge ;
    shi=date/10;
    ge=date%10;
    write_com(0x80+0x01+add);
    write_date(0x30+shi);
    write_date(0x30+ge);
}
//往LCD1602液晶写入时间子函数
void write_sfm1(uchar add,uchar date)
{
    uchar shi,ge;
    shi=date/10;
    ge=date%10;
    write_com(0x80+0x42+add);
    write_date(0x30+shi);
    write_date(0x30+ge);
}
//电子万年历显示子函数
void display1()
{       
        if(flag1!=1)
    {
            uchar d;
            d=read_ds(0x81);
            miao=(d/16)*10+(d%16);
            write_sfm1(8,miao);
            d=read_ds(0x83);
            fen=(d/16)*10+(d%16);
            write_sfm1(5,fen);
            d=read_ds(0x85);
            shi=(d/16)*10+(d%16);
            write_sfm1(2,shi);
            d=read_ds(0x87);
            ri=(d/16)*10+(d%16);
            write_nyr(8,ri);
            d=read_ds(0x89);
            yue=(d/16)*10+(d%16);
            write_nyr(5,yue);
                d=read_ds(0x8b);
            zhou=d%16;
            write_nyr(12,zhou);
            d=read_ds(0x8d);
            nian=(d/16)*10+(d%16);
            write_nyr(2,nian);
    }
}
//温湿度显示子函数
void display()
{
        write_com(0x80+1);
        write_date('T');
        write_com(0x80+2);
        write_date('=');
        write_com(0x80+3);
        write_date(wendu[0]);
        write_com(0x80+4);
        write_date(wendu[1]);
        write_com(0x80+5);
        write_date(wendu[2]);
        write_com(0x80+6);
        write_date(wendu[3]);
        write_com(0x80+7);
        write_date(wendu[4]);
        write_com(0x80+8);
        write_date(' ');
        write_com(0x80+9);
        write_date('R');
        write_com(0x80+10);
        write_date('=');
        write_com(0x80+11);
        write_date(shidu[0]);
        write_com(0x80+12);
        write_date(shidu[1]);
        write_com(0x80+13);
        write_date(shidu[2]);
        write_com(0x80+14);
        write_date(shidu[3]);
        write_com(0x80+15);
        write_date(shidu[4]);
}
//LCD1602液晶写参数子函数
void write_sfm(uchar aaa,uchar bbb)
{
        uchar shi,ge;
        shi=bbb/10;
        ge=bbb%10;
        write_com(0x80+0x40+aaa);
        write_date(0x30+shi);
        write_date(0x30+ge);
}
//按键扫描子函数
void keyscan()
{
        uchar i=100,e;
        if(k1==0&&num==0&&num1==0)
        {
                delay(10);
                if(k1==0&&num==0&&num1==0)
                {
                        while(k1==0&&num1==0&&num==0&&i)
                        {
                                i--;
                                delay(10);
                        }
                        di();
                        flag++;
                        if(flag==1)
                        {
                                write_com(0x01);
                                delay(5);
                                write_com(0x80+1);
                                write_date('2');
                                write_com(0x80+2);
                                write_date('0');
                                write_com(0x80+5);
                            write_date('-');
                                write_com(0x80+8);
                                   write_date('-');
                            write_com(0xc0+6);
                            write_date(':');
                            write_com(0xc0+9);
                            write_date(':');
                        }                       
                        if(flag>=2)
                        {
                                write_com(0x01);
                                delay(5);
                                flag=0;
                        }
                }
        }
        if(k2==0&&flag==0&&num1==0)
        {
                delay(10);
                if(k2==0&&flag==0&&num1==0)
                {
                        while(k2==0&&num1==0&&flag==0&&i)
                        {
                                i--;
                                delay(10);
                        }
                        di();
                        num++;
                        if(num==1)
                        {
                                write_com(0xc0);
                                for(e=0;e<16;e++)
                                        write_date(table12[e]);
                                write_com(0xc0+4);
                                write_date('T');
                                write_com(0xc0+5);
                                write_date('H');
                                write_com(0xc0+6);
                                write_date('=');
                                write_com(0xc0+7);
                                write_date(a/10+0x30);
                                write_com(0xc0+8);
                                write_date(a%10+0x30);
                                write_com(0xc0+9);
                                write_date(0xdf);
                                write_com(0xc0+10);
                                write_date(0x43);
                        }
                        if(num==2)
                        {
                                write_com(0xc0+4);
                                write_date('T');
                                write_com(0xc0+5);
                                write_date('L');
                                write_com(0xc0+6);
                                write_date('=');
                                write_com(0xc0+7);
                                write_date(b/10+0x30);
                                write_com(0xc0+8);
                                write_date(b%10+0x30);
                                write_com(0xc0+9);
                                write_date(0xdf);
                                write_com(0xc0+10);
                                write_date(0x43);
                        }
                        if(num==3)
                        {
                                write_com(0xc0);
                                for(e=0;e<16;e++)
                                        write_date(table12[e]);
                                write_com(0xc0+4);
                                write_date('R');
                                write_com(0xc0+5);
                                write_date('H');
                                write_com(0xc0+6);
                                write_date('=');
                                write_com(0xc0+7);
                                write_date(c/10+0x30);
                                write_com(0xc0+8);
                                write_date(c%10+0x30);
                                write_com(0xc0+9);
                                write_date('%');
                        }
                        if(num==4)
                        {
                                write_com(0xc0+4);
                                write_date('R');
                                write_com(0xc0+5);
                                write_date('L');
                                write_com(0xc0+6);
                                write_date('=');
                                write_com(0xc0+7);
                                write_date(d/10+0x30);
                                write_com(0xc0+8);
                                write_date(d%10+0x30);
                                write_com(0xc0+9);
                                write_date('%');
                        }
                        if(num>=5)
                        {
                                num=0;
                        }
                }
        }
        if(num!=0&&flag==0&&num1==0)
        {
                if(k3==0)
                {
                        delay(10);
                        if(k3==0)
                        {
                                while(k3==0&&i)
                                {
                                        i--;
                                        delay(10);
                                }
                                di();
                                if(num==1)
                                {
                                        a++;
                                        if(a==50)
                                                a=35;
                                        write_sfm(7,a);
                                        write_com(0xc0+8);       
                                }
                                if(num==2)
                                {
                                        b++;
                                        if(b==30)
                                                b=10;
                                        write_sfm(7,b);
                                        write_com(0xc0+8);       
                                }
                                if(num==3)
                                {
                                        c++;
                                        if(c==95)
                                                c=65;
                                        write_sfm(7,c);
                                        write_com(0xc0+8);       
                                }
                                if(num==4)
                                {
                                        d++;
                                        if(d==60)
                                                d=40;
                                        write_sfm(7,d);
                                        write_com(0xc0+8);       
                                }
                        }
                }
                if(k4==0)
                {
                        delay(10);
                        if(k4==0)
                        {
                                while(k4==0&&i)
                                {
                                        i--;
                                        delay(10);
                                }
                                di();
                                if(num==1)
                                {
                                        a--;
                                        if(a==15)
                                                a=35;
                                        write_sfm(7,a);
                                        write_com(0xc0+8);       
                                }
                                if(num==2)
                                {
                                        b--;
                                        if(b==0)
                                                b=10;
                                        write_sfm(7,b);
                                        write_com(0xc0+8);       
                                }
                                if(num==3)
                                {
                                        c--;
                                        if(c==40)
                                                c=65;
                                        write_sfm(7,c);
                                        write_com(0xc0+8);       
                                }
                                if(num==4)
                                {
                                        d--;
                                        if(d==0)
                                                d=40;
                                        write_sfm(7,d);
                                        write_com(0xc0+8);       
                                }
                        }
                }
        }
        if(k2==0&&flag==1&&num==0)
        {
                delay(10);
                if(k2==0&&flag==1&&num==0)
                {
                        while(k2==0&&flag==1&&num==0&&i)
                        {
                                i--;
                                delay(10);
                        }
                        di();
                        num1++;
                        if(num1==1)
                {   
                            flag1=1;
                    write_ds(0x8e,0x80);
                    write_com(0x80+0x40+10);       
                    write_com(0x0f);
                           write_ds(0x8e,0x00);
                    ccc=read_ds(0x81);
                    miao=(ccc/16)*10+ccc%16;
                    ccc=read_ds(0x83);
                    fen=(ccc/16)*10+ccc%16;
                    ccc=read_ds(0x85);
                    shi=(ccc/16)*10+ccc%16;
                    ccc=read_ds(0x87);
                    ri=(ccc/16)*10+ccc%16;
                    ccc=read_ds(0x89);
                    yue=(ccc/16)*10+ccc%16;
                    ccc=read_ds(0x8b);
                    zhou=(ccc/16)*10+ccc%16;
                    ccc=read_ds(0x8d);
                    nian=(ccc/16)*10+ccc%16;                       
                }
                if(num1==2)
                    write_com(0x80+0x40+7);
                if(num1==3)
                    write_com(0x80+0x40+4);
                if(num1==4)
                    write_com(0x80+0x0d);
                if(num1==5)
                    write_com(0x80+0x09);
                if(num1==6)
                     write_com(0x80+6);
                         if(num1==7)
                     write_com(0x80+3);
                if(num1==8)
                {
                    num1=0;
                    write_com(0x0c);
                          write_ds(0x8e,0x80);
                                   flag1=0;   
                }
                }       
        }
        if(num1!=0&&flag==1&&num==0)//判断num值
        {
                if(k3==0&&flag==1&&num==0)//判断k2按键是否按下
                {
                        delay(10);//延时5毫秒
                        if(k3==0&&flag==1&&num==0)//再次判断k2按键是否按下
                        {
                                while(k3==0&&flag==1&&num==0&&i)//判断按键松手检测
                                {
                                        i--;
                                        delay(10);
                                }
                                di();//调用蜂鸣器子函数
                                if(num1==1)
                    {        
                        miao++;
                        if(miao==61)
                            miao=1 ;
                        write_sfm1(8,miao);
                        write_com(0x80+0x4a);
                    }
                    if(num1==2)
                    {
                        fen++;
                        if(fen==60)
                            fen=0;
                        write_sfm1(5,fen);
                        write_com(0x80+0x48);
                    }
                    if(num1==3)
                    {
                        shi++;
                        if(shi==24)
                            shi=0;
                        write_sfm1(2,shi);
                        write_com(0x80+0x40+5);
                    }
                                 if(num1==4)
                    {
                        zhou++;
                        if(zhou==8)
                                   zhou=1;
                        write_nyr(12,zhou);
                        write_com(0x80+0x0d);
                    }
                    if(num1==5)
                    {
                        ri++;
                        if(ri==32)
                                   ri=1;
                        write_nyr(8,ri);
                        write_com(0x80+0x0a);
                    }       
                    if(num1==6)
                    {
                        yue++;
                        if(yue==13)
                            yue=1;
                        write_nyr(5,yue);
                        write_com(0x80+7);
                    }
                    if(num1==7)
                    {
                        nian++;
                        write_nyr(2,nian);
                        write_com(0x80+4);
                    }
                        }
                }
                if(k4==0&&flag==1&&num==0)//判断k3按键是否按下
                {
                        delay(10);//延时10毫秒
                        if(k4==0&&flag==1&&num==0)//再次判断k3按键是否按下
                        {
                                while(k4==0&&flag==1&&num==0&&i)//判断按键松手检测
                                {
                                        i--;
                                        delay(10);
                                }
                                di();//调用蜂鸣器子函数
                                if(num1==1)
                    {        
                        miao--;
                        if(miao==-1)
                            miao=59;
                        write_sfm1(8,miao);
                        write_com(0x80+0x4a);
                    }
                    if(num1==2)
                    {
                        fen--;
                        if(fen==-1)
                            fen=59;
                        write_sfm1(5,fen);
                        write_com(0x80+0x48);
                    }
                    if(num1==3)
                    {
                        shi--;
                        if(shi==-1)
                            shi=23;
                        write_sfm1(2,shi);
                        write_com(0x80+0x45);
                    }
                                if(num1==4)
                    {
                        zhou--;
                        if(zhou==0)
                                   zhou=7;
                        write_nyr(12,zhou);
                        write_com(0x80+0x0d);
                    }
                    if(num1==5)
                    {
                        ri--;
                        if(ri==-1)
                                   ri=1;
                        write_nyr(8,ri);
                        write_com(0x80+0x0a);
                    }
                    if(num1==6)
                    {
                        yue--;
                        if(yue==0)
                            yue=12;
                        write_nyr(5,yue);
                        write_com(0x87);
                    }
                    if(num1==7)
                    {
                        nian--;
                        write_nyr(2,nian);
                        write_com(0x84);
                    }
                        }
                }
                write_ds(0x80,(miao/10)*16+miao%10);
            write_ds(0x82,(fen/10)*16+fen%10);
            write_ds(0x84,(shi/10)*16+shi%10);
            write_ds(0x86,(ri/10)*16+ri%10);
            write_ds(0x88,(yue/10)*16+yue%10);
                write_ds(0x8a,(zhou/10)*16+zhou%10);
            write_ds(0x8c,(nian/10)*16+nian%10);
        }               
}
//主函数
void main()
{
        uint temp,humi,i;
        uint aa,bb,cc,dd;
        value humi_val,temp_val;                //定义两个共同体,一个用于湿度,一个用于温度
        uchar error;                    //用于检验是否出现错误
        uchar checksum;
        LCD1602_init();//调用LCD1602液晶初始化子函数
        //delay(5000);//延时
        //write_com(0x01);
        write_setds(0x80,0x50);           
    write_setds(0x82,0x59);  
    write_setds(0x84,0x10);         
    write_setds(0x86,0x17);      
    write_setds(0x88,0x03);
        write_setds(0x8a,0x03);
        write_setds(0x8c,0x10);
        write_setds(0x90,0xa4);
        s_connectionreset();
        while(1)//大循环
        {
                keyscan();
                if(flag==1)
                {
                        display1();
                }
                if(flag==0&&num==0&&error==0&&num1==0)
                {
                        aa=a*10;
                        bb=b*10;
                        cc=c*10;
                        dd=d*10;
                        if(temp>aa&&temp>bb&&humi<cc&&humi>dd)
                        {
                                D1=0;
                                D2=1;
                                D3=1;
                                D4=1;
                                write_com(0xc0);
                                for(i=0;i<16;i++)
                                {
                                        write_date(table3);
                                }
                        }
                        if(temp<aa&&temp<bb&&humi<cc&&humi>dd)
                        {
                                D1=1;
                                D2=0;
                                D3=1;
                                D4=1;
                                write_com(0xc0);
                                for(i=0;i<16;i++)
                                {
                                        write_date(table4);
                                }
                        }
                        if(temp<aa&&temp>bb&&humi>cc&&humi>dd)
                        {
                                D1=1;
                                D2=1;
                                D3=0;
                                D4=1;
                                write_com(0xc0);
                                for(i=0;i<16;i++)
                                {
                                        write_date(table5);
                                }
                        }
                        if(temp<aa&&temp>bb&&humi<cc&&humi<dd)
                        {
                                D1=1;
                                D2=1;
                                D3=1;
                                D4=0;
                                write_com(0xc0);
                                for(i=0;i<16;i++)
                                {
                                        write_date(table6);
                                }
                        }
                        if(temp>aa&&temp>bb&&humi>cc&&humi>dd)
                        {
                                D1=0;
                                D2=1;
                                D3=0;
                                D4=1;
                                write_com(0xc0);
                                for(i=0;i<16;i++)
                                {
                                        write_date(table7);
                                }
                        }
                        if(temp>aa&&temp>bb&&humi<cc&&humi<dd)
                        {
                                D1=0;
                                D2=1;
                                D3=1;
                                D4=0;
                                write_com(0xc0);
                                for(i=0;i<16;i++)
                                {
                                        write_date(table8);
                                }
                        }
                        if(temp<aa&&temp<bb&&humi>cc&&humi>dd)
                        {
                                D1=1;
                                D2=0;
                                D3=0;
                                D4=1;
                                write_com(0xc0);
                                for(i=0;i<16;i++)
                                {
                                        write_date(table9);
                                }
                        }
                        if(temp<aa&&temp<bb&&humi<cc&&humi<dd)
                        {
                                D1=0;
                                D2=0;
                                D3=1;
                                D4=0;
                                write_com(0xc0);
                                for(i=0;i<16;i++)
                                {
                                        write_date(table10);
                                }
                        }
                        if(temp<aa&&temp>bb&&humi<cc&&humi>dd)
                        {
                                D1=1;
                                D2=1;
                                D3=1;
                                D4=1;
                                write_com(0xc0);
                                for(i=0;i<16;i++)
                                {
                                        write_date(table11);
                                }
                        }       
                }
                if(flag==0)
                {       
                        error=0;                                           //初始化error=0,即没有错误
                        error+=s_measure((uchar*)&temp_val.i,&checksum,TEMP); //温度测量
                        error+=s_measure((uchar*)&humi_val.i,&checksum,HUMI); //湿度测量
                    if(error!=0)
                                s_connectionreset();//如果发生错误,系统复位
                    else
                    {
                                humi_val.f=(float)humi_val.i;                   //转换为浮点数
                             temp_val.f=(float)temp_val.i;                   //转换为浮点数
                             calc_sth10(&humi_val.f,&temp_val.f);            //修正相对湿度及温度
                                   temp=temp_val.f*10;
                             humi=humi_val.f*10;
                              wendu[0]=temp/1000+'0';                     //温度百位
                              wendu[1]=temp%1000/100+'0';             //温度十位       
                                   wendu[2]=temp%100/10+'0';                        //温度个位
                              wendu[3]=0x2E;                                                //小数点
                                   wendu[4]=temp%10+'0';                                //温度小数点后第一位                                                 
                                shidu[0]=humi/1000+'0';                     //湿度百位
                              shidu[1]=humi%1000/100+'0';             //湿度十位       
                                   shidu[2]=humi%100/10+'0';                        //湿度个位
                              shidu[3]=0x2E;                                                //小数点
                                   shidu[4]=humi%10+'0';                                //湿度小数点后第一位
                                display();               
                    }  
                        delay(800);
                }                         
        }
}

回复

使用道具 举报

8#
ID:281828 发表于 2018-3-29 21:01 | 只看该作者
是否初始化光标设置问题。
下面是我常用的1602的初始化代码
    xie_zhiling(0x38); //显示模式设置
    dellay(10);
    xie_zhiling(0x38); //显示模式设置
    xie_zhiling(0x08); //关闭显示
    xie_zhiling(0x01); //显示清屏
    xie_zhiling(0x06); //显示光标移动设置
    xie_zhiling(0x0c); //显示开及光标移动设置
回复

使用道具 举报

9#
ID:287575 发表于 2018-3-29 22:36 | 只看该作者
警告已经告诉你了,是你的网络D0到D7错误,重画一下
回复

使用道具 举报

10#
ID:299251 发表于 2018-3-30 09:01 | 只看该作者
你的中断有问题吗
回复

使用道具 举报

11#
ID:299400 发表于 2018-3-30 14:08 | 只看该作者
你话的D0-d7好像有问题
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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