51单片机+ds1302+18b20时钟可调温度程式问题

2019-07-18 08:44发布

软件仿真没有问题,实物连接后,发现数码管显示时间是静止不动的,原来仿真中一切正常的功能都不可以用了,有高手来指点下吗?
附近保护源代码和仿真图
DS1302-TIMER.rar (144.53 KB, 下载次数: 36)
595.JPG
18b20.c
/*18B20温度传感器*/
#include"delay.h"
#include"18b20.h"
/*--18b20初始化--*/
bit Init_DS18B20(void)
{
bit dat=0;
DQ = 1;         //DQ复位
DelayUs2x(5);   //稍做延时
DQ = 0;         //单片机将DQ拉低
DelayUs2x(200); //200精确延时 大于 480us 小于960us
DelayUs2x(200); //200
DQ = 1;        //拉高总线
DelayUs2x(50); //50 15~60us 后 接收60-240us的存在脉冲
dat=DQ;        //如果x=0则初始化成功, x=1则初始化失败
DelayUs2x(25); //稍作延时返回25
return dat;
}

/*--读取一个字节--*/
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
  DQ = 0; // 给脉冲信号
  dat>>=1;
  DQ = 1; // 给脉冲信号
  if(DQ)
   dat|=0x80;
  DelayUs2x(25);
}
return(dat);
}
/*--写入一个字节--*/
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
  DQ = 0;
  DQ = dat&0x01;
  DelayUs2x(25);
  DQ = 1;
  dat>>=1;
}
DelayUs2x(25);
}

/*--读取温度--*/
unsigned int ReadTemperature(void)
{
unsigned char a=0;
unsigned int b=0;
unsigned int t=0;
EA=0;            //总中断关闭
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
//EA=1;
WriteOneChar(0x44); // 启动温度转换
DelayMs(20);//10
//EA=0;
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();   //低位
b=ReadOneChar();   //高位
b<<=8;
t=a+b;
EA=1;            //总中断打开
return(t);
}

18b20.h
#ifndef __DS18B20_H__
#define __DS18B20_H__

#include<reg52.h>     
#include<intrins.h>

#define uchar unsigned char
#define uint   unsigned int;
/*--端口定义--*/
sbit DQ=P1^7;//ds18b20 端口
/*--函数声明--*/
unsigned int ReadTemperature(void);
bit Init_DS18B20(void);
unsigned char ReadOneChar(void);
void WriteOneChar(unsigned char dat);

#endif


ds1302.h
//<ds1302.h>文件内容

/**************************************************************************
  
                     THE REAL tiMER DS1302 DRIVER LIB
  
               COPYRIGHT (c)   2005 BY JJJ.
                         --  ALL RIGHTS RESERVED  --
  
   File Name:       DS1302.h
   Author:          Jiang Jian Jun
   Created:         2003/7/21
   Modified:  NO
   Revision:   1.0
  
***************************************************************************/
#ifndef _DS1302_H_
#define _DS1302_H_

sbit  DS1302_CLK = P1^3;               //实时时钟时钟线引脚
sbit  DS1302_RST  = P1^5;              //实时时钟数据线引脚
sbit  DS1302_IO = P1^4;                //实时时钟复位线引脚
sbit  ACC7 = ACC^7 ;

typedef struct __SYSTEMTIME__
{
unsigned char Second;
unsigned char Minute;
unsigned char Hour;
  unsigned char Year;
unsigned char Month;
unsigned char Day;
unsigned char Week;
} SYSTEMTIME;//定义的时间类型

#define AM(X) X
#define PM(X) (X+12)               // 转成24小时制
#define DS1302_SECOND 0x80
#define DS1302_MINUTE 0x82
#define DS1302_HOUR  0x84
#define DS1302_WEEK  0x8A
#define DS1302_DAY  0x86
#define DS1302_MONTH 0x88
#define DS1302_YEAR  0x8C
#define DS1302_RAM(X) (0xC0+(X)*2)    //用于计算 DS1302_RAM 地址的宏

