要求
利用Virtual Terminal,当输入‘B’时,开始计时,当输入‘s’时,停止计时。
Proteus仿真图
代码
1.头文件,定义变量
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit a= P2^6;
sbit b= P2^7;
uchar code Display[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e, 0x79,0x71};
uchar s = 0;
uchar count=0;
uint sec=0;
2.一般延时函数
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=180;j>0;j--);
}
3.定时器T1初始化
void set()
{
TI=0;
ET1=0;
TMOD=0x21;
TH1=0xFD;
TL1=TH1;
TR1=1;
}
4.显示函数
void show()
{
a=0;b=1;
P0=0xdf;
a=1;b=0;
P0=Display[sec%10];
delayms(5);
a=0;b=1;
P0=0xef;
a=1;b=0;
P0=Display[sec/10%6];
delayms(5);
a=0;b=1;
P0=0xf7;
a=1;b=0;
P0=Display[sec/60%10];
delayms(5);
a=0;b=1;
P0=0xfb;
a=1;b=0;
P0=Display[sec/600%6];
delayms(5);
a=0;b=1;
P0=0xfd;
a=1;b=0;
P0=Display[sec/3600%10];
delayms(5);
a=0;b=1;
P0=0xfe;
a=1;b=0;
P0=Display[sec/36000];
delayms(5);
}
5.串口显示函数
void send()
{
unsigned int c,d,e,f,g,h;
h=sec/36000; g=sec/3600%10; f=sec/600%6; e=sec/60%10; d=sec/10%6; c=sec%10;
ES=0;
if(cnt!=sec)
{
if(h!=0)
{
SBUF = h+'0';while(!TI); TI=0;
SBUF = g+'0';while(!TI); TI=0;
SBUF = f+'0';while(!TI); TI=0;
SBUF = e+'0';while(!TI); TI=0;
SBUF = d+'0';while(!TI); TI=0;
SBUF = c+'0';while(!TI); TI=0;
}
if(g!=0)
{
SBUF = g+'0';while(!TI); TI=0;
SBUF = f+'0';while(!TI); TI=0;
SBUF = e+'0';while(!TI); TI=0;
SBUF = d+'0';while(!TI); TI=0;
SBUF = c+'0';while(!TI); TI=0;
}
if(f!=0)
{
SBUF = f+'0';while(!TI); TI=0;
SBUF = e+'0';while(!TI); TI=0;
SBUF = d+'0';while(!TI); TI=0;
SBUF = c+'0';while(!TI); TI=0;
}
else if(e!=0)
{
SBUF = e+'0';while(!TI); TI=0;
SBUF = d+'0';while(!TI); TI=0;
SBUF = c+'0';while(!TI); TI=0;
}
else if(d!=0)
{
SBUF = d+'0';while(!TI); TI=0;
SBUF = c+'0';while(!TI); TI=0;
SBUF = ' '; while(!TI); TI=0;
}
else
{
SBUF = c+'0';while(!TI); TI=0;
}
cnt=sec;
}
ES=1;
}
6.T0中断函数
void int_T0() interrupt 1
{
TH0=0x3c;
TL0=0xb0;
count++;
if(count==20)
{
sec++;
count=0;
}
}
7.串口中断函数
void serial() interrupt 4 using 2
{
uchar rxch=0;
EA=0;
TI=0;
if(RI!=0)
{
RI=0;
rxch=SBUF;
if(rxch=='B')
{
s=1;
}
else if(rxch=='s')
{
s=0;
}
EA=1;
}
}
8.主函数
void main()
{
EA=1;
SCON=0x50;
set();
ES=1;
TMOD=0x21;
TH0=0x3c;
TL0=0xb0;
ET0=1;
TR0=0;
while(1)
{
if(s==1)
{
TR0=1;
show();
TR0=0;
send();
}
else if(s==0)
{
show();
}
}
}