找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8202|回复: 2
打印 上一主题 下一主题
收起左侧

单片机定时器倒计时程序 (C51)

[复制链接]
跳转到指定楼层
楼主
ID:104835 发表于 2016-2-3 22:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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;
  }
}
}








分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:216816 发表于 2017-7-4 16:57 | 只看该作者
想问问这个程序
回复

使用道具 举报

板凳
ID:448822 发表于 2019-2-20 15:50 | 只看该作者
谢谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表