港湾 发表于 2013-12-16 19:44:58

请各位兄弟帮帮看看是什么原因


/主函数
#include<uart.h>
#include <KEYS.h>
#include <BoeBot.h>
#include <stdlib.h>
#include <intrins.h>
#include <lcd2004.h>

//----------------IO口定义区--------------------//
sbit        DHT = P1^2 ;//DHT11数据引脚
sbit        SDA=P0^1 ;    //DS1307数据输入
sbit        SCLK=P0^0;    //DS1307时钟输入
sbit        Key1=P3^2;          //功能键
sbit        Key2=P3^3;          //加
sbit        Key3=P3^4;          //减

//----------------变量定义区------------------//
unsigned charU8FLAG,k;
unsigned charU8count,U8temp;
unsigned charU8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
unsigned charU8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
unsigned charU8comdata;
unsigned chartemp={"****"};                   //温度数组
unsigned charhumi={"*****"};               //湿度数组
unsigned chartime={"********"};           //时间数组
unsigned chardate={"********"};        //日期数组
unsigned charweekdata={"***"};        //定义星期数组
unsigned char set_rtc_code={0,40,18,2,13,3,12};       //初始化DS1307,{秒,分钟,小时,星期,        日,月,年}
//unsigned char reset_rtc_code;
code unsigned char rtc_address={0x00,0x01,0x02,0x03,0x04,0x05,0x06};
unsigned char read_rtc_code={"1234567"};
//unsigned char ntime={0,0};
volatile unsigned char s1num=0,miao;
volatile unsigned char year;week=0,second=0,minute=0,hour=0,day=0,month=0;
//bit ntime_flag=0,flag1=0;
//unsigned char i=0;                  
//idata unsigned char miao,shi,fen,ri,yue,nian,week;
//idata unsigned char ring_time=0,alarm_hour2=0,alarm_minute2=4,alarm_2_ok=0,alarm_2_en=1,alarm_2_off=0;
//idata unsigned char year;week=0,second=0,minute=0,hour=0,day=0,month=0;//分别保存秒、分、时、天、月、年的变量


void Delay(unsigned int j)        //定义延时函数
    {
                unsigned char i;
          for(;j>0;j--)
                          {        
                                for(i=0;i<27;i++);
                          }
    }

voidDelay_10us(void)
        {
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        }
void chan(void)                       //转换字符函数
        {
        time=read_rtc_code/10+'0';
        time=read_rtc_code%10+'0';           //小时
        time=':';
        time=read_rtc_code/10+'0';
        time=read_rtc_code%10+'0';        //分钟
        time=':';
        time=read_rtc_code/10+'0';
        time=read_rtc_code%10+'0';        //秒
        time='\0';
        date=read_rtc_code/10+'0';
        date=read_rtc_code%10+'0';        //年
        date='-';
        date=read_rtc_code/10+'0';
        date=read_rtc_code%10+'0';        //月
        date='-';
        date=read_rtc_code/10+'0';
        date=read_rtc_code%10+'0';        //日
        date='\0';
        switch (read_rtc_code)                         //星期
                {
                case 1:weekdata='M';weekdata='o';weekdata='n';break;
            case 2:weekdata='T';weekdata='u';weekdata='e';break;
            case 3:weekdata='W';weekdata='e';weekdata='d';break;
            case 4:weekdata='T';weekdata='h';weekdata='u';break;
            case 5:weekdata='F';weekdata='r';weekdata='i';break;
            case 6:weekdata='S';weekdata='a';weekdata='t';break;
            case 7:weekdata='S';weekdata='u';weekdata='n';break;
                   }
        }
/******************************** I2C PART START*********************/

void I2C_delay(void)
        {
                _nop_();_nop_();_nop_();//_nop_();_nop_();                       //1.调整延时时间和上拉电阻,保证数据稳定
                                                                                                       //2.DS1307与DHT11的供电部分加滤波,接地太近有干扰
        }
/***********************************************************************/
void I2C_start(void)
        {

        //SCLK=0;
        //I2C_delay();
        SDA=1;
        //I2C_delay();
        _nop_();
        SCLK=1;
        //I2C_delay();
        _nop_();
        SDA=0;
        //I2C_delay();
        _nop_();
        SCLK=0;
        //I2C_delay();
        _nop_();
        }
/***********************************************************************/
void I2C_stop(void)
        {
        //SCLK=0;
        SDA=0;
        //I2C_delay();
        _nop_();
        SCLK=1;
        //SCLK=1;
        //I2C_delay();
        _nop_();
        SDA=1;
        //I2C_delay();
        _nop_();
        SCLK=0;
        //I2C_delay();//_nop_();
        //SDA=0;
        }
