功能描述:十、分可调 整点报时 定时小闹钟
1.共有4个按键 3个指示灯 ,其中D1亮表示正常运行状态 灭表示闹钟设置状态,D2表示按键有效提示(即按下任意一个按键 D2 都会亮一次)另外一个事供电指示灯,没有什么大作用。
2.十、分、闹钟开关、闹钟设置 分别接在P1.0、P1.1、P3.2、P3.3口。
按下INT1是进入闹钟设置模式,显示屏左数第二位显示“8”,调整P1.0 P1.1设置闹钟时间,再按下INT1确认,同时推出闹钟设置模式进入运行状态。
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个连续的存储器
- 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;
- }
复制代码
|