|
功能描述:十、分可調(diào) 整點(diǎn)報(bào)時(shí) 定時(shí)小鬧鐘
1.共有4個(gè)按鍵 3個(gè)指示燈 ,其中D1亮表示正常運(yùn)行狀態(tài) 滅表示鬧鐘設(shè)置狀態(tài),D2表示按鍵有效提示(即按下任意一個(gè)按鍵 D2 都會(huì)亮一次)另外一個(gè)事供電指示燈,沒(méi)有什么大作用。
2.十、分、鬧鐘開(kāi)關(guān)、鬧鐘設(shè)置 分別接在P1.0、P1.1、P3.2、P3.3口。
按下INT1是進(jìn)入鬧鐘設(shè)置模式,顯示屏左數(shù)第二位顯示“8”,調(diào)整P1.0 P1.1設(shè)置鬧鐘時(shí)間,再按下INT1確認(rèn),同時(shí)推出鬧鐘設(shè)置模式進(jìn)入運(yùn)行狀態(tài)。
INT0是鬧鐘開(kāi)關(guān),開(kāi)啟時(shí)最左顯示“C"否則不顯示。
正常運(yùn)行下,直接按 P1.0、P1.1對(duì)時(shí)間進(jìn)行校正。
當(dāng)然,按鍵都會(huì)有閃燈,和不同聲音提示。
 
51單片機(jī)程序源代碼:
- #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ù)的存儲(chǔ)器
- 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; //鬧鐘開(kāi)關(guān)標(biāo)志
- bit baoshi; //報(bào)時(shí)開(kāi)關(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)識(shí)
- sbit led2=P1^7; // 運(yùn)行標(biāo)志
- uint n,k;
- void delay_10us(uchar n) //10微秒級(jí)延時(shí)
- { do
- { _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }while(--n);
- }
- void delay_ms(uint n) //毫秒級(jí)延時(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; //開(kāi)中斷;
- 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); //等待鍵松開(kāi)
- 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); //等待鍵松開(kāi)
- 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中斷號(hào)為1號(hào) 使用第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存儲(chǔ)段碼
- 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 //鬧鐘開(kāi)關(guān)
- {
- clarm_switch=!clarm_switch;
- if(clarm_switch)dis[7]=12; //開(kāi)啟顯示 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)換開(kāi)關(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;
- }
復(fù)制代碼
|
|