标题: 单片机定时器倒计时程序 (C51) [打印本页]

作者: 51黑科技    时间: 2016-2-3 22:55
标题: 单片机定时器倒计时程序 (C51)
3 位共阳管显示的定时器。3个按键K1、K2和K3 。K1为设定键,K2和K3分别是加、减键。K1按下第1次,第1位闪烁,调整(由K2、K3作加、减调整。以下同);按下第2次,第2 位闪烁,调整;按下第3 次,第3 位闪烁,调整;按第4 次开始倒计时。


//E:\DPJ_C\OTHER\1\定时器\定时器.c
//2012 05 16

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
sbit K1=P3^1;
sbit K2=P3^2;
sbit K3=P3^3;
uchar temp,ge,bai,shi,time,time1;
uint num;
bit flag,flag1,flag2;
uchar code tab[]={
         0xC0,/*0*/
           0xF9,/*1*/
           0xA4,/*2*/
           0xB0,/*3*/
           0x99,/*4*/
           0x92,/*5*/
           0x82,/*6*/
           0xF8,/*7*/
           0x80,/*8*/
           0x90,/*9*/
      };
void delay(uint ms)
{
  uchar i;
while(ms--)
for(i=0;i<123;i++);
}
void t0init()
{
  TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void display()
{
dula=1;
P0=tab[ge];
dula=0;
wela=1;
if(temp==1)
{
  P0=0x04;
  if(flag)
  {
   P0=0x00;
  }
}
else
P0=0x04;

wela=0;
delay(2);
P0=0xff;
dula=1;
P0=tab[shi];
dula=0;
wela=1;
if(temp==2)
{
  P0=0x08;
  if(flag)
  {
   P0=0x00;
  }
}
else
P0=0x08;
wela=0;
delay(2);
P0=0xff;
dula=1;
P0=tab[bai];
dula=0;
wela=1;
if(temp==3)
{
  P0=0x10;
  if(flag)
  {
   P0=0x00;
  }
}
else
P0=0x10;
wela=0;
delay(2);
P0=0xff;
}

void keyscan()
{
  while(!K1)            
{   
  
  display( );
  if(K1)
  {
   temp++;
   if(temp==4)
   {
    temp=0;
    time=0;
    time1=0;
    flag2=0;
    flag1=1;//开始倒计时
   }
  }
}
while(!K2)            
{   
  display( );
  if(K2)
  {
   if(temp==1)
   {
    ge++;
    if(ge==10)
    ge=0;
   }
   if(temp==2)
   {
    shi++;
    if(shi==10)
    shi=0;
   }
   if(temp==3)
   {
    bai++;
    if(bai==10)
    bai=0;
   }
  }
}
while(!K3)           
{   
  display( );
  if(K3)
  {
   if(temp==1&&ge>=1)
   ge--;
   if(temp==2&&shi>=1)
   shi--;
   if(temp==3&&bai>=1)
   bai--;
  }
}
}
void main()
{
  t0init();
while(1)
{
  display();
  keyscan();
  if(flag1&&flag2)  //flag1 K1按第4次标志  flag2 1S标志
  {
   flag2=0;
   num=ge+shi*10+bai*100;
   if(num!=0)
   num--;
   if(num==0)
   {
    flag1=0;
    time=0;
   }
   bai=num/100;
   shi=num%100/10;
   ge=num%10;
  }
}
}
void t0int() interrupt 1
{
  TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
time++;
if(time==10)
{
  time=0;
  flag=!flag;
  time1++;
  if(time1==2)
  {
   time1=0;
   flag2=1;
  }
}
}









作者: wzyk    时间: 2017-7-4 16:57
想问问这个程序
作者: axkf    时间: 2019-2-20 15:50
谢谢分享




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1