/***********************************************************************/
void I2C_send_ack(bit k)
        {
        SDA=k;
        I2C_delay();
        SCLK=1;
        I2C_delay();
        SCLK=0;
        //I2C_delay();
        }
/***********************************************************************/
void I2C_write_byte(unsigned char dat)
        {
        unsigned char i;
           for (i=0;i<8;i++)
            {
           SCLK=0;
                //_nop_();
           I2C_delay();
           SDA=(bit)(dat&0x80);
           dat<<=1;
           I2C_delay();
           SCLK=1;
           I2C_delay();
            }
    SCLK=0;
        //I2C_delay();
        }
/***********************************************************************/
unsigned char I2C_read_byte(void)
        {
        unsigned char i,dat;

           for (i=0;i<8;i++)
            {
           SCLK=0;
           I2C_delay();       
           SDA=1;
           I2C_delay();
            SCLK=1;
           I2C_delay();
           if(SDA)
           dat|=0x80>>i;
            }
    SCLK=0;
        //I2C_delay();   
           return (dat);
        }
/******************************** DS1307 PART START****************/
unsigned char Write1307(unsigned char add,dat)        //向DS1307写入数据
        {
        unsigned char temp;
        temp=dat/10;
        temp<<=4;
        temp=dat%10+temp;
        I2C_start();               
        I2C_write_byte(0xD0);
        I2C_send_ack(0);               
        I2C_write_byte(add);
        I2C_send_ack(0);           
        I2C_write_byte(temp);   
        I2C_send_ack(1);          
        I2C_stop();                  
        return (0);
        }
/***********************************************************************/
unsigned char Read1307(unsigned char add)                  //从DS1307读取数据
        {
        int temp,dat;
        I2C_start();
        I2C_write_byte(0xD0);
        I2C_send_ack(0);       
        I2C_write_byte(add);
        I2C_send_ack(1);       
        I2C_stop();       
        I2C_start();       
        I2C_write_byte(0xD1);
        I2C_send_ack(0);          
        dat=I2C_read_byte();
        I2C_send_ack(1);       
        I2C_stop();   
        temp=dat/16;
        dat=dat%16;
        dat=dat+temp*10;
        return (dat);
        }
/***********************************************************************/
void Read_RTC(void)
        {
        unsigned char i,*p;
        p=rtc_address;
        for(i=0;i<7;i++)
                {
                read_rtc_code=Read1307(*p);
                p++;
                delay_nms(1);
                }
        }
/***********************************************************************/
void Set_RTC(void)
        {
        unsigned char i,*p;
        p=rtc_address;
        for(i=0;i<7;i++)
                {
                Write1307(*p,set_rtc_code);
                p++;
                }
        }
/******************************** DS1307 PART STOP****************/

void refresh(void)                               //转换字符
        {
        Read_RTC();
        second=read_rtc_code;
        minute=read_rtc_code;
        hour=read_rtc_code;
        week=read_rtc_code;
        day=read_rtc_code;
        month=read_rtc_code;
        year=read_rtc_code;
        }

