功能描述:十、分可調 整點報時 定時小鬧鐘
1.共有4個按鍵 3個指示燈 ,其中D1亮表示正常運行狀態(tài) 滅表示鬧鐘設置狀態(tài),D2表示按鍵有效提示(即按下任意一個按鍵 D2 都會亮一次)另外一個事供電指示燈,沒有什么大作用。
2.十、分、鬧鐘開關、鬧鐘設置 分別接在P1.0、P1.1、P3.2、P3.3口。
按下INT1是進入鬧鐘設置模式,顯示屏左數(shù)第二位顯示“8”,調整P1.0 P1.1設置鬧鐘時間,再按下INT1確認,同時推出鬧鐘設置模式進入運行狀態(tài)。
INT0是鬧鐘開關,開啟時最左顯示“C"否則不顯示。
正常運行下,直接按 P1.0、P1.1對時間進行校正。
當然,按鍵都會有閃燈,和不同聲音提示。
 
51單片機程序源代碼:
- #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個連續(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; //整點報時標志
- 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;
- }
復制代碼
|