void DS1302InputByte(unsigned char d)  //实时时钟写入一字节(内部函数)
{
    unsigned char i;
  
    for(i=0; i<8; i++)
    {
        DS1302_IO = (d&0x01);            //相当于汇编中的 RRC
        DS1302_CLK = 1;
        d >>=1 ;
        DS1302_CLK = 0;     
    }
}

unsigned char DS1302OutputByte(void)  //实时时钟读取一字节(内部函数)
{
    unsigned char i;
    for(i=8; i>0; i--)
    {
        ACC = ACC >>1;            //相当于汇编中的 RRC
        ACC7 = DS1302_IO;
        DS1302_CLK = 1;
        DS1302_CLK = 0;
    }
    return(ACC);
}

void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302地址, ucData: 要写的数据
{
    DS1302_RST = 0;
    DS1302_CLK = 0;
    DS1302_RST = 1;
    DS1302InputByte(ucAddr);        // 地址,命令
    DS1302InputByte(ucDa);        // 写1Byte数据
    DS1302_CLK = 1;
    DS1302_RST = 0;
}

unsigned char Read1302(unsigned char ucAddr) //读取DS1302某地址的数据
{
    unsigned char ucData;
    DS1302_RST = 0;
    DS1302_CLK = 0;
    DS1302_RST = 1;
    DS1302InputByte(ucAddr|0x01);        // 地址,命令
    ucData = DS1302OutputByte();         // 读1Byte数据
    DS1302_CLK = 1;
    DS1302_RST = 0;
    return(ucData);
}

void DS1302_SetProtect(bit flag)        //是否写保护
{
if(flag)
  Write1302(0x8E,0x80);       //是
else
  Write1302(0x8E,0x00);       //否
}



void DS1302_GetTime(SYSTEMTIME *Time)
{
unsigned char value;

value = Read1302(DS1302_SECOND);
Time->Second = ((value&0x70)>>4)*10 + (value&0x0F); //BCD码:十位+个位
value = Read1302(DS1302_MINUTE);
Time->Minute = ((value&0x70)>>4)*10 + (value&0x0F);
value = Read1302(DS1302_HOUR);
Time->Hour = ((value&0x70)>>4)*10 + (value&0x0F);
value = Read1302(DS1302_DAY);
Time->Day = ((value&0x70)>>4)*10 + (value&0x0F);
value = Read1302(DS1302_MONTH);
Time->Month = ((value&0x70)>>4)*10 + (value&0x0F);
value = Read1302(DS1302_YEAR);
Time->Year = ((value&0x70)>>4)*10 + (value&0x0F);
value = Read1302(DS1302_WEEK);
Time->Week = ((value&0x70)>>4)*10 + (value&0x0F);

}


void Initial_DS1302(void)
{
unsigned char Second=Read1302(DS1302_SECOND);
if(Second&0x80)   //假如DS1302 还没有开始工作时  
{  
  DS1302_SetProtect(0);  //禁止写保护
// Write1302(DS1302_MINUTE,0x59);    //为BCD码
// Write1302(DS1302_HOUR,0x23);        //最高位为低,表示24小时制
  Write1302(DS1302_SECOND,((0/10)<<4)|0);  //秒寄存器最高位写0//1,DS1302开始工作。
  DS1302_SetProtect(1);  //写保护
  }
}
/*
void Stop_DS1302(void)
{
  DS1302_SetProtect(0);
  Write1302(DS1302_SECOND,0x80);
  DS1302_SetProtect(1);  //写保护
}
*/
void modif_time(unsigned char second , unsigned char minute ,unsigned char hour)
{
  DS1302_SetProtect(0);
  Write1302(DS1302_MINUTE,(((minute/10)<<4)|(minute%10)));   
  Write1302(DS1302_HOUR,(((hour/10)<<4)|(hour%10)));        
  Write1302(DS1302_SECOND,(((second/10)<<4)|(second%10)));  
  DS1302_SetProtect(1);  //写保护
}
void modif_day(unsigned char day , unsigned char month ,unsigned char year)
{
  DS1302_SetProtect(0);
  Write1302(DS1302_YEAR,(((year/10)<<4)|(year%10)));
  Write1302(DS1302_MONTH,(((month/10)<<4)|(month%10)));            
  Write1302(DS1302_DAY,(((day/10)<<4)|(day%10)));   
  DS1302_SetProtect(1);  //写保护
}
void modif_week(unsigned char week)
{
  DS1302_SetProtect(0);
  Write1302(DS1302_WEEK,(((week/10)<<4)|(week%10)));   
  DS1302_SetProtect(1);  //写保护
}