unsigned char turn_val(char newval,unsigned char flag,unsigned char s1num)                //判断设定的数值是否超过限定的上界或下界
        {
        if(flag)                  
                {
                switch(s1num)
                    {
                        case 1:
                                {       
                                if(newval>99)
                                  newval=0;
                      date=newval/10+'0';
                                date=newval%10+'0';
                                Display_List_Char(0,7,date);
                                  break;
                                }
                   case 2:
                                {
                                if(newval>12)
                                newval=1;
                         date=newval/10+'0';
                                date=newval%10+'0';
                                Display_List_Char(0,7,date);
                                  break;
                                }
                   case 3:
                                {
                                if(newval>31)
                                newval=1;
                            date=newval/10+'0';
                                date=newval%10+'0';
                                Display_List_Char(0,7,date);
                                  break;
                                }
                   case 4:
                                {
                                if(newval>7)
                                newval=1;
                        switch (newval)
                                        {
                                                case 1:weekdata='M';weekdata='o';weekdata='n';break;
                                            case 2:weekdata='T';weekdata='u';weekdata='e';break;
                                            case 3:weekdata='W';weekdata='e';weekdata='d';break;
                                                case 4:weekdata='T';weekdata='h';weekdata='u';break;
                                            case 5:weekdata='F';weekdata='r';weekdata='i';break;
                                            case 6:weekdata='S';weekdata='a';weekdata='t';break;
                                            case 7:weekdata='S';weekdata='u';weekdata='n';break;
                                        }
                               Display_List_Char(0,16,weekdata);
                                  break;
                                }
                      case 5:
                                {
                                if(newval>23)
                                newval=0;
                    time=newval/10+'0';
                                time=newval%10+'0';
                                Display_List_Char(1,5,time);
                                  break;
                                }
                      case 6:
                        {       
                                if(newval>59)
                                newval=0;
                        time=newval/10+'0';
                                time=newval%10+'0';
                                Display_List_Char(1,5,time);
                                  break;
                        }
                      case 7:
                        {
                                if(newval>59)
                                newval=0;
                        time=newval/10+'0';
                                time=newval%10+'0';
                                Display_List_Char(1,5,time);
                                  break;
                        }
                      default:break;
            }
        }   
        else
    {
                switch(s1num)
      {
                        case 1:
                        {
                                if(newval<0)
                                newval=99;
                                date=newval/10+'0';
                                date=newval%10+'0';
                                Display_List_Char(0,7,date);
                                break;
                        }
                  case 2:
                        {
                                if(newval==0)
                                newval=12;
                               date=newval/10+'0';
                                date=newval%10+'0';
                                Display_List_Char(0,7,date);
                          break;
                        }
                  case 3:
                        {
                                if(newval==0)
                                newval=31;
                               date=newval/10+'0';
                                date=newval%10+'0';
                                Display_List_Char(0,7,date);
                          break;
                        }
                  case 4:
                        {
                                if(newval==0)
                                newval=7;
                                   switch (newval)
                                        {
                                                case 1:weekdata='M';weekdata='o';weekdata='n';break;
                                            case 2:weekdata='T';weekdata='u';weekdata='e';break;
                                            case 3:weekdata='W';weekdata='e';weekdata='d';break;
                                            case 4:weekdata='T';weekdata='h';weekdata='u';break;
                                                  case 5:weekdata='F';weekdata='r';weekdata='i';break;
                                            case 6:weekdata='S';weekdata='a';weekdata='t';break;
                                            case 7:weekdata='S';weekdata='u';weekdata='n';break;
                                        }
                               Display_List_Char(0,16,weekdata);
                                break;
                        }
            case 5:
                        {       
                                if(newval<0)
                                newval=23;
                                   time=newval/10+'0';
                                time=newval%10+'0';
                                Display_List_Char(1,5,time);
                                break;
                        }
            case 6:
                        {
                                if(newval<0)
                                newval=59;
                                   time=newval/10+'0';
                                time=newval%10+'0';
                                Display_List_Char(1,5,time);
                          break;
                        }
            case 7:
                        {
                                if(newval<0)
                                newval=59;
                                   time=newval/10+'0';
                                time=newval%10+'0';
                                Display_List_Char(1,5,time);
                                break;
                        }
                        default:break;
             }
        }

        return newval;
         
        }
