#include "STC15.h"
#include "ds1302.h"
#include "iic.h"
#include "intrins.h"
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
u8 e_write_flag=0;
u8 mode=0;
u8 code t_display[]={ //标准字库
// 0 1 2 3 4 5 6 7 8 9 -
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x40};
void Delay1ms() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
void delay_ms(u16 i)
{
while(i--)
Delay1ms();
}
void dis_num(u8 x,u8 num) //数码管显示
{
P0=0X01<
P2=0XC0;
P2=0X00;
P0=~t_display[num];
P2=0XE0;
Delay1ms();
P0=0XFF;
P2=0X00;
}
u8 ad() //AD采集
{
u8 i;
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x03);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
i=IIC_RecByte();
IIC_Stop();
return i;
}
void DS1302_Init() //1302初始化
{
Write_Ds1302(0x8e,0x00);
Write_Ds1302(0x80,0x55);
Write_Ds1302(0x82,0x59);
Write_Ds1302(0x84,0x23);
Write_Ds1302(0x8e,0x80);
}
void show_time() //显示时间
{
u8 i;
i=Read_Ds1302(0x85);
dis_num(0,(i&0xf0)>>4);
dis_num(1,(i&0x0f));
dis_num(2,10);
i=Read_Ds1302(0x83);
dis_num(3,(i&0xf0)>>4);
dis_num(4,(i&0x0f));
dis_num(5,10);
i=Read_Ds1302(0x81);
dis_num(6,(i&0xf0)>>4);
dis_num(7,(i&0x0f));
}
void write_eeprom(u8 adr,u8 dat) //写入EEPROM
{
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(adr);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
u8 read_eeprom(u8 adr) //读取EEPROM
{
u8 i;
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(adr);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0xa1);
IIC_WaitAck();
i=IIC_RecByte();
IIC_Stop();
return i;
}
u8 scan_key() //按键扫描
{
u8 key,i;
for(i=0;i<2;i++)
{
P3|=0X0F;
switch(i)
{
case 0:{P44=0;P42=1;}break;
case 1:{P44=1;P42=0;}break;
}
key=P3&0X0F;
if(key!=0x0f)
{
delay_ms(30);
key=P3&0X0F;
if(key!=0x0f)
{
while((P3&0X0F)!=0X0F);
switch(key)
{
case 0x0e:return i*4+7;break;
case 0x0d:return i*4+6;break;
case 0x0b:return i*4+5;break;
case 0x07:return i*4+4;break;
}
}
}
}
return 0;
}
void Time0_Init()
{
AUXR = 0x80; //定时器0为1T模式
TMOD = 0x04; //设置定时器0为16位自动重装载外部记数模式
TH0 = TL0 = 0xff; //设置定时器0初始值
TR0 = 0; //定时器0开始工作
ET0 = 1; //开定时器0中断
}
void Timer1Init(void) //50毫秒@11.0592MHz
{
AUXR &= 0xBF; //定时器时钟12T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0x00; //设置定时初值
TH1 = 0x4C; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 0; //定时器1开始计时
ET1 = 1;
}
void Timer2Init(void) //50毫秒@11.0592MHz
{
AUXR &= 0xFB; //定时器时钟12T模式
T2L = 0x00; //设置定时初值
T2H = 0x4C; //设置定时初值
IE2 |= (1<<2); //允许中断
AUXR |= 0x10; //定时器2开始计时
IE2 |= 0x04; //开定时器2中断
}
//调整时间
bit change_time()
{
u8 x,k,temp_0,temp_1,show_flag;
u8 time[3]={0};
x=Read_Ds1302(0x85);
time[0]=((x&0xf0)>>4)*10+(x&0x0f);
x=Read_Ds1302(0x83);
time[1]=((x&0xf0)>>4)*10+(x&0x0f);
x=Read_Ds1302(0x81);
temp_0=x;
time[2]=((x&0xf0)>>4)*10+(x&0x0f);
x=0;
show_flag=1;
while(1)
{
if(show_flag)
{
dis_num(x*3,time[x]/10);
dis_num(x*3+1,time[x]%10);
}
switch(x)
{
case 0:{dis_num(2,10);dis_num(3,time[1]/10);dis_num(4,time[1]%10);dis_num(5,10);dis_num(6,time[2]/10);dis_num(7,time[2]%10);}break;
case 1:{dis_num(0,time[0]/10);dis_num(1,time[0]%10);dis_num(2,10);dis_num(5,10);dis_num(6,time[2]/10);dis_num(7,time[2]%10);}break;
case 2:{dis_num(0,time[0]/10);dis_num(1,time[0]%10);dis_num(2,10);dis_num(3,time[1]/10);dis_num(4,time[1]%10);dis_num(5,10);}break;
}
k=scan_key();
if(k==7)
{
Write_Ds1302(0x8e,0x00);
Write_Ds1302(0x80,(((time[2]/10)<<4)|(time[2]%10)));
Write_Ds1302(0x82,(((time[1]/10)<<4)|(time[1]%10)));
Write_Ds1302(0x84,(((time[0]/10)<<4)|(time[0]%10)));
Write_Ds1302(0x8e,0x80);
return 0;
}
if(k!=0)
{
switch(k)
{
case 4:{x++;if(x==3)x=0;}break;
case 11:{time[x]++;if(time[x]>59)time[x]=0;}break;
case 10:{if((x!=0)&(time[x]==0))time[x]=60;if((x==0)&(time[x]==0))time[x]=13;time[x]--;}break;
}
}
temp_1=Read_Ds1302(0x81);
if(temp_1!=temp_0)
{
temp_0=temp_1;
show_flag=!show_flag;
}
}
}
bit menu_1()//显示时间和设置时间
{
u8 k,x;
x=0;
while(1)
{
show_time();
k=scan_key();
if(k==4)
{
change_time();
}
switch(k)
{
case 6:{mode=1;return 1;}break;
case 5:{mode=2;return 1;}break;
case 9:{mode=3;return 1;}break;
}
}
}
u8 V[2]={0,0};
bit change_V() //修改电压上下限
{
u8 k,x,show_flag,temp_0,temp_1;
x=0;
show_flag=1;
temp_0=Read_Ds1302(0x81);
while(1)
{
if(show_flag)
{
if(x)
{
dis_num(4,V[1]/10);
dis_num(5,V[1]%10);
dis_num(6,0);
dis_num(7,0);
}
else
{
dis_num(0,V[0]/10);
dis_num(1,V[0]%10);
dis_num(2,0);
dis_num(3,0);
}
}
if(x)
{
dis_num(0,V[0]/10);
dis_num(1,V[0]%10);
dis_num(2,0);
dis_num(3,0);
}
else
{
dis_num(4,V[1]/10);
dis_num(5,V[1]%10);
dis_num(6,0);
dis_num(7,0);
}
k=scan_key();
temp_1=Read_Ds1302(0x81);
if(temp_1!=temp_0)
{
temp_0=temp_1;
show_flag=!show_flag;
}
if(k!=0)
{
switch(k)
{
case 4:{x++;if(x==2)x=0;}break;
case 11:{
if((x==1)&(V[0]>V[1])&(V[1]<95))
V[x]+=5;
if((x==0)&(V[0]<95))
V[x]+=5;
}break;
case 10:{
if((x==0)&(V[0]>V[1])&(V[0]>4))
V[x]-=5;
if((x==1)&(V[1]>4))
V[x]-=5;
}break;
}
}
if(k==6)
{
write_eeprom(0,V[0]);
delay_ms(50);
write_eeprom(1,V[1]);
return 1;
}
}
}
bit menu_2() //显示电压
{
u16 i;
u8 k;
while(1)
{
dis_num(0,10);
dis_num(1,1);
dis_num(2,10);
i=ad();
i=(u16)((float)i*19.6+0.5);
dis_num(4,i/1000);
dis_num(5,i%1000/100);
dis_num(6,i%100/10);
dis_num(7,i%10);
k=scan_key();
if(k==4)
{
change_V();
}
switch(k)
{
case 7:{mode=0;return 1;}break;
case 5:{mode=2;return 1;}break;
case 9:{mode=3;return 1;}break;
}
}
}
u16 timer=0;
u16 zhouqi=0;
u16 c_flag=0;
u8 over_flag=0;
bit menu_3() //频率周期显示
{
u8 k,ft=0;
u16 f,t;
EA=1;
TR0=1;
TR1=1;
while(1)
{
dis_num(0,10);
dis_num(1,2);
dis_num(2,10);
if(over_flag)
{
ET0=1;
TR0=1;
TR1=1;
over_flag=0;
f=c_flag*10;
c_flag=0;
}
k= scan_key();
if(k==4)
ft=!ft;
switch(k)
{
case 7:{mode=0;return 1;}break;
case 6:{mode=1;return 1;}break;
case 9:{mode=3;return 1;}break;
}
if(ft) //f
{
dis_num(3,f/10000);
dis_num(4,f%10000/1000);
dis_num(5,f%10000%1000/100);
dis_num(6,f%100/10);
dis_num(7,f%10);
}
else
{
t=1000000/f;
dis_num(3,t/10000);
dis_num(4,t%10000/1000);
dis_num(5,t%10000%1000/100);
dis_num(6,t%100/10);
dis_num(7,t%10);
}
}
}
bit menu_4() //查询
{
u8 k;
while(1)
{
dis_num(6,0);
dis_num(7,read_eeprom(2));
k= scan_key();
if(k==4)
{
k=0;
while(1)
{
dis_num(0,read_eeprom(3)/10);
dis_num(1,read_eeprom(3)%10);
dis_num(2,10);
dis_num(3,read_eeprom(4)/10);
dis_num(4,read_eeprom(4)%10);
dis_num(5,10);
dis_num(6,read_eeprom(5)/10);
dis_num(7,read_eeprom(5)%10);
k=scan_key();
if((k==7)|(k==6)|(k==5)|(k==4))
break;
}
}
switch(k)
{
case 7:{mode=0;return 1;}break;
case 6:{mode=1;return 1;}break;
case 5:{mode=2;return 1;}break;
}
}
}
void main()
{
u16 i,j;
P0=0X00;
P2=0XA0;
P2=0X00;
P0=0XFF;
P2=0X80;
P2=0X00;
V[0]=read_eeprom(0);
delay_ms(10);
V[1]=read_eeprom(1);
DS1302_Init();
Time0_Init();
Timer1Init();
Timer2Init();
EA=1;
while(1)
{
switch(mode)
{
case 0:menu_1();break; //shijian
case 1:menu_2();break; //dianya
case 2:menu_3();break; //zhouqi
case 3:menu_4();break; //chaxun
}
}
}
//中断服务程序
void t0int() interrupt 1 //中断入口
{
c_flag++;
}
bit t1_c=0;
void t1int() interrupt 3
{
if(t1_c==0)
t1_c=1;
else
{
t1_c=0;
ET0=0;
TR0=0;
TR1=0;
over_flag=1;
}
}
u8 t2_flag=0;
void timer2_int (void) interrupt 12 //50ms *100 5s
{
u16 i;
t2_flag++;
if(t2_flag>=100)
{
t2_flag=0;
i=ad();
i=(u16)((float)i*19.6+0.5);
if(i>V[0]*100)
{
write_eeprom(2,1);
delay_ms(8);
i=Read_Ds1302(0x85);
i=((i&0xf0)>>4)*10+i&0x0f;
write_eeprom(3,i);
delay_ms(8);
i=Read_Ds1302(0x83);
i=((i&0xf0)>>4)*10+i&0x0f;
write_eeprom(4,i);
delay_ms(8);
i=Read_Ds1302(0x81);
i=((i&0xf0)>>4)*10+i&0x0f;
write_eeprom(5,i);
}
if(i
{
write_eeprom(2,0);
delay_ms(8);
i=Read_Ds1302(0x85);
i=((i&0xf0)>>4)*10+(i&0x0f);
write_eeprom(3,i);
delay_ms(8);
i=Read_Ds1302(0x83);
i=((i&0xf0)>>4)*10+(i&0x0f);
write_eeprom(4,i);
delay_ms(8);
i=Read_Ds1302(0x81);
i=((i&0xf0)>>4)*10+(i&0x0f);
write_eeprom(5,i);
}
}
}