秒表计时功能(模仿)单片机程序
下面这个仿真效果图,大家可按上面的电路来制作
/**//模仿秒表计时功能,独立按键可控制计时数字的“暂停/走动”。(程序没有考虑计时精确度控制)/*P2.2~P2.4与138译码器输入口连接/*P1.0连接独立按键/*P0口输出数据***/#includeAT89X51.H>code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //共阴数码管 0-9 '-' '熄灭‘表unsigned int count,a,b,sec,min,hour; bit c_flag; // 暂停/计时 标志 /*****T1初始化*****/void timer_1(void){TH1=0x0ec;TL1=0x078;TR1=1;}/*****数据计数******/void time_count(viod){if(hour==60){sec=0,min=0,hour=0;}else if(sec!=59) sec++;else if(min!=59) {sec=0,min++;}else {min=0,hour++;}}/******数字调整*******/void get_count(unsigned int x){a=x/10;b=x%10;}/*******按键检测********/void key_tach(void){int i,j;j=P10x01;if(j==0){for(i=0;i=200;i++);j=P10x01;if(j==0) {if(c_flag==1) c_flag=0;else c_flag=1;}}}/*******显示程序********/void display(viod){ int flag;P0=0x00;flag=count%8;switch(flag){case 0:P2=flag*4;get_count(hour);P0=tab[a];break;case 1:P2=flag*4;P0=tab[b];break;case 2:P2=flag*4;P0=tab[10];break;case 3:P2=flag*4;get_count(min);P0=tab[a];break;case 4:P2=flag*4;P0=tab[b];break;case 5:P2=flag*4;P0=tab[10];break;case 6:P2=flag*4;get_count(sec);P0=tab[a];break;case 7:P2=flag*4;P0=tab[b];break;default:return;}}/*******中断服务程序********/void int1() interrupt 3{key_tach();if(c_flag==0){if(count==7) {count=0;time_count();}else count++;}else{if(count==7) {count=0;}else count++;} display();timer_1();}/******主程序*****/void main(){c_flag=0;count=0;sec=0;min=0;hour=0;TMOD=0x10;EA=1;ET1=1;timer_1();while(1);}
评论