void Wirte_AlARMdata(SYSTEMTIME *Time,unsigned char num)
{
   unsigned char RAM_ADDR=0xc0+num*4;
   DS1302_SetProtect(0);
   Write1302(RAM_ADDR,Time->Hour);
   Write1302(RAM_ADDR+2,Time->Minute);
   DS1302_SetProtect(1);  //写保护
}

void Read_Alarmdata(SYSTEMTIME *Time)
{
   unsigned char i;
   unsigned char RAM_ADDR=0xc0;
   DS1302_SetProtect(0);
   for(i=0;i<5;i++)
   {
     (Time+i)->Hour   = Read1302(RAM_ADDR);
     (Time+i)->Minute = Read1302(RAM_ADDR+2);
     RAM_ADDR +=4 ;
   }
   DS1302_SetProtect(1);

}

delay.c
/********************************************************************************/
#endif

#include "delay.h"
/*------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{
     
while(t--)
{
     //大致延时1mS
     DelayUs2x(245);
     DelayUs2x(245);
}
}

delay.h
#ifndef __DELAY_H__
#define __DELAY_H__
/*------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t);
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t);

#endif

74hc595.c
sbit LATCH = P1^0;   //ST 锁存输出信号
sbit SRCLK= P1^1;    //SCK 串行时钟信号
sbit SER  = P1^2;    //SER 串行数据

unsigned char code wing_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
unsigned char code wing_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
unsigned char TempData[8]; //存储显示值的全局变量
void TDisplay(unsigned char FirstBit,unsigned char Num);//数码管显示函数
/*74HC595串口数码管扫描*/
void SendByte(unsigned char dat)
{   
  unsigned char i;         
   for(i=0;i<8;i++)
        {
         SRCLK=0;
         SER=dat&0x80;
         dat<<=1;
         SRCLK=1;
        }         
}
void Send2Byte(unsigned char dat1,unsigned char dat2)
{   
   SendByte(dat1);
   SendByte(dat2);      
}
void Out595(void)
{
        LATCH=1;
        _nop_();
        LATCH=0;
}
/*74HC595串口数码管扫描*/
void TDisplay(unsigned char FirstBit,unsigned char Num)//定时抽水数码管串口扫描
{
      static unsigned char i;
       Send2Byte(wing_WeiMa[FirstBit+i],TempData);
       Out595();      
       i++;
       if(i==Num)
          i=0;
}


主程式
TIMER-02.c
//完整程序源代码
#include <reg52.h>
#include <intrins.h>
#include "ds1302.h"
#include "18b20.h"
#include "74hc595.c"


SYSTEMTIME CTime[6];

sbit beep=P1^6;
sbit light=P3^7;

sbit LED1=P0^0;//LED
sbit LED2=P0^1;
sbit LED3=P0^2;
sbit LED4=P0^3;
sbit RUNLED=P0^4;


sbit LD1=P2^0;//按钮
sbit LD2=P2^1;
sbit LD3=P2^2;
sbit LD4=P2^3;
sbit RUN=P2^4;
sbit STOP=P2^5;
sbit AT=P2^6;
sbit TT=P2^7;
sbit ADD=P3^0;
sbit DEC=P3^1;
sbit TT_SET=P3^2;
sbit CC_ENT=P3^3;
sbit MF_UP=P3^4;
sbit CT_SET=P3^5;


bit LD1_Flag;//标志位
bit LD2_Flag;
bit LD3_Flag;
bit LD4_Flag;
bit RUN_Flag;
bit AT_Flag;
bit TT_Flag;
bit ReadTempFlag;//定义读温度标志
bit KeyPressFlag;//定义按键标志位
bit UpdateTimeFlag;//定义读时间标志



