找回密码
 立即注册

QQ登录

只需一步,快速开始

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

定时闹钟

[复制链接]
跳转到指定楼层
楼主
ID:204636 发表于 2017-5-25 10:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg51.h>
#include<intrins.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
uchar code segtbl[]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0xc6};
                     // 0  1    2   3   4    5    6   7   8   9    -        c   
uchar data dis_b; //位段码
uchar data dis_r; //位偏移量
uchar data dis[8];      //定义8个连续的存储器

uchar data c_min;
uchar data c_hou;
uchar data second;
uchar data minite;
uchar data hour;
uchar data CNTA;
uchar data speaker_num;   //蜂鸣次数
bit beep;          //整点报时标志
bit run;         //运行标志
bit flash;         //灭灯标志
bit clarm_switch;     //闹钟开关标志
bit baoshi;     //报时开关标志
sbit  speaker=P1^3;
sbit minitek=P1^1;
sbit hourk=P1^0;
sbit enter=P1^4;
sbit led1=P1^6;      //  按键标识
sbit led2=P1^7;      // 运行标志
uint n,k;

void delay_10us(uchar n)    //10微秒级延时
{ do
  { _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
  }while(--n);
}
void delay_ms(uint n)     //毫秒级延时
{ do delay_10us(131);
  while(--n);
}
clk_to_dis()
{
    dis[0]=minite%10;
dis[1]=minite/10;
     if(flash)dis[2]=10;
        else dis[2]=11;
dis[3]=hour%10;
dis[4]=hour/10;
dis[5]=10;
dis[6]=11;
}
clarm_to_dis()
{
    dis[0]=c_min%10;
dis[1]=c_min/10;
if(flash)dis[2]=10;//亮灯
        else dis[2]=11;    //灭灯
dis[3]=c_hou%10;
dis[4]=c_hou/10;
dis[5]=10;
dis[6]=8;
}
void main()
{
P2=0xff;
P1=0XFF;
P0=0xff;
run=1;
led1=0;
flash=0x00;
dis[2]=10;      //第三位显示“-”
dis_r=0;        //为偏移量初始为“0”
dis_b=0x80; //选通P2.7
second=0x00;
minite=0x00;
hour=0x00;
CNTA=0x00;
TMOD=0x11;
TH0=19500/256;
TL0=19500%256;
TH1=0xfc;
TL1=0x18;
EA=1;    //开中断;
TR0=1;
TR1=1;
ET1=1;
EX0=1;
EX1=1;
ET0=1;

while(1)
  {

   while(run==1)
   {
  while(!minitek)
  {
  for(n=0;n<1000;n++);
  if(!minitek==0)break;    //延时防抖
  minite++;
  second=0x00;
  led1=0;
      for(n=0;n<20;n++)
        {
         speaker=!speaker;
           delay_10us(50);             //蜂鸣器响
         }

  if(minite==60)minite=0x00;
  while(!minitek);  //等待键松开
   led1=1;    //显示灯   
  }

      while(!hourk)
  {
  for(n=0;n<1000;n++);
  if(!hourk==0)break;
  hour++;
  second=0x00;
  led1=0;
   for(n=0;n<30;n++)
   {
   speaker=!speaker;
   delay_10us(30);             //蜂鸣器响
   }

  if(hour==24) hour=0x00;
  while(!hourk);
  led1=1;
  }

  if(clarm_switch)
  {
  if(c_min==minite&&c_hou==hour)

   {speaker_num=60;
   beep=1;
   while(beep&& clarm_switch)
   {
   led1=!led1;
   delay_ms(100);
   }
   led1=1;
   beep=0;
   }
         }

  while(run==0)
  {
     while(!minitek)
{
for(n=0;n<1000;n++);
if(!minitek==0)break;    //延时防抖
c_min++;
led1=0;
for(n=0;n<25;n++)
{
speaker=!speaker;
delay_10us(40);             //蜂鸣器响
}
if(c_min==60)c_min=0x00;
while(!minitek);        //等待键松开
led1=1;
}

  while(!hourk)
{for(n=0;n<1000;n++);
if(!hourk==0)break;
c_hou++;
led1=0;
for(n=0;n<40;n++)
{
speaker=!speaker;
delay_10us(20);             //蜂鸣器响
}
if(c_hou==24) c_hou=0x00;
while(!hourk);
led1=1;
}



}
    }
}

}
timer0() interrupt 1 using 2//定时器0中断号为1号 使用第2组寄存器
{
TH0=19534/256;
TL0=19534%256;
CNTA++;
if(beep)
{
if(speaker_num%2)speaker=!speaker;
if(!speaker_num) beep=0;

}
if(CNTA==20)
{       if(speaker_num)speaker_num--;
flash=!flash;
CNTA=0;
         second++;//秒加
   if(second==60)
   {second=0;
    minite++;
  if(minite==60)
  {
  minite=0;
  hour++;
  if(hour>7){speaker_num=2*hour;    //整点到 蜂鸣标志  置1
     beep=1;}
   if(hour==24)

   {
   hour=0;
   }
  }
    }
}

}
timer1() interrupt 3 using 3
  {

uchar ttt=0;                   //ttt存储段码
if(run==0) clarm_to_dis();
else clk_to_dis();
ttt = segtbl[dis[dis_r]];        //段码赋值

P2= dis_b;                       //位码送P2
P0=ttt;                          //段码送P0

if(++dis_r==8)dis_r=0x00;
dis_b=_cror_(dis_b,1);          //位码右移
TH1=0xfc;
        TL1=0x18;

  }

int_0() interrupt 0    //闹钟开关
{
clarm_switch=!clarm_switch;
if(clarm_switch)dis[7]=12;   //开启显示   C
else dis[7]=11;      //关闭 不显示   
  for(k=0;k<40;k++)
{speaker=!speaker;
led1=!led1;
delay_ms(5);
}
led1=1;
}

int_1() interrupt 2     //闹钟时间设置/运行 转换开关
{
run=!run;
if(run)led2=0;
else led2=1;
for(k=0;k<90;k++)      // 蜂鸣器响
{speaker=!speaker;      //指示灯闪烁
led1=!led1;
delay_10us(100);
}
led1=1;
}

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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