定时炸弹(闹钟)

1. 所需元件:数码管 蜂鸣器 按键(3颗)

2. 考核要点:

数码管动态显示、蜂鸣器、按键响应、定时器、中断

3. 实验描述:

Ø 3颗独立按键分别用于设置分钟(M键)、秒钟(S键)和启动计时(K键),数码管显示当前设置的分钟及秒钟数;

Ø 启动计时器后,数码管动态更新当前计时剩余时间,刷新周期为1秒;

Ø 计时过程中,再次按下K键时,计时暂定,再按下时,继续计时;

Ø 计时器剩余秒数为0时,蜂鸣器响起。

实验完成




#include <reg52.h>
#define uint unsigned int  
#define uchar unsigned char


sbit beep=P1^5;//按键定义
sbit fenk=P3^3;
sbit miaok=P3^2;
sbit start=P3^0;


sbit a0=P2^2;//138译码器控制数码管位选
sbit a1=P2^3;
sbit a2=P2^4;


int fen=0,miao=0,a;//定义全局变量
char flag=0;


uchar sm[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管数组



void delay(uint k)//延时函数220*k毫秒
{
uint i;
for(i=110;i>0;i--)
for(;k>0;k--);
}


void smg(int a,int b)//数码管显示函数
{
uint i;
for(i=0;i<4;i++)
{
switch(i)
{
case 0:a0=0;a1=0;a2=0;P0=sm[a%10];break;//数码管第一位
case 1:a0=1;a1=0;a2=0;P0=sm[a/10%10];break;//第二位
case 2:a0=0;a1=1;a2=0;P0=0x40;break;//第三位
case 3:a0=1;a1=1;a2=0;P0=sm[b];break;//第四位
}
delay(50);//短延时
P0=0x00;//消影
}
}


void anjian()
{
if(fenk==0)
{
while(!fenk);//按键分钟加一分钟
fen++;
}

if(miaok==0)
{
while(!miaok);
miao+=1;
if(miao>=60)//按键秒加一秒
{
fen++;
miao=0;
}
}

if(start==0)
{
while(!start);//开始倒计时
TR0=1;
}
}0


void main()
{
TMOD=0X20;//打开定时器
EA=1;
ET0=1;
TH0=0X9C;
TL0=0X9C;
TR0=0;
while(1)
{
anjian();
smg(miao,fen);
if(flag==1)//通过定时器返回值打开蜂鸣器
{
//beep=1;//有缘蜂鸣器

while(1)    //无缘蜂鸣器
{
beep=~beep;
delay(0);
}
}
}
}


void interruot1() interrupt 1//中断减时间
{
a++;
if(a==10)
{
a=0;

if(miao==0)
{
if(fen==0)
{
TR0=0;
flag=1;//当分钟和秒钟都是0的时候关闭定时器,同时开启flag打开蜂鸣器长鸣
}
else
{
miao=59;
fen--;
}
}
else
miao--;
}

}




#include <reg52.h>
#include <intrins.h > 
sbit Beep=P1^7; 
sbit k1=P3^0;
sbit k2=P3^1;
sbit k3=P3^2;
sbit a138=P2^0;
sbit b138=P2^1;
sbit c138=P2^2;
char fen=0,miao=1,zt=0,i=0;
code unsigned char smgduan[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x00,0XBF,0x80};
unsigned char n=0;      
unsigned char code music_tab[] ={   
0x1F, 0x05, 0x20 , 0x10,   
0x1C, 0x10, 0x20 , 0x20,   
0x26, 0x20, 0x2B , 0x20,   
0x30, 0x20, 0x2B , 0x40, 
0x1C, 0x10, 0x20 , 0x20,  
0x30, 0x20, 0x2B , 0x40,   
};   
   
void Delay (unsigned char m)     
{   
 unsigned i=3*m;   
 while(--i);   
}   
   
void Delayms(unsigned char a)      
{   
  while(--a);                     
}   
void csh()
{
   TMOD=0X11;
   TH0=0XFC;
   TL0=0X18;
   EA=1;
   ET0=1;
   ET1=1;
}
void shu()
{  
     for(i=0;i<5;i++)
{
switch(i)
     {
    case 0:a138=1;b138=1;c138=1;P0=~smgduan[miao%10];break;
case 1:a138=1;b138=1;c138=0;P0=~smgduan[miao/10];break;
case 2:a138=1;b138=0;c138=1;P0=~smgduan[11];break;
case 3:a138=1;b138=0;c138=0;P0=~smgduan[fen%10];break;
case 4:a138=0;b138=1;c138=1;P0=~smgduan[fen/10];break;
}
Delayms(200);
P0=0X00;
}
}
void jx()
{
   if(fen>59)
   {
fen=0;
   }else if(miao>59)
   {
   miao=0;
   }else if(miao<0)
   {
     miao=59;
fen--;
   }else if(fen<0)
   {
     fen=0;
   }else if(0==miao)
   {
      if(0==fen)
 {
   zt=3;
TR0=0;
 }
   }
}
void key()
{
 static unsigned char flag=0;
   if(0==k1)
   {
      Delayms(100);
      if(0==k1)
      {
     if(0==zt)
 {
 flag=1;
 }
      }
   }else if(1==k1)
   {
      if(1==flag)
 {
 fen++;
 flag=0;
 }
   }


   if(0==k2)
   {
       Delayms(100);
      if(0==k2)
      {
     if(0==zt)
 {
 flag=2;
 }
      }
   }else if(1==k2)
   {
      if(2==flag)
 {
 miao++;
 flag=0;
 }
   }


   if(0==k3)
   {
       Delayms(100);
      if(0==k3)
      {
     if(0==zt)
 {
 flag=3;
 }else if(1==zt)
 {
 flag=4;
 }
      }
   }else if(1==k3)
   {
      if(3==flag)
 {
 zt=1;
 TR0=1;
 flag=0;
 }else if(4==flag)
 {
 zt=0;
 TR0=0;
 flag=0;
 }
   }
}
void feng()
{
 unsigned char p,m;    
  unsigned char i=0;      
  TH1=0xd8;TL1=0xef;      
play:   
   while(1)   
    {   
    a: p=music_tab[i];   
       if(p==0x00)       { i=0, Delayms(1000); goto play;}         
       else if(p==0xff)  { i=i+1;Delayms(100),TR1=0; goto a;}    
            else         {m=music_tab[i++], n=music_tab[i++];}    
             TR1=1;                                                
           while(n!=0) Beep=~Beep,Delay(m);                             
       TR1=0;                                                
    }   
  
}
void main()
{
 csh();
 while(1)
 {
 key();
 jx();
 shu();
 if(3==zt)
 {
 feng();
 }
 }
}
void smg() interrupt 1
{   static unsigned int cnt=0;
    TH0=0XFC;
TL0=0X18;
cnt++;
if(cnt>1000)
{
 miao--;
 cnt=0;
}
}


void int0()  interrupt 3     
{  TH1=0xd8;   
   TL1=0xef;   
   n--;   
}  


  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_735754647

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值