蓝桥杯单片机综合练习9(定时器进阶)

模块:数码管 独立按键 定时器0

功能:具有清零、暂停、启动功能。

1.显示格式为 分-秒-0.05秒 例如 08-26-18 代表8分26秒900毫秒

2.独立按键 s4为:暂停/启动

   独立按键s5为:清零

#include "STC15F2K60S2.H" 
#include <intrins.h>
#define uint unsigned int 
#define uchar unsigned char
uint code SMG_duanma[] =  //数码管段选表 0-9 最后一个为 分隔符 ‘-’
{0xc0  ,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
uchar num = 0; // 用来显示 毫秒
uchar mint = 0;	 // 用来显示 秒
uchar sec = 0;	 // 用来显示分
sbit s4 = P3^3;
sbit s5 = P3^2;
void Delay5ms()		//@11.0592MHz
{
	unsigned char i, j;

	i = 54;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
}
void Delay2ms()		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	_nop_();
	i = 22;
	j = 128;
	do
	{
		while (--j);
	} while (--i);
}


void HC138init (uchar n)
{
   switch (n)
   {
   	 case 4:
	   P2 = (P2&0x1f)|0x80;
	 break;
	 case 5:
	   P2 = (P2&0x1f)|0xa0;
	 break;
	 case 6:
	   P2 = (P2&0x1f)|0xc0;
	 break;
	 case 7:
	   P2 = (P2&0x1f)|0xe0;
	 break;
   }
}
void cl_init () // 关闭蜂鸣器 继电器 流水灯
{
	HC138init (5);
	P0 = 0x00;
    HC138init (4);
	P0 = 0xff;
}
void init () // 定时器0 初始化函数
{	 
     TMOD = 0x01;
	 TH0 = (65535 - 46080) / 256;  // 定义初始值 定时50ms  @晶振11.0592MHZ
	 TL0 = (65535 - 46080) % 256; 
	 EA = 1;
	 ET0 = 1;
	 TR0 = 1;
}
void initer ()	interrupt 1 
{
	 TH0 = (65535 - 46080) / 256;
	 TL0 = (65535 - 46080) % 256;
	 num++;
	 if(num == 20)  // 判断是否到达一秒
	 {
	   	 sec++;
		 num = 0;
	    if(sec == 60)	 // 判断是否到达一分
	     {
	     	mint++;
	    	sec = 0;
	     }
		 if(mint == 99)	// 	判断分 是否达到最大值
		 {
		   mint = 0;
		 }
	 }	
}
void displaybit (uchar pos,dat)
{
  HC138init (6);
  P0 = 0x01<<(pos-1);
  HC138init (7);
  P0 = SMG_duanma[dat];
}
void display ()
{
	displaybit(1,(mint/10));
	Delay2ms();
    displaybit(2,(mint%10));
	Delay2ms();
	displaybit(3,10);
	Delay2ms();
	displaybit(4,(sec/10));
	Delay2ms();
    displaybit(5,(sec%10));
	Delay2ms();
	displaybit(6,10);
	Delay2ms();
	displaybit(7,(num/10));
	Delay2ms();
    displaybit(8,(num%10));
	Delay2ms();
}
void scankey ()
{
	 if(s4 == 0)
	 {
	 	Delay5ms();
		if(s4 == 0)
		{
		  TR0 = ~TR0; // 如果 TR0正在工作 按下 定时器将不再工作 反之亦然 
		  while(s4 == 0)
		  {
		  	display ();
		  }
		}
	 }
	 
	 if(s5 == 0)
	 {
	 	Delay5ms();
		if(s5 == 0)
		{
		  num = 0;	 // 当s5 按下时 分秒毫秒 均为零
		  sec = 0;
		  mint = 0;
		   while(s5 == 0)
		  {
		  	display ();
		  }
		}	
	 }
}
void main ()
{
   
  cl_init ();
  init ();
  while(1)
  {
    display ();
	scankey ();
  }  
}

 

©️2020 CSDN 皮肤主题: 深蓝海洋 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值