void key_scan(void)
        {       
        unsigned char s1num=0;
        refresh();
        //delay_nms(500);
        if(Key1==0)
            {
              delay_nms(30);                                  //按键延时去抖
                   if(Key1==0)
                   {
                        while(1)
                        {
                                if(Key1==0)
                     {
                        delay_nms(30);
                            if(Key1==0)
                              {
                                             while(!Key1);
                                 s1num++;
                                }
                         }
                        LCM_RW=0;
                          Write_Command_LCM(0x0f,1);                                    //光标闪
                                if(s1num==1)
                                {       
                                        Write_Command_LCM(0x80+0x07,1);                                         //年光标
                                  if(Key2==0)
                                     {
                                             delay_nms(30);
                                             if(Key2==0)
                                         {        
                                                        while(!Key2);
                                                        year++;
                                                          year=turn_val(year,1,1);                          //送入实时显示函数
                         }
                                      }
                            if(Key3==0)
                                {
                                        delay_nms(30);
                                        if(Key3==0)
                                         {       
                                                        while(!Key3);
                                                        year--;
                                                   year=turn_val(year,0,1);                                     
                                        }
                                      }
                               }
                                if(s1num==2)
                                {
                                Write_Command_LCM(0x80+0x0a,1);                                  //月光标
                                       if(Key2==0)
                                        {
                                                  delay_nms(20);
                                                  if(Key2==0)
                                                   {
                                                        while(!Key2);
                                                        month++;
                                                      month=turn_val(month,1,2);
                                          }
                                        }
                                        if(Key3==0)
                                        {
                                                   delay_nms(20);
                                                   if(Key3==0)
                                                   {
                                                        while(!Key3);
                                                        month--;
                                                      month=turn_val(month,0,2);
                                                   }
                                        }
                                }
                                if(s1num==3)
                                {       
                                        Write_Command_LCM(0x80+0x0d,1);                               //日光标
                                        if(Key2==0)
                                          {
                                                  delay_nms(20);
                                                  if(Key2==0)
                                                   {
                                                        while(!Key2);
                                                        day++;
                                                 day=turn_val(day,1,3);
                                          }
                                        }
                                        if(Key3==0)
                                        {
                                                   delay_nms(20);
                                                   if(Key3==0)
                                                   {
                                                        while(!Key3);
                                                        day--;
                                             day=turn_val(day,0,3);                //写入日寄存器
                                                   }
                                        }
                                }
                                if(s1num==4)
                                {
                                        Write_Command_LCM(0x80+0x10,1);                                   //星期光标
                                          if(Key2==0)
                                     {
                                                  delay_nms(20);
                                                  if(Key2==0)
                                                   {
                                                        while(!Key2);
                                                        week++;
                                                     week=turn_val(week,1,4);
                                          }
                                        }
                                        if(Key3==0)
                                        {
                                                   delay_nms(20);
                                                   if(Key3==0)
                                                   {
                                                        while(!Key3);
                                                        week--;
                                           week=turn_val(week,0,4);
                                                   }
                                        }
                                }
                                if(s1num==5)
                                {       
                                Write_Command_LCM(0x80+0x45,1);        //            //时光标
                                       if(Key2==0)
                                        {
                                                  delay_nms(20);
                                                  if(Key2==0)
                                                   {        
                                                        while(!Key2);
                                                        hour++;
                                       hour=turn_val(hour,1,5);
                                          }
                                        }
                                        if(Key3==0)
                                        {
                                                   delay_nms(20);
                                                   if(Key3==0)
                                                   {
                                                        while(!Key3);
                                                        hour--;
                                                 hour=turn_val(hour,0,5);
                                                   }
                                        }
                                }
                                if(s1num==6)                                    //调时间分
                                {
                                        Write_Command_LCM(0x80+0x48,1);        //定位秒
                                        if(Key2==0)
                                        {
                                                  delay_nms(20);
                                                  if(Key2==0)
                                                   {        
                                                        while(!Key2);
                                                        minute++;
                                                 minute=turn_val(minute,1,6);                                //写入分寄存器   
                                          }
                                        }
                                        if(Key3==0)
                                        {
                                                   delay_nms(20);
                                                   if(Key3==0)
                                                   {        
                                                        while(!Key3);
                                                        minute--;
                                                 minute=turn_val(minute,0,6);                                //写入分寄存器
                                                   }
                                        }
                                }
                                if(s1num==7)//调时间秒
                                {
                                        Write_Command_LCM(0x80+0x4b,1);        //定位秒//秒光标
                                        if(Key2==0)
                                        {
                                                  delay_nms(20);
                                                  if(Key2==0)
                                                   {
                                                        while(!Key2);
                                                        second++;
                                       if(second==60)
                                          second=0;
                                                 second=turn_val(second,1,7);       
                                          }
                                        }
                                        if(Key3==0)
                                        {
                                                   delay_nms(20);
                                                   if(Key3==0)
                                                   {
                                                        while(!Key3);
                                                        second--;
                                                 second=turn_val(second,0,7);                               
                                                   }
                                        }
                                }
          

                                if(s1num==8)                                        //按到最后一次,数据写入DS1307
                                {       
                                        //miao=Read1307(0x81);
                                        //second=miao;
                                        //Write1307(0x80,second&0x7f);
                                        s1num=0;                                          //s1num清零
                                        Write_Command_LCM(0x0c,1);                                        //光标不闪烁
                                  set_rtc_code= second;                                 //重新构造set_rtc_code数组
                                        set_rtc_code= minute;
                                        set_rtc_code= hour;
                                        set_rtc_code= week;
                                        set_rtc_code= day;
                                        set_rtc_code= month;
                                        set_rtc_code= year;
                                        Set_RTC();               //写入DS1307

                                        break;
                                }
                        }
                }
        }
        }
