#include #define uchar unsigned char #define uint unsigned int //按键定义// sbit key1=P3^2; sbit key2=P3^3; sbit key3=P3^4; sbit BEEP=P1^0; sbit LED =P1^2; uint counter0; //定时溢出次数 char shi,fen,miao; //定义秒 分 时// uchar temp[8]={0},seg[8]; uchar k1num=0,beep_num,zd_flag,sso_flag; //状态键,鸣笛数,整点标志,闪烁标志 uchar hour_s=0,minute_s=0; //设定闹铃时间 uchar wei[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; //位选共阳数码管 //{0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; uchar duan[17]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xfd,0xff}; //abcdefgh的顺序01234567-,0亮1灭 //{0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0x02,0x3e,0x9c,0x7a,0x9e,0x8e,0x02}; //管脚定义// sbit shcp=P2^4; //595移位寄存器时钟输入 sbit stclk=P1^5; //595存储寄存器时钟输入 sbit sd=P2^5; //串口数据输入 void init() //74HC595AD和定时器初始化// { sso_flag=0; shcp=0; stclk=0; sd=0; TMOD=0X01; TH0=0; TL0=0; ET0=1; EA=1; TR0=1; beep_num=0; LED=0; } void delay(uchar z) //延时// { uchar x,y; for(x=z;x>0;x--) for(y=200;y>0;y--); } void send_date(uchar date) //发送数据// { uchar num; for(num=0;num<8;num++) { sd=date&0x01; shcp=1; shcp=0; date=date>>1; } } void display() //数码管扫描// { static uchar i=0; send_date(seg[i]); send_date(wei[i]); stclk=1; stclk=0; i++; if(i==8)i=0; } //蜂鸣器 设置 void display1() //秒 分 时的数据处理// { if(k1num==3) { if (sso_flag) { temp[0]=miao%10; temp[1]=miao/10; } else { temp[0]=11;temp[1]=11;} } else if(k1num==4||k1num==5) { temp[0]=10; temp[1]=10; } else { temp[0]=miao%10; temp[1]=miao/10; } temp[2]=10; if(k1num==2) { if(sso_flag) { temp[3]=fen%10; temp[4]=fen/10; } else { temp[3]=11; temp[4]=11; } } else if(k1num==5) { if(sso_flag) {temp[3]=minute_s%10;temp[4]=minute_s/10;} else { temp[3]=11; temp[4]=11;} } else if(k1num==4) {temp[3]=minute_s%10;temp[4]=minute_s/10;} //最内层if-else else { temp[3]=fen%10; temp[4]=fen/10; } temp[5]=10; if(k1num==1){ if(sso_flag) { temp[6]=shi%10; temp[7]=shi/10; } else { temp[6]=11; temp[7]=11; } } else if(k1num==4){ if(sso_flag) {temp[6]=hour_s%10;temp[7]=hour_s/10;} else { temp[6]=11; temp[7]=11;} } else if(k1num==5){temp[6]=hour_s%10;temp[7]=hour_s/10;} //最内层if-else else { temp[6]=shi%10; temp[7]=shi/10; } } void keyscan() //按键扫描// { if(key1==0) { delay(10); if(key1==0) { k1num++; //状态键加1// while(!key1); //松手检测// // if(k1num==1) // TR0=0; //关闭定时器// // if(k1num==4) // TR0=1; if(k1num==6) k1num=0; //打开定时器// } } if(k1num!=0) { switch(k1num) { case 1: //模式1——调时 { if(key2==0) { delay(2); //延时去抖 if(key2==0) //加键按下 { if(shi<23) shi++; else shi=0; } while(!key2); //等待按键释放 } if(key3==0) { delay(2); //延时去抖 if(key3==0) //减键按下 { if(shi> 0) shi--; else shi=23; } while(!key3); } } break; case 2: //模式2——调分 { if(key2==0) { delay(2); //延时去抖 if(key2==0) //加键按下 { if(fen<59) fen++; else fen=0; } while(!key2); } if(key3==0) { delay(2); //延时去抖 if(key3==0) //减键按下 { if(fen>0) fen--; else fen=59; } while(!key3); } } break; case 3: //模式3,调秒 { if(key2==0) { delay(2); if(key2==0) //加键按下 { if(miao<59)miao++; else miao=0; } while(!key2); } if(key3==0) { delay(2); //延时去抖 if(key3==0) //减键按下 { if(miao>0) miao--; else miao=59; } while(!key3); } } break; case 4: //模式4——闹钟调时 { if(key2==0) { delay(2); //延时去抖 if(key2==0) //加键按下 { if(hour_s<23) hour_s++; else hour_s=0; } while(!key2); } if(key3==0) { delay(2); //延时去抖 if(key3==0) //减键按下 { if(hour_s>0) hour_s--; else hour_s=23; } while(!key3); } } break; case 5: //模式5——闹钟调分 { if(key2==0) { delay(2); //延时去抖 if(key2==0) //加键按下 { if(minute_s<59) minute_s++; else minute_s=0; } while(!key2); } if(key3==0) { delay(2); //延时去抖 if(key3==0) //减键按下 { if(minute_s>0) minute_s--; else minute_s=59; } while(!key3); } } break; } } } void main() { uchar p; init(); while(1) { display(); display1(); keyscan(); for(p=0;p<8;p++) { seg[p]=duan[temp[p]]; //数码管显示// } } } void timer0() interrupt 1 { counter0++; if(counter0==17) //65536*11.0592/12*17=1.02s { counter0=0; miao++; if(miao==60) { miao=0; fen++; if(fen==60) { fen=0; shi++; if(shi==24) shi=0; } } } /* if(shi%12==0) beep_num=24; //12/24点鸣笛12声 else beep_num=shi%12*2; //其它时间的鸣笛声数 zd_flag=1; //整点标志位 */ if(hour_s==shi&&minute_s==fen) //闹钟时间到 { //闹1min zd_flag=1; } if(counter0%4==0) //每250ms sso_flag=!sso_flag; //闪烁标志位取反 if(zd_flag&&hour_s>0) //有闹时任务 { beep_num--; //鸣笛数减1 if(beep_num) {BEEP=!BEEP; LED=1; }//鸣笛位取反(1次响1次不响) else {BEEP=0; zd_flag=0;} } } 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- banwoyixia.com 版权所有 湘ICP备2023022004号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务