//温度
uint  TempH,TempL,Tempx,dba;

//时间
bit key1,key2,key3,key4;
uint state,gai,sett,bee,count,ring_flag,m,i,j;
//uint state,gai,sett,key1,key2,key3,key4,temp,bee,count,ring_flag,m,i,j;
uchar displaynum;
uchar key_press_num,fen,miao;

unsigned char KeyScan(void);//键盘扫描
void key_box();
void pump();//抽水
void time();
void beepscan();
void beepring();
void wendu();//温度
void shizhong();//时钟
void naozhong();//闹钟
void DelayUs2x(unsigned char t);//us级延时函数声明
void DelayMs(unsigned char t); //ms级延时
void Init_Timer0(void);//定时器0初始化
void main()
{   
    Init_Timer0(); //调用定时器0
    Initial_DS1302();
    Read_Alarmdata(CTime+1);
    while(1)
    {   
        if((!LD1_Flag)&&(!LD2_Flag)&&(!LD3_Flag)&&(!LD4_Flag))  //初始化
        {
             LED1=0;
             RUN_Flag=0;
             LD1_Flag=1;
        }
        DS1302_GetTime(&CTime);
        key_box();        
        if(RUN_Flag)
        {                                            
             pump();        
        }
        else
        {
             time();
        }   
        beepscan();
        beepring();
    }
}

