利用C51单片机设计定时器

2025-01-02 10:54:09
推荐回答(2个)
回答1:

/*===99倒数秒表,带按键,主要功能,按键1按一次能使个位数加一,当按键二按
第一次,按键一能对十位进行调整,不用一个个建按到99,按键二按第二次会闪烁提示
倒数准备开始,然后按键二再按一次就能开启倒数*/
#include
#define uchar unsigned char
#define uint unsigned int

uchar code table[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09};

char num;
uchar flag,a,b;
sbit keytime=P3^2; //按键1,用于调数字
sbit keyselect=P3^3;//按键2,用于选择个位,十位,秒表倒数开启和停止

void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

void Key_Control() //按键控制 分别对按键一 二进行控制
{

if(flag==0)
{
if(keytime==0)
{
delay(5);
if(keytime==0)
{
delay(5);
a=20000; //制造闪烁功能
b=0;
num++;
if(num==10) num=0;
while(keytime==0);
{
delay(5);
while(keytime==0);
}
}
}
}
if(flag==1)
{
if(keytime==0)
{
delay(5);
if(keytime==0)
{
delay(5); //制造闪烁功能

a=0;
b=20000;
num=num+10;
if(num/10==10) num=num-100; //能直接调整十位
while(keytime==0);
{
delay(5);
while(keytime==0);
}
}
}
}

if(flag==2)
{
a=20000; //制造闪烁功能
b=20000;
}

if(flag==3) //第三次按闪烁停止,倒数开始
{
a=0;
b=0;
TR0=1;
}

if(keyselect==0)
{
delay(5);
if(keyselect==0)
{
delay(5);
while(keyselect==0);
flag++;
if(flag==4)
{
TR0=0;
flag=0;
}
}
}
}

void Init()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
EA=1;
}

void Display()
{

P0=table[num/10];
P2=0x02;
delay(5+b);

P0=table[num%10];
P2=0x01;
delay(5+a);
}

void main()
{
Init();
while(1)
{
Key_Control();
Display();

}
}

void time0() interrupt 1
{
uchar aa;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
if(aa==20)
{
aa=0;
num--;
}
if(num==-1)
{
flag=0;
num=0;
TR0=0;
}

}

调试了完全能运行,不明白的可以和我联系

回答2:

自行设计 99s,用数码管显示!
#include
#define uchar unsigned char
#define uint unsigned int
uchar num;
uchar i=0,j=0;
uchar code table[]={0x02,0X9F,0x25,0x0D,0x99,0x49,0x40,0x1F,0x00,0x08 };//,0x10,0xc0,0x62,0x84,0x60,0x70 //

void delayms(unsigned int i) // ????
{
unsigned int j;
for(;i>0;i--)
for(j=100;j>0;j--);
}

void fuzhi(uchar x,uchar y)
{

P0=table[x]; //
P2=0x01; //
delayms(5);

P0=table[y]; //
P2=0x02; //
delayms(5);
}

void main()
{
TMOD=0x01; //
TH0=(65536-45872)/256; //
TL0=(65536-45872)%256;
EA=1; //
ET0=1; //
TR0=1;

while(1)
{
fuzhi(i,j);
}

}
void T0_time() interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
num++;
if(num==20)
{
num=0;
i++;
}
if(i==10)
{i=0;
j++;
}
if(j==10)
j=0 ;

}
TH0=(65536-45872)/256; //重装初值
TL0=(65536-45872)%256;
num++; //num每加1次判断一次是否到20次
if(num==20) //如果到了20次,说明1秒时间到
{
num=0;
i++; //num重新置数为0

}
if(i==10)
{i=0; // i超过9 就置为0
j++;
}
if(j==10)j=0 ; //j超过9 就置为0

}