|
#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個(gè)連續(xù)的存儲器
uchar data c_min;
uchar data c_hou;
uchar data second;
uchar data minite;
uchar data hour;
uchar data CNTA;
uchar data speaker_num; //蜂鳴次數(shù)
bit beep; //整點(diǎn)報(bào)時(shí)標(biāo)志
bit run; //運(yùn)行標(biāo)志
bit flash; //滅燈標(biāo)志
bit clarm_switch; //鬧鐘開關(guān)標(biāo)志
bit baoshi; //報(bào)時(shí)開關(guān)標(biāo)志
sbit speaker=P1^3;
sbit minitek=P1^1;
sbit hourk=P1^0;
sbit enter=P1^4;
sbit led1=P1^6; // 按鍵標(biāo)識
sbit led2=P1^7; // 運(yùn)行標(biāo)志
uint n,k;
void delay_10us(uchar n) //10微秒級延時(shí)
{ do
{ _nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}while(--n);
}
void delay_ms(uint n) //毫秒級延時(shí)
{ 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; //延時(shí)防抖
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; //延時(shí)防抖
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//定時(shí)器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; //整點(diǎn)到 蜂鳴標(biāo)志 置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 //鬧鐘開關(guān)
{
clarm_switch=!clarm_switch;
if(clarm_switch)dis[7]=12; //開啟顯示 C
else dis[7]=11; //關(guān)閉 不顯示
for(k=0;k<40;k++)
{speaker=!speaker;
led1=!led1;
delay_ms(5);
}
led1=1;
}
int_1() interrupt 2 //鬧鐘時(shí)間設(shè)置/運(yùn)行 轉(zhuǎn)換開關(guān)
{
run=!run;
if(run)led2=0;
else led2=1;
for(k=0;k<90;k++) // 蜂鳴器響
{speaker=!speaker; //指示燈閃爍
led1=!led1;
delay_10us(100);
}
led1=1;
}
|
|