void shizhong()//时钟
{
    if(1==sett)//设置时间
    {   
        if((gai==0)||(gai==1))
        {           
             TempData[0]=wing_DuanMa[CTime[0].Hour/10];//时闪
             TempData[1]=wing_DuanMa[CTime[0].Hour%10];
             DelayMs(200);
             TempData[0]=wing_DuanMa[CTime[0].Hour/10]|0x80;//时
             TempData[1]=wing_DuanMa[CTime[0].Hour%10]|0x80;
             DelayMs(200);
             TempData[2]=0x40;
             TempData[3]=wing_DuanMa[CTime[0].Minute/10];//分
             TempData[4]=wing_DuanMa[CTime[0].Minute%10];
             TempData[5]=0x40;
             TempData[6]=wing_DuanMa[CTime[0].Second/10];//秒
             TempData[7]=wing_DuanMa[CTime[0].Second%10];
        }
        if(gai==2)
        {
             TempData[0]=wing_DuanMa[CTime[0].Hour/10];//时   
             TempData[1]=wing_DuanMa[CTime[0].Hour%10];
             TempData[2]=0x40;                                    
             TempData[3]=wing_DuanMa[CTime[0].Minute/10];//分闪
             TempData[4]=wing_DuanMa[CTime[0].Minute%10];
             DelayMs(200);
             TempData[3]=wing_DuanMa[CTime[0].Minute/10]|0x80;//分
             TempData[4]=wing_DuanMa[CTime[0].Minute%10]|0x80;
             DelayMs(200);
             TempData[5]=0x40;
             TempData[6]=wing_DuanMa[CTime[0].Second/10];//秒
             TempData[7]=wing_DuanMa[CTime[0].Second%10];
        }
        if(gai==3)
        {
             TempData[0]=wing_DuanMa[CTime[0].Hour/10];//时   
             TempData[1]=wing_DuanMa[CTime[0].Hour%10];
             TempData[2]=0x40;                                    
             TempData[3]=wing_DuanMa[CTime[0].Minute/10];//分
             TempData[4]=wing_DuanMa[CTime[0].Minute%10];
             TempData[5]=0x40;
             TempData[6]=wing_DuanMa[CTime[0].Second/10];//秒闪
             TempData[7]=wing_DuanMa[CTime[0].Second%10];
             DelayMs(200);
             TempData[6]=wing_DuanMa[CTime[0].Second/10]|0x80;//秒
             TempData[7]=wing_DuanMa[CTime[0].Second%10]|0x80;
             DelayMs(200);
        }   
    }                    
    else if(2==sett)//设置日期
    {   
        if((gai==0)||(gai==1))
        {           
             TempData[0]=wing_DuanMa[CTime[0].Year/10];//年闪
             TempData[1]=wing_DuanMa[CTime[0].Year%10];
             DelayMs(200);
             TempData[0]=wing_DuanMa[CTime[0].Year/10]|0x80;//年
             TempData[1]=wing_DuanMa[CTime[0].Year%10]|0x80;
             DelayMs(200);
             TempData[2]=0x08;
             TempData[3]=wing_DuanMa[CTime[0].Month/10];//月
             TempData[4]=wing_DuanMa[CTime[0].Month%10];
             TempData[5]=0x08;
             TempData[6]=wing_DuanMa[CTime[0].Day/10];//日
             TempData[7]=wing_DuanMa[CTime[0].Day%10];
        }
        if(gai==2)
        {
             TempData[0]=wing_DuanMa[CTime[0].Year/10];//年
             TempData[1]=wing_DuanMa[CTime[0].Year%10];
             TempData[2]=0x08;                                    
             TempData[3]=wing_DuanMa[CTime[0].Month/10];//月闪
             TempData[4]=wing_DuanMa[CTime[0].Month%10];
             DelayMs(200);
             TempData[3]=wing_DuanMa[CTime[0].Month/10]|0x80;//月
             TempData[4]=wing_DuanMa[CTime[0].Month%10]|0x80;
             DelayMs(200);
             TempData[5]=0x08;
             TempData[6]=wing_DuanMa[CTime[0].Day/10];//日
             TempData[7]=wing_DuanMa[CTime[0].Day%10];
        }
        if(gai==3)
        {
             TempData[0]=wing_DuanMa[CTime[0].Year/10];//年
             TempData[1]=wing_DuanMa[CTime[0].Year%10];
             TempData[2]=0x08;                                    
             TempData[3]=wing_DuanMa[CTime[0].Month/10];//月
             TempData[4]=wing_DuanMa[CTime[0].Month%10];
             TempData[5]=0x08;
             TempData[6]=wing_DuanMa[CTime[0].Day/10];//日闪
             TempData[7]=wing_DuanMa[CTime[0].Day%10];
             DelayMs(200);
             TempData[6]=wing_DuanMa[CTime[0].Day/10]|0x80;//日
             TempData[7]=wing_DuanMa[CTime[0].Day%10]|0x80;
             DelayMs(200);
        }   

    }   
    else if(3==sett)//设置星期
    {

             TempData[0]=0x40;
             TempData[1]=wing_DuanMa[CTime[0].Week%10];//周闪
             DelayMs(200);            
             TempData[1]=wing_DuanMa[CTime[0].Week%10]|0x80;//周
             DelayMs(200);
             TempData[2]=0x40;                                    
             wendu();//温度   
    }
    else if(0==sett) //正常显示时间
    {

        DelayMs(20);
           dba++;
        if(dba>=0&&dba<=299)
           {displaynum=0;}
        if(dba>=300&&dba<=599)
            {displaynum=1;}
        if(dba>=600&&dba<=899)
            {displaynum=2;}
        if(dba==900)
            {dba=0;}
        if(00==displaynum) //显示时间
        {
            TempData[0]=wing_DuanMa[CTime[0].Hour/10];//时        
            TempData[1]=wing_DuanMa[CTime[0].Hour%10];
            TempData[2]=0x40;                                    
            TempData[3]=wing_DuanMa[CTime[0].Minute/10];//分
            TempData[4]=wing_DuanMa[CTime[0].Minute%10];
            TempData[5]=0x40;
            TempData[6]=wing_DuanMa[CTime[0].Second/10];//秒
            TempData[7]=wing_DuanMa[CTime[0].Second%10];
        }
        if(1==displaynum) //显示日期
        {   
            TempData[0]=wing_DuanMa[CTime[0].Year/10];//年            
            TempData[1]=wing_DuanMa[CTime[0].Year%10];
            TempData[2]=0x08;                                    
            TempData[3]=wing_DuanMa[CTime[0].Month/10];//月
            TempData[4]=wing_DuanMa[CTime[0].Month%10];
            TempData[5]=0x08;
            TempData[6]=wing_DuanMa[CTime[0].Day/10];//日
            TempData[7]=wing_DuanMa[CTime[0].Day%10];
        }         
        if(2==displaynum) //显示周 温度
        {   
            TempData[0]=0x40;            
            TempData[1]=wing_DuanMa[CTime[0].Week%10];//周
            TempData[2]=0x40;                                    
            wendu();//温度                           
        }
    }   
}   

