软件
仿真没有问题,实物连接后,发现数码管显示时间是静止不动的,原来仿真中一切正常的功能都不可以用了,有高手来指点下吗?
附近保护源代码和仿真图
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
#include
#define uchar unsigned char
#define uint unsigned int;
/*--端口定义--*/
***it DQ=P1^7;//ds18b20 端口
/*--函数声明--*/
unsigned int ReadTemperature(void);
bit Init_DS18B20(void);
unsigned char ReadOneChar(void);
void WriteOneChar(unsigned char dat);
#endif
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_
***it DS1302_CLK = P1^3; //实时时钟时钟线引脚
***it DS1302_RST = P1^5; //实时时钟数据线引脚
***it DS1302_IO = P1^4; //实时时钟复位线引脚
***it 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
***it LATCH = P1^0; //ST 锁存输出信号
***it SRCLK= P1^1; //SCK 串行时钟信号
***it 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
#include
#include "ds1302.h"
#include "18b20.h"
#include "74hc595.c"
SYSTEMTIME CTime[6];
***it beep=P1^6;
***it light=P3^7;
***it LED1=P0^0;//LED
***it LED2=P0^1;
***it LED3=P0^2;
***it LED4=P0^3;
***it RUNLED=P0^4;
***it LD1=P2^0;//按钮
***it LD2=P2^1;
***it LD3=P2^2;
***it LD4=P2^3;
***it RUN=P2^4;
***it STOP=P2^5;
***it AT=P2^6;
***it TT=P2^7;
***it ADD=P3^0;
***it DEC=P3^1;
***it TT_SET=P3^2;
***it CC_ENT=P3^3;
***it MF_UP=P3^4;
***it 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
{
if(CTime[state].Second==0)
CTime[state].Second=1;
else
CTime[state].Second=0;
}
}
key3=0;
}
if(key4)
{
gai=1;
if(4==sett)
{ sett=0; state=0; displaynum=0; dba=0; }
else
sett++;
key4=0;
}
}
void beepscan()//闹钟
{
if(RUN_Flag)
DS1302_GetTime(&CTime);
ring_flag=0;
if(i==5)
i=1;
else
i++;
if((CTime.Second==1)&&(CTime.Minute==CTime[0].Minute)&&(CTime.Hour==CTime[0].Hour))
ring_flag=1;
else if((CTime.Second==1)&&(CTime.Minute+1==CTime[0].Minute)&&(CTime.Hour==CTime[0].Hour))
{
ring_flag=0;
beep=1;
light=1;
}
else
ring_flag=0;
}
void beepring()//闹钟响
{
if(count>=2)
{
count=0;
if(ring_flag)
{
beep=~beep;
light=~light;
}
else
ring_flag=0;
}
}
void wendu()//温度
{
if(ReadTempFlag==1)
{
ReadTempFlag=0;
//Stop_DS1302();
Tempx=ReadTemperature();
if(Tempx&0x8000)
{
//TTime[2]=0x40;//负号标志
Tempx=~Tempx; // 取反加1
Tempx +=1;
}
else
//TTime[2]=0;
TempH=Tempx>>4;
TempL=Tempx&0x0F;
TempL=TempL*6/10;//小数近似处理
if(TempH/100==0)
TempData[3]=0;
else
TempData[3]=wing_DuanMa[TempH/100]; //百位温度
if((TempH/100==0)&&((TempH%100)/10==0))//十位消隐
TempData[4]=0;
else
TempData[4]=wing_DuanMa[(TempH%100)/10]; //十位温度
TempData[5]=wing_DuanMa[(TempH%100)%10]|0x80; //个位温度,带小数点
TempData[6]=wing_DuanMa[TempL];
TempData[7]=0x39; //显示C符号
}
}
void Init_Timer0(void)//定时器0定义
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
//TH0=0x00; //给定初值
//TL0=0x00;
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
void Timer0_isr(void) interrupt 1 //定时器0中断
{
static unsigned int i,lv,num;
TH0=(65536-1000)/256;//1ms
TL0=(65536-1000)%256;
count++;
TDisplay(0,8);
i++;
if(i==10) //20ms
{
i=0;
UpdateTimeFlag=1;
}
num++;
if(num==1000) // 倒计速度约1S
{
num=0;
if(!RUN_Flag)
{ ReadTempFlag=1;}
if((fen!=0)||miao)// 倒计时条件
miao--;// 秒--
if(miao==0xff)// 如果秒减到00时,重新赋值59
{
miao=59;
if(fen>0)// 如果分钟大于零减1
{ fen--;}
}
}
lv++;
if(lv==500) //延时1s 扫描水位标志
{
lv=0;
if(LD1_Flag) //高水位
{
LED1=0;
RUN_Flag=0;
}
if(!LD1_Flag)
{ LED1=1; }
if(LD2_Flag) //三份水位
{
if(RUN_Flag)
LED2=!LED2;
else
LED2=0;
}
if(!LD2_Flag)
{ LED2=1; }
if(LD3_Flag) //二份水位
{
if(RUN_Flag)
LED3=!LED3;
else
LED3=0;
}
if(!LD3_Flag)
{ LED3=1; }
if(LD4_Flag) //低水位
{
if(RUN_Flag)
LED4=!LED4;
else
LED4=0;
}
if(!LD4_Flag)
{ LED4=1; }
if(((TT_Flag)&&((fen!=0)||(miao!=0)))||((AT_Flag)&&(LD4_Flag)))//开泵条件
{ RUN_Flag=1;}
if(((TT_Flag)&&(fen==0)&&(miao==0))||(LD1_Flag))//定时模式时,水满停泵
{ RUN_Flag=0; }
if(RUN_Flag) //开泵
{ RUNLED=0; }
if(!RUN_Flag) //关泵
{ RUNLED=1; }
}
}