秒表+串口通信

要求

利用Virtual Terminal,当输入‘B’时,开始计时,当输入‘s’时,停止计时。

Proteus仿真图

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();
		}
	}	
}	

结果

结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值