一 工程 代码
在单片机训练平台上,利用定时器T0,数码管模块和2个独立按键(J5的2,3短接),设计一个秒表,具有清零,暂停,启动功能。
显示模式:分-秒-0.05秒(即50ms)
独立按键s4为暂停/启动,独立按键s5清零,按键均为按下有效。
#include "reg52.h"sbit s4 = P3^3;
sbit s5 = p3^2;unsigned char t_m =0;
unsigned char t_s = 0;
unsigned char t_005s = 0;unsigned char code SMG_NoDot[18] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};void InitHC138(unsigned char n)
{switch (n){ case 4:HC138_C = 1;HC138_B = 0;HC138_A = 0;//输出Y4break;case 5:HC138_C = 1;HC138_B = 0;HC138_A = 1;//输出Y5break;case 4:HC138_C = 1;HC138_B = 1;HC138_A = 0;//输出Y6break;case 5:HC138_C = 1;HC138_B = 1;HC138_A = 1;//输出Y7break;}
}//锁存器选择void shumaguan(unsigned char value , unsigned char pos)
{InitHC138(6);P0 = 0x01<<pos;InitHC138(7);P0 = value;
}void delay(unsigned char t)
{while(t--);
}
void DisplayTime()
{shumaguan(SMG_NoDot[005s%10],7);dalay(500);shumaguan(SMG_NoDot[005s/10],6);dalay(500);shumaguan(SMG_NoDot[16],5);dalay(500);shumaguan(SMG_NoDot[t_s%10],4);dalay(500);shumaguan(SMG_NoDot[t_s/10],3);dalay(500);shumaguan(SMG_NoDot[16],2);dalay(500);shumaguan(SMG_NoDot[t_m%10],1);dalay(500);shumaguan(SMG_NoDot[t_m/10,0);dalay(500);
}//===============================================
void InitTimer()
{THOD = 0x01;TH0 = (65535-50000)/256;TL0 = (65535-50000)%256;ET0 = 1;EA = 1;TR0 = 1;
}unsigned char count = 0;
unsigned char count1= 0;
void ServiceTimer() interrupt 1
{TH0 = (65535-50000)/256;TL0 = (65535-50000)%256;t_005s++if(t_005s == 20){t_s++;t_005s = 0;if(t_s == 60){t_m++;t_s = 0;}if(t_m==99){t_m = 0;}}
}//===============================================
void delay(unsigned char t)
{while(t--);
}void scankey()
{if s4 ==0;//秒表启动与暂停{delay(100):if(s4 == 0);{TR0 = ~TR0;}
}
if s4 ==0;{delay(100):if(s5 == 0);//秒表清零{t_005s = 0;t_s = 0;t_m = 0;}
}
}void main()
{InitTimer()while(1){DisplayTime();scankey();}
}