char COM(void)
{
        unsigned char i;   
        for(i=0;i<8;i++)          
        {
                U8FLAG=2;       
                while((!DHT)&&U8FLAG++);
                Delay_10us();
                Delay_10us();
                Delay_10us();
                U8temp=0;
                if(DHT)
                        U8temp=1;
                        U8FLAG=2;
                while((DHT)&&U8FLAG++);                //超时则跳出for循环                  
                   if(U8FLAG==1)break;                        //判断数据位是0还是1   
                U8comdata<<=1;
                           U8comdata|=U8temp;      
        }          
}
voidRH(void)                                                //读取温湿度
{
       DHT=0;
           Delay(180);                                //主机拉低18ms
           DHT=1;                                        //总线由上拉电阻拉高 主机延时20us
           Delay_10us();
           Delay_10us();
           Delay_10us();
           Delay_10us();                        //主机设为输入 判断从机响应信号
           DHT=1;                                        //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行          
           if(!DHT)                         
           {
                U8FLAG=2;                                //判断从机是否发出 80us 的低电平响应信号是否结束       
                  while((!DHT)&&U8FLAG++);
                   U8FLAG=2;                                 //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
                   while((DHT)&&U8FLAG++);        //数据接收状态,接收温度湿度数据               
                   COM();
                   U8RH_data_H_temp=U8comdata;
                   COM();
                   U8RH_data_L_temp=U8comdata;
                   COM();
                   U8T_data_H_temp=U8comdata;
                   COM();
                   U8T_data_L_temp=U8comdata;
                   COM();
                   U8checkdata_temp=U8comdata;
                   DHT=1;                                                 //数据校验
                   U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
                   if(U8temp==U8checkdata_temp)//数据校验成功,则转换
                   {
                        U8RH_data_H=U8RH_data_H_temp;
                             U8RH_data_L=U8RH_data_L_temp;
                          U8T_data_H=U8T_data_H_temp;
                             U8T_data_L=U8T_data_L_temp;
                             U8checkdata=U8checkdata_temp;
                        humi=U8RH_data_H/10+'0';        //湿度转换成字符串数组,存放于humi[]       
                           humi=(U8RH_data_H)%10+'0';
                        humi=0x25;
                        humi='R';
                        humi='H';
                        humi='\0';
                        temp=U8T_data_H/10+'0';        //温度转换成字符串数组,存放于temp[]       
                           temp=(U8T_data_H)%10+'0';
                        temp=0xdf;
                        temp='C';
                        temp='\0';
                   }
           }

        }

void display(void)
{
           Read_RTC();           //读取时钟
       
        RH();
                      //读取温湿度,
       
        chan();                        //转换函数
        Display_List_Char(0,0,"Date:20");
        Display_List_Char(0,7,date);
        Display_List_Char(0,16,weekdata);
        Display_List_Char(1,0,"Time:");
        Display_List_Char(1,5,time);
        Display_List_Char(2,0,"Temp:");                                   //        以下为屏幕显示格式
        Display_List_Char(2,5,temp);                                   //Date:2012-03-14 Wed
           Display_List_Char(2,10,"Humi:");                           //Time:19:16:46
        Display_List_Char(2,15,humi);                                   //Temp:21℃ Humi:28%RH
        Display_List_Char(3,1,"Happy Every Day!!!");
        //delay_nms(1000);
}
void main()
{        //init();       //影响按键,接在P3口串口通讯调试用
        LCM_Init();                   //液晶屏幕初始化
        Write_Command_LCM(0x80+0x10);         //清屏
                //Set_RTC(); //ds1307重置,第一次使用时,
        delay_nms(500);
        while(1)
        {               
        key_scan();
        display();
        delay_nms(300);
        }

}




一墙一别院 发表于 2013-12-16 20:16:47

I2C的头文件没有加吧!

qptimus 发表于 2013-12-16 21:34:51

没行号?看错报在哪里啊

kwleung 发表于 2013-12-17 08:13:24

/主函数

//主函数

shenhaiyu 发表于 2013-12-17 10:42:36

至少来点描述吧,干什么用的~~~

zoologist 发表于 2013-12-17 14:00:12

你找一下 bit 是在哪个头中定义的,然后在对应的文件中加入一些错误的代码

如果编译的时候没有报错,那就是你的头文件没有正确引用到。

学慧放弃 发表于 2013-12-17 17:39:49

是IIC通信协议的一个返回ACK出问题了,

港湾 发表于 2013-12-17 20:09:48

AT89S52+DS1307+DHT11+LCD2004实现万年历和温湿度显示用的

港湾 发表于 2013-12-17 20:12:31

shenhaiyu 发表于 2013-12-17 10:42 static/image/common/back.gif
至少来点描述吧,干什么用的~~~

你好拜托帮帮忙给改改好吗?AT89S52+DS1307+DHT11+LCD2004实现万年历和温湿度显示
页: [1]
查看完整版本: 请各位兄弟帮帮看看是什么原因