void naozhong()//闹钟
{
    if(gai==1)
    {           
           TempData[0]=wing_DuanMa[CTime[state].Hour/10];//时闪
           TempData[1]=wing_DuanMa[CTime[state].Hour%10];
           DelayMs(200);
           TempData[0]=wing_DuanMa[CTime[state].Hour/10]|0x80;//时
           TempData[1]=wing_DuanMa[CTime[state].Hour%10]|0x80;
           DelayMs(200);
           TempData[2]=0x01;
           TempData[3]=wing_DuanMa[CTime[state].Minute/10];//分
           TempData[4]=wing_DuanMa[CTime[state].Minute%10];
           TempData[5]=0x01;
           TempData[6]=wing_DuanMa[CTime[state].Second];//1为开,0为关
           TempData[7]=wing_DuanMa[state];//闹钟序号            
    }
    else if(gai==2)
    {
           TempData[0]=wing_DuanMa[CTime[state].Hour/10];//时   
           TempData[1]=wing_DuanMa[CTime[state].Hour%10];
           TempData[2]=0x01;                                    
           TempData[3]=wing_DuanMa[CTime[state].Minute/10];//分闪
           TempData[4]=wing_DuanMa[CTime[state].Minute%10];
           DelayMs(200);
           TempData[3]=wing_DuanMa[CTime[state].Minute/10]|0x80;//分
           TempData[4]=wing_DuanMa[CTime[state].Minute%10]|0x80;
           DelayMs(200);
           TempData[5]=0x01;
           TempData[6]=wing_DuanMa[CTime[state].Second];//1为开,0为关
           TempData[7]=wing_DuanMa[state];//闹钟序号            
    }
    else if(gai==3)
    {
           TempData[0]=wing_DuanMa[CTime[state].Hour/10];//时   
           TempData[1]=wing_DuanMa[CTime[state].Hour%10];
           TempData[2]=0x01;                                    
           TempData[3]=wing_DuanMa[CTime[state].Minute/10];//分
           TempData[4]=wing_DuanMa[CTime[state].Minute%10];
           TempData[5]=0x01;
           TempData[6]=wing_DuanMa[CTime[state].Second];//秒闪
           DelayMs(200);
           TempData[6]=wing_DuanMa[CTime[state].Second]|0x80;//1为开,0为关
           DelayMs(200);
           TempData[7]=wing_DuanMa[state];//闹钟序号            
    }
    else
    {           
           TempData[0]=wing_DuanMa[CTime[state].Hour/10];//时
           TempData[1]=wing_DuanMa[CTime[state].Hour%10];
           TempData[2]=0x01;
           TempData[3]=wing_DuanMa[CTime[state].Minute/10];//分
           TempData[4]=wing_DuanMa[CTime[state].Minute%10];
           TempData[5]=0x01;
           TempData[6]=wing_DuanMa[CTime[state].Second];//1为开,0为关
           TempData[7]=wing_DuanMa[state];//闹钟序号            
    }
}

