#define uchar unsigned char //定义一下方便使用 #define uint unsigned int #define ulong unsigned long #include <reg52.h> //包括一个52标准内核的头文件 uchar code zixing[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uchar code ziwei[]={0x10,0x20,0x40,0x80}; uchar *h,*m; uchar hour=12,min=0,sec=0,h_ding,m_ding,count=0,ms_50,ms_10,miaobiao_sec; sbit dp=P0^7; sbit k1=P3^2; sbit k2=P3^3; sbit k3=P3^4; sbit sound=P2^3; sfr ZIXING=0x80; //p0口输出字形 sfr ZIWEI=0xa0; //P2口输出字位 typedef enum //枚举类型:4种状态// { CLOCK, SET_RING1, SET_RING2, MIAOBIAO_RUN, }STATE; STATE status; typedef struct //定时时间的数据结构// { uchar hour; uchar min; }DINGSHI_TIME; DINGSHI_TIME dingshi_time[2]; #define NO_KEY -1 //定义一下方便使用 #define KEY_1 1 #define KEY_2 2 #define KEY_3 3 bit show_on_flag; //#######定时器T0中断服务程序########// Timer0() interrupt 1 { TH0=0x3c;TL0=0xb4; //50ms ms_50++; if(ms_50==20) {sec++;ms_50=0;} if(sec==60) {sec=0;min++;} if(min==60) {min=0;hour++;} if(hour==24) {hour=0;} } //#######定时器T1中断服务程序########// Timer1() interrupt 3 { TH1=0xd8;TL1=0xf4; //10ms ms_10++; if(ms_10==100) { miaobiao_sec++; ms_10=0; } if(miaobiao_sec==60) miaobiao_sec=0; } //##############数码管显示#####################// show(uchar time_high,uchar time_low) { uchar m; uint n,k; k=time_high*1000/10+time_low; for(m=0;m<4;m++) { ZIXING=zixing[k%10]; if(ms_50<10) dp=0; ZIWEI=~ziwei[m]; for(n=0;n<500;n++); ZIXING=0xff; for(n=0;n<100;n++); k=k/10; } } //显示 on 定时编号// show_on(uchar id) //id:定时编号// { uchar m; uint n; for(m=0;m<2;m++) { ZIXING=zixing[id%10]; dp=0; ZIWEI=~ziwei[m]; for(n=0;n<500;n++); ZIXING=0xff; for(n=0;n<80;n++); id=id/10; } ZIXING=0xc8; //字母n// ZIWEI=~ziwei[2]; for(n=0;n<500;n++); ZIXING=0xff; for(n=0;n<200;n++); ZIXING=0xc0; //字母0// ZIWEI=~ziwei[3]; for(n=0;n<500;n++); ZIXING=0xff; for(n=0;n<200;n++); } /*************启动秒表***************/ void run_miaobiao() { ms_10=0; miaobiao_sec=0; TH1=0xd8; //标准是0xd8e4 TL1=0xf4; // TR1=1; //启动定时器1 } /*************显示秒表***************/ void show_miaobiao() { show(miaobiao_sec,ms_10); } /*********** 检测按键动作函数 *************/ int get_key() { uchar d; if(!k1) { for(d=0;d<50;d++); if(!k1) { while(!k1); return(KEY_1); } } if(!k2) { for(d=0;d<50;d++); if(!k2) { while(!k2); return(KEY_2); } } if(!k3) { for(d=0;d<50;d++); if(!k3) { while(!k3); return(KEY_3); } } else return NO_KEY; } /***************************************** 各状态下按键处理函数 ******************************************/ void key_process_clock() // 处理时钟状态下的按键和显示// { switch(get_key()) { case KEY_1: status=SET_RING1; ;//切换状态 show_on_flag=1; show_on(1); break; case KEY_2: hour++; if(hour==24) hour=0; show(hour,min); break; case KEY_3: min++; if(min==60) min=0; show(hour,min); break; case NO_KEY: //没有按键操作// show(hour,min); break; } } /****************设定时1或2状态下的按键处理及显示*****************/ void key_process_set_dingshi() { switch(get_key()) { case KEY_1: if(status==SET_RING1) { status=SET_RING2; //切换设第二段定时状态 show_on_flag=1; show_on(2); } else if(status==SET_RING2) { status=MIAOBIAO_RUN; //切换到秒表运行状态 run_miaobiao(); show_miaobiao(); } break; case KEY_2: dingshi_time[status-1].hour++; if(dingshi_time[status-1].hour==24) dingshi_time[status-1].hour=0; show(dingshi_time[status-1].hour,dingshi_time[status-1].min); show_on_flag=0; break; case KEY_3: dingshi_time[status-1].min++; if(dingshi_time[status-1].min==60) dingshi_time[status-1].min=0; show(dingshi_time[status-1].hour,dingshi_time[status-1].min); show_on_flag=0; break; case NO_KEY: //没有按键操作// if(show_on_flag) show_on(status); else show(dingshi_time[status-1].hour,dingshi_time[status-1].min); break; } } /********秒表运行状态按键处理及显示*********/ void key_process_miaobiao_run() { switch(get_key()) { case KEY_1: TR1=0; status=CLOCK; //回到时钟显示状态 break; case KEY_2: TR1=!TR1; //定时器1暂停、继续 break; case KEY_3: TR1=0; //秒表复位 miaobiao_sec=0; ms_10=0; break; case NO_KEY: //无按键操作// show_miaobiao(); break; } } //############主程序#######################// void main(void) { sound=1; TH0=0x3c; TL0=0xb4; TMOD=0x11; TR0=1; ET0=1; TR1=0; ET1=1; EA=1; status=CLOCK; dingshi_time[0].hour=0; dingshi_time[0].min=0; dingshi_time[1].hour=0; dingshi_time[1].min=0; while(1) //程序循环 { switch(status) { case CLOCK: key_process_clock(); // 处理时钟状态下的按键和显示// break; case SET_RING1: case SET_RING2: key_process_set_dingshi(); //处理设置定时状态下的按键和显示// break; case MIAOBIAO_RUN: key_process_miaobiao_run(); //处理秒表状态下的按键和显示// break; } if( ((hour==dingshi_time[0].hour) //定时响铃// &&(min==dingshi_time[0].min) &&(sec<5)) || ((hour==dingshi_time[1].hour) //定时响铃// &&(min==dingshi_time[1].min) &&(sec<5)) ) sound=0; else sound=1; } } |