#include <reg52.h>
#include "595.c"
#include "IIC.c"
#define uchar unsigned char
#define uint unsigned int
uchar ge,shi,bai,qian,tab,numtab,text,start,stop,qian_a,bai_a,shi_a,ge_a;
sbit key_A=P1^2;//启动停止按键
sbit key_B=P1^1;//位选按键
sbit key_C=P1^0;//延时数值修改键
sbit com=P3^7;//继电器
sbit led_a=P3^5;//红灯
sbit led_b=P3^4;//绿灯
sbit test=P3^0;//NC
void delay(uchar x)//延时函数
{
uchar y,j;
for(y=x;y>0;y--)
for(j=110;j>0;j--);
}
void led(uchar ta,uchar tb,uchar tc,uchar td)//数码管显示函数
{
sh_in(tabld[0]);
sh_in(table[ta]);
st_read();
sh_in(tabld[1]);
sh_in(table[tb]&0x7f);
st_read();
sh_in(tabld[2]);
sh_in(table[tc]);
st_read();
sh_in(tabld[3]);
sh_in(table[td]);
st_read();
}
void key()//按键功能函数
{
if(key_A==0)
delay(5);
if(key_A==0)
{
com=1; //继电器控制位低电平有效
led_b=1;//红灯
led_a=0;//绿灯
start=~start; //停止or开始
write_add(0x01,qian_a);//把千位数据存入24C02
write_add(0x03,bai_a);
write_add(0x05,shi_a);
write_add(0x07,ge_a);
while(!key_A);
}
if(start==0)//当处于停止的时候才能控制位
{
if(key_B==0)
delay(5);
if(key_B==0)
{
tab++; //数码管位控制1-4位
if(tab>4)
tab=0;
start=0;
while(!key_B)
led(qian,bai,shi,ge);
}
}
if(key_C==0)
delay(5);
if(key_C==0)
{
numtab++;//延时数执传递给各各变量
while(!key_C)
led(qian,bai,shi,ge);
}
}
void init_time()//初始化定时器
{
TMOD=0x01;//定时器工作在16位
TH0=(65535-50000)/256;//给高8位装初值
TL0=(65535-50000)%256;//给地8位装初值 计算延时时间=12M晶振/12分频(机器周期1us)*5000=50ms
EA=1;
ET0=1;
TR0=1;
led_a=0;
led_b=1;
com=1;
stop=1;
}
void shezhi()//延时时间设置数码管显示
{
while(tab==4) //千位
{
numtab=qian;//防止其他设置位的数值传递到千位
key();
if(numtab>9)
numtab=0;//按键数值清零
qian=numtab;//显示千位时间
qian_a=qian;//24c02存储千位
led(qian,bai,shi,ge);//显示千位现在延时的时间
while(text&&tab==4)//数码管间歇闪烁
{
key();//按键扫描
if(numtab>9)//按键数值清零
numtab=0;
qian=numtab;//显示千位时间
qian_a=qian;//24c02存储千位
led(13,bai,shi,ge);//关闭千位数码管
}
}
numtab=0;
while(tab==3) //百位
{
numtab=bai;
key();
if(numtab>9)
{
numtab=0;
qian++;
if(qian>9)
qian=0;
}
bai=numtab;
bai_a=bai;
led(qian,bai,shi,ge);
while(text&&tab==3)
{
key();
if(numtab>9)
{
numtab=0;
qian++;
if(qian>9)
qian=0;
}
bai=numtab;
bai_a=bai;
led(qian,13,shi,ge);
}
}
numtab=0;
while(tab==2) //十位
{
numtab=shi;
key();
if(numtab>5)
{
numtab=0;
bai++;
if(bai==9)
{
bai=0;
qian++;
if(qian>9)
qian=0;
}
}
shi=numtab;
shi_a=shi;
led(qian,bai,shi,ge);
while(text&&tab==2)
{
key();
if(numtab>5)
{
numtab=0;
bai++;
if(bai==9)
{
bai=0;
qian++;
if(qian>9)
qian=0;
}
}
shi=numtab;
shi_a=shi;
if(shi==6)
ge=0;
led(qian,bai,13,ge);
}
}
numtab=0;
while(shi<6&&tab==1) //个位
{
numtab=ge;
key();
if(numtab>9)
{
numtab=0;
shi++;
if(shi>5)
{
shi=0;
bai++;
if(bai>9)
{
bai=0;
qian++;
if(qian>9)
qian=0;
}
}
}
ge=numtab;
ge_a=ge;
led(qian,bai,shi,ge);
while(text&&tab==1)
{
key();
if(numtab>9)
{
numtab=0;
shi++;
if(shi>5)
{
shi=0;
bai++;
if(bai>9)
{
bai=0;
qian++;
if(qian>9)
qian=0;
}
}
}
ge=numtab;
ge_a=ge;
led(qian,bai,shi,13);
}
}
numtab=0;
}
void init_iic()//读取初值
{
qian=read_add(0x01);
bai=read_add(0x03);
shi=read_add(0x05);
ge=read_add(0x07);
qian_a=qian;//防止按两下复位键把24c02里面初值填0因为qian_a初始化默认为0
bai_a=bai;
shi_a=shi;
ge_a=ge;
}
void main()
{
init_time();//初始化定时器
init_24c02();//初始化2402
init_iic();//读取24c02数据
while(1)
{
key();
led(qian,bai,shi,ge);
stop=1;
if(qian==0&&bai==0&&shi==0&&ge==0)//初值为0时不允许工作
{
com=1;
stop=0;
start=0;
led_a=0;
led_b=1;
}
shezhi();
}
}
void ppm_pwm() interrupt 1
{
uchar num;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
num++;
if(num==20)//1秒
{
if(start&&tab==0&&stop)//进入延时倒计时条件退出位选
{
led_b=0;
led_a=1;
com=0;
if(start&&tab==0&&stop)
{
ge--;
if(ge==255)
{
shi--;
ge=9;
if(shi==255)
{
bai--;
shi=5;
if(bai==255)
{
qian--;
bai=9;
}
}
}
}
}
text=~text;
num=0;
}
}