软件
仿真没有问题,实物连接后,发现数码管显示时间是静止不动的,原来仿真中一切正常的功能都不可以用了,有高手来指点下吗?
附近保护源代码和仿真图
DS1302-TIMER.rar
(144.53 KB, 下载次数: 36)
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_Al
ARMdata(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
{
 
ds1302有这个特性,他直接读取系统时钟,所以默认就是开启了ds1302。
实际中,不是,所以问题应该在开启时钟上了。
一周热门 更多>