void pump()//抽水
{
    static unsigned char i;
    if(AT_Flag)
    {
         TempData[0]=wing_DuanMa[CTime[0].Hour/10];//时        
         TempData[1]=wing_DuanMa[CTime[0].Hour%10];
        if(CTime[0].Second%2==0)
         TempData[2]=0;
        else
         TempData[2]=0x40;
         TempData[3]=wing_DuanMa[CTime[0].Minute/10];//分
         TempData[4]=wing_DuanMa[CTime[0].Minute%10];
         TempData[5]=0;
         TempData[6]=0x73;
         i++;
        if(1==i)
            {TempData[7]=0x01;DelayMs(200);}
        else if(2==i)
            {TempData[7]=0x02; DelayMs(200);}
        else if(3==i)
            {TempData[7]=0x04; DelayMs(200);}
        else if(4==i)
            {TempData[7]=0x08; DelayMs(200);}
        else if(5==i)
            {TempData[7]=0x10;  DelayMs(200);}
        else
            {i=0; TempData[7]=0x20; DelayMs(200);}
                    
    }
    else if(TT_Flag)
    {
        if(UpdateTimeFlag==1)//更新数码管显示
        {
             UpdateTimeFlag=0;
             TempData[0]=wing_DuanMa[fen/10];
             TempData[1]=wing_DuanMa[fen%10];
             TempData[2]=0x40;
             TempData[3]=wing_DuanMa[miao/10];
             TempData[4]=wing_DuanMa[miao%10];
             TempData[5]=0;            
             TempData[6]=0x73;
             i++;
            if(1==i)
                {TempData[7]=0x01;DelayMs(200);}
            else if(2==i)
                {TempData[7]=0x02; DelayMs(200);}
            else if(3==i)
                {TempData[7]=0x04; DelayMs(200);}
            else if(4==i)
                {TempData[7]=0x08; DelayMs(200);}
            else if(5==i)
                {TempData[7]=0x10;  DelayMs(200);}
            else
                {i=0; TempData[7]=0x20; DelayMs(200);}
        }
    }
}

void key_box()
{
if(!ADD)
    {
     DelayMs(10);
     if((!ADD)&&(!LD1_Flag))
       {
       while(!ADD)
        {
        key_press_num++;
        DelayMs(10);
        if(key_press_num==200)
          {
           key_press_num=0;
           while(!ADD)
               {
                   if(fen<99)
                  fen++;
                pump();
                DelayMs(50);
                }
            }
        }
      key_press_num=0;
           if(fen<99)
              fen++;
       }
    }

if(!DEC)
    {
     DelayMs(10);
     if(!DEC)
       {
       while(!DEC)
        {
        key_press_num++;
        DelayMs(10);
        if(key_press_num==200)
          {
           key_press_num=0;
           while(!DEC)
               {
                   if(fen>0)
                   fen--;
                pump();
                DelayMs(50);
                }
            }
        }
      key_press_num=0;
           if(fen>0)
              fen--;         
        }
    }
if(!LD1)  //高水位
    {
           DelayMs(10); //10-20ms
     if(!LD1)   
       {
        LD1_Flag=1;
        LD2_Flag=0;
        LD3_Flag=0;
        LD4_Flag=0;
        RUN_Flag=0;
        fen=0;
        miao=0;
        state=0;
        sett=0;        
       }        
    }
if(!LD2)  //三份水位
    {
           DelayMs(10); //10-20ms
     if(!LD2)     
       {
        LD1_Flag=0;
        LD2_Flag=1;
        LD3_Flag=0;
        LD4_Flag=0;         
       }
    }
if(!LD3)  //二份水位
    {
           DelayMs(10);
     if(!LD3)   
       {
        LD1_Flag=0;
        LD2_Flag=0;
        LD3_Flag=1;
        LD4_Flag=0;
       }        
    }
if(!LD4)  //低水位  
    {
           DelayMs(10);
     if(!LD4)   
       {
        if(AT_Flag)
         { LD1_Flag=0;
           LD2_Flag=0;
           LD3_Flag=0;
           LD4_Flag=1;
           RUN_Flag=1;
         }
        else
          LD1_Flag=0;
          LD2_Flag=0;
          LD3_Flag=0;
          LD4_Flag=1;         
       }
    }      
if(!RUN)  //手动开泵
    {
         DelayMs(5);
     if((!RUN)&&(AT_Flag)&&(!LD1_Flag))   
       {
        RUN_Flag=1;            
       }
    }
if(!STOP)  //手动关泵
    {
         DelayMs(5);
     if(!STOP)   
       {
        RUN_Flag=0;
        fen=0;
        miao=0;
        sett=0;
        state=0;        
       }
    }
if(!AT)  //抽水模式
    {
         DelayMs(10);
     if(!AT)   
       {
        AT_Flag=1;
        TT_Flag=0;   
       }
    }
if(!TT)  //抽水模式
    {
         DelayMs(10);
     if(!TT)   
       {
        AT_Flag=0;
        TT_Flag=1;   
       }
    }
if(!TT_SET)  //设定时钟
    {
     DelayMs(10); //10-20ms
     if(!TT_SET)     
       {
        while(!TT_SET);//等待释放
           {
           key1=1;
            }
       }
    }      
if(!CC_ENT)  //选定
    {
     DelayMs(10); //10-20ms
     if(!CC_ENT)   
       {
        while(!CC_ENT);//等待释放
           {
           key2=1;
            }
       }
    }
if(!MF_UP)  //更改
    {
     DelayMs(10); //10-20ms
     if(!MF_UP)     
       {
        while(!MF_UP);//等待释放
           {
           key3=1;
            }
       }
    }
if(!CT_SET)  //闹钟设定
    {
     DelayMs(10); //10-20ms
     if(!CT_SET)   
       {
        while(!CT_SET);//等待释放
           {
           key4=1;
            }
       }
    }   
}

