一 工程 代码
在单片机训练平台上,利用定时器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;//输出Y4
break;
case 5:
HC138_C = 1;
HC138_B = 0;
HC138_A = 1;//输出Y5
break;
case 4:
HC138_C = 1;
HC138_B = 1;
HC138_A = 0;//输出Y6
break;
case 5:
HC138_C = 1;
HC138_B = 1;
HC138_A = 1;//输出Y7
break;
}
}//锁存器选择
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();
}
}