自己想的一个定时器,求建议
时间:10-02
整理:3721RD
点击:
/*最长定时为60分;四位数码管显示,数码管是共阴数码管*/
#include<reg52.h>
sbit fm=P2^3;
sbit du=P2^6;
sbit we=P2^7;
sbit s8=P3^1;
sbit k1=P3^4;
sbit k2=P3^5;
sbit k3=P3^6;
sbit k4=P3^7;
unsigned char k,j,we1,we2,we3,we4,a,b,c,d,miao,miao1,miao2,fen1,fen2,pp;
int fen;
unsigned char code table[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
void delay(unsigned char i)
{
for(i=i;i>0;i--)
for(j=125;j>0;j--);
}
void display(a,b,c,d) //四位数码管显示
{
du=1; //高电平开数码管段的译码器
P0=table[a];
du=0; //低电平关数码管的段译码器把段锁存
P0=0xfe; //1111 1110 选择位1数码管
we=1; //把位译码器打开
we=0; //把位译码器锁存
delay(5);
du=1;
P0=table[b];
du=0;
P0=0xfd;
we=1;
we=0;
delay(5);
du=1;
P0=table[c];
du=0;
P0=0xfb;
we=1;
we=0;
delay(5);
du=1;
P0=table[d];
du=0;
P0=0xf7;
we=1;
we=0;
delay(5);
}
void main()
{
we1=0;
we2=0;
we3=0;
we4=0;
while(1) //设定时间
{
if(k1==0) //如果按下K1
{
while(!k1); //当放开K1时
we1++; //we1加1
if(we1==7)we1=0;
}
if(k2==0)
{
while(!k2);
we2++;
if(we2==10)we2=0;
}
if(k3==0)
{
while(!k3);
we3++;
if(we3==7)we3=0;
}
if(k4==0)
{while(!k4);
we4++;
if(we4==10)we4=0;
}
a=we1;
b=we2;
c=we3;
d=we4;
display(a,b,c,d); //数码管显示设定的时间
if(s8==0) //如果按下S8
{
while(!s8); //当放开S8时
TMOD|=0x01; //定时器0为工作方式1
TH0=(65536-46080)/256; //所用的晶振为11.0592,设定计时50ms
TL0=(65536-46080)%256;
EA=1;
TR0=1;
ET0=1;
miao=we3*10+we4;
fen=we1*10+we2;
if(miao==0&&fen==0)//如果秒和分同时为0,这种情况为不设定时间就开始计时
while(1)
{
du=1; //数码管全亮
P0=0XFF;
du=0;
P0=0X00;
we=1;
we=0;
fm=0; //蜂鸣器持续报警
}
while(1)
{
if(miao==0&&fen==0) //这种情况和上个情况不一样;是设定了初值后倒计时完成
while(1)
{
du=1;
P0=0XFF;
du=0;
P0=0X00;
we=1;
we=0;
fm=0;
}
if(TF0==1) //当50ms时间到
{
TF0=0; //TF0重置0
pp++;
TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
if(pp==20) //当PP加到20次时,所用时间为1S
{
if(fen!=0&&miao==0) //这时如果分不为0,秒为0的话,比如fen为2,秒为0
{
fen--; //分减1,得1
miao=60; //秒被赋值60
}
miao--; //秒减1得59
pp=0; //PP重置0,等待计时器再次到来,PP加到20,进行下次循环秒再次减1,以次 类推
}
}
miao1=miao%10;//秒除以10的余数的值赋给miao1,miao1是秒的个位;比如说48除以10的余数得8
miao2=miao/10;//秒除以10 的商的值赋给miao2,miao2是秒的十位;48除以10的商得4
fen1=fen%10;
fen2=fen/10;
du=1;
P0=table[miao1];
du=0;
P0=0xf7;
we=1;
we=0;
delay(6);
du=1;
P0=table[miao2];
du=0;
P0=0xfb;
we=1;
we=0;
delay(6);
du=1;
P0=table[fen1];
du=0;
P0=0xfd;
we=1;
we=0;
delay(6);
du=1;
P0=table[fen2];
du=0;
P0=0xfe;
we=1;
we=0;
delay(6);
}
}
}
}
#include<reg52.h>
sbit fm=P2^3;
sbit du=P2^6;
sbit we=P2^7;
sbit s8=P3^1;
sbit k1=P3^4;
sbit k2=P3^5;
sbit k3=P3^6;
sbit k4=P3^7;
unsigned char k,j,we1,we2,we3,we4,a,b,c,d,miao,miao1,miao2,fen1,fen2,pp;
int fen;
unsigned char code table[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
void delay(unsigned char i)
{
for(i=i;i>0;i--)
for(j=125;j>0;j--);
}
void display(a,b,c,d) //四位数码管显示
{
du=1; //高电平开数码管段的译码器
P0=table[a];
du=0; //低电平关数码管的段译码器把段锁存
P0=0xfe; //1111 1110 选择位1数码管
we=1; //把位译码器打开
we=0; //把位译码器锁存
delay(5);
du=1;
P0=table[b];
du=0;
P0=0xfd;
we=1;
we=0;
delay(5);
du=1;
P0=table[c];
du=0;
P0=0xfb;
we=1;
we=0;
delay(5);
du=1;
P0=table[d];
du=0;
P0=0xf7;
we=1;
we=0;
delay(5);
}
void main()
{
we1=0;
we2=0;
we3=0;
we4=0;
while(1) //设定时间
{
if(k1==0) //如果按下K1
{
while(!k1); //当放开K1时
we1++; //we1加1
if(we1==7)we1=0;
}
if(k2==0)
{
while(!k2);
we2++;
if(we2==10)we2=0;
}
if(k3==0)
{
while(!k3);
we3++;
if(we3==7)we3=0;
}
if(k4==0)
{while(!k4);
we4++;
if(we4==10)we4=0;
}
a=we1;
b=we2;
c=we3;
d=we4;
display(a,b,c,d); //数码管显示设定的时间
if(s8==0) //如果按下S8
{
while(!s8); //当放开S8时
TMOD|=0x01; //定时器0为工作方式1
TH0=(65536-46080)/256; //所用的晶振为11.0592,设定计时50ms
TL0=(65536-46080)%256;
EA=1;
TR0=1;
ET0=1;
miao=we3*10+we4;
fen=we1*10+we2;
if(miao==0&&fen==0)//如果秒和分同时为0,这种情况为不设定时间就开始计时
while(1)
{
du=1; //数码管全亮
P0=0XFF;
du=0;
P0=0X00;
we=1;
we=0;
fm=0; //蜂鸣器持续报警
}
while(1)
{
if(miao==0&&fen==0) //这种情况和上个情况不一样;是设定了初值后倒计时完成
while(1)
{
du=1;
P0=0XFF;
du=0;
P0=0X00;
we=1;
we=0;
fm=0;
}
if(TF0==1) //当50ms时间到
{
TF0=0; //TF0重置0
pp++;
TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
if(pp==20) //当PP加到20次时,所用时间为1S
{
if(fen!=0&&miao==0) //这时如果分不为0,秒为0的话,比如fen为2,秒为0
{
fen--; //分减1,得1
miao=60; //秒被赋值60
}
miao--; //秒减1得59
pp=0; //PP重置0,等待计时器再次到来,PP加到20,进行下次循环秒再次减1,以次 类推
}
}
miao1=miao%10;//秒除以10的余数的值赋给miao1,miao1是秒的个位;比如说48除以10的余数得8
miao2=miao/10;//秒除以10 的商的值赋给miao2,miao2是秒的十位;48除以10的商得4
fen1=fen%10;
fen2=fen/10;
du=1;
P0=table[miao1];
du=0;
P0=0xf7;
we=1;
we=0;
delay(6);
du=1;
P0=table[miao2];
du=0;
P0=0xfb;
we=1;
we=0;
delay(6);
du=1;
P0=table[fen1];
du=0;
P0=0xfd;
we=1;
we=0;
delay(6);
du=1;
P0=table[fen2];
du=0;
P0=0xfe;
we=1;
we=0;
delay(6);
}
}
}
}
多多少少三天终于调试好了,,太有成就感了