void time()//扫描键盘
{
        if(UpdateTimeFlag==1)
        {
               UpdateTimeFlag=0;
            if(state==0)
                 shizhong();
            else
                 naozhong();
        }            
        if(sett)        
        {
            state=0;
            if(sett==1)
                 modif_time(CTime[state].Second,CTime[state].Minute,CTime[state].Hour);
            if(sett==2)
                 modif_day(CTime[state].Day,CTime[state].Month,CTime[state].Year);
            if(sett==3)
                 modif_week(CTime[state].Week);   
        }
        else
        {
            Wirte_Alarmdata(CTime+state,state-1);
        }               
        if(key1)
        {   
            gai=0;
            if(5==state)
                 {state=0;displaynum=0;dba=0;}
            else
                 state++;            
            key1=0;
        }
        if(key2)
        {
            if(gai==3)
               gai=1;
             else
               gai++;
               key2=0;
        }
        if(key3)
        {   
             //if((state==0)&&(gai!=0)); Stop_DS1302();
              if(gai==1)
            {   
                if(sett==1)
                   {
                    if(CTime[state].Hour>=23)
                         CTime[state].Hour=0;
                    else
                         CTime[state].Hour++;
                }
                else if(sett==2)
                   {   
                    if(CTime[state].Year>=20)
                         CTime[state].Year=0;
                    else
                         CTime[state].Year++;
                }
                else if(sett==3)
                   {   
                    if(CTime[state].Week>=8)
                         CTime[state].Week=1;
                    else
                         CTime[state].Week++;
                }
                else
                   {
                    if(CTime[state].Hour>=23)
                         CTime[state].Hour=0;
                    else
                         CTime[state].Hour++;
                }
            }
            else if(gai==2)
            {   
                if(sett==1)
                {
                    if(CTime[state].Minute>=59)
                         CTime[state].Minute=0;
                    else
                         CTime[state].Minute++;   
                }
                else if(sett==2)
                   {   
                    if(CTime[state].Month>=13)
                         CTime[state].Month=1;
                    else
                         CTime[state].Month++;
                }
                else
                {
                    if(CTime[state].Minute>=59)
                         CTime[state].Minute=0;
                    else
                         CTime[state].Minute++;   
                }               
            }
            else
            {
                if(state==0)
                {
                    if(sett==1)
                       {   
                        if(CTime[state].Second>=59)
                             CTime[state].Second=0;
                        else
                             CTime[state].Second++;
                    }      
                    if(sett==2)
                       {   
                        if(CTime[state].Day>=32)
                             CTime[state].Day=1;
                        else
                             CTime[state].Day++;
                    }                                
                }
                else
                {
          
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。