单片机蓝桥杯大赛

关于大赛中对定时器的用法和体会,适用于各类型的单片机 


//定时器计数器

#include <STC15F2K60S2.H>
unsigned char time;
void Delayms(int ms)
{
	for(i=0;i<ms;i++)
		for(j=845;j>0;j--);   
}

void main(void){
	AUXR=0x80;//打开AUXR T0x12(辅助寄存器)
	TMOD=0xF0; //TMOD:1111 0000(T0) 0000 1111(T1)  
	TL=0x25;//初始值高八位(TL TH 延时5ms)
	TH=0x00;//初始值低八位
	TF0=0;
	TR0=1;//开始计数
	
	EA=1;
	ET0=1;
	
	while(1)
	{
		;
	}
}

void time0(void) interrupt 1
{
	time++;
	if(time==200)
	{
		time=0;
		P0=~P0;
	}
	
}

void Key_Scan()
{
	
	
}


//数码管9秒倒计时(定时器)
#include <STC15F2K60S2.H>

unsigned char b[]={0xC0,0xF9,0xA4,0xb0,0x99,0x92,0x82,0xF8,0x80,0x90,0xC0};
unsigned char a[]={0x90,0x80,0xF8,0x82,0x92,0x99,0xb0,0xA4,0xF9,0xC0,0xC0};
unsigned char time;
unsigned char num;

void Timer0Init(void);

void main(void)
{
	P2=0xA0;P0=0x00;P2=0x80;P0=0xFF;
	P2=0xC0;P0=0x04;P2=0xFF;P0=0xFF;
	Timer0Init();
	EA=1;
	ET0=1;
 
	
	
	
	while(1)
	{

	}

}	

void Timer0Init(void)
{
	AUXR |=0x80;//定时器时钟模式//AUXR=AUXR|0x80;0010 1010 |1000 0000=
	TMOD &=0xF0;//设置定时器模式
	TH0=0x28;//设置初始值
	TL0=0x00;//设置初始值
	TF0=0;//清楚TF0标志
	TR0=1;//开始计时
}

void time0(void) interrupt 1
{
	time++;
	if(time==200)//计时一秒
	{
		time=0;
		P0=a[num];
		num++;
		
	}
	else if(num==11)
		{
		P0=a[10];	
		EA=0;
		P2=0xA0;P0=0x00;P2=0x80;P0=0xFF;
		P0=~0x01;		
		}
	}
	

//外部中断正,倒计时

#include <STC15F2K60S2.H>

unsigned char b[]={0xC0,0xF9,0xA4,0xb0,0x99,0x92,0x82,0xF8,0x80,0x90};
unsigned char a[]={0x90,0x80,0xF8,0x82,0x92,0x99,0xb0,0xA4,0xF9,0xC0};
unsigned char time;
unsigned char num;
unsigned char mode;
bit s4,s5,s6,s7;

void Delayms(int ms);
void Keyscan(void);
void Timer0Init(void);

void main(void)
{
	P2=0xA0;P0=0x00;P2=0x80;P0=0xFF;
	P2=0xC0;P0=0x04;P2=0xFF;P0=0xFF;
	Timer0Init();
	EA=1;
	ET0=1;
	
	
	while(1)
	{
	Keyscan();
	if(s7==1)
	{	
		
		mode=1;
		s7=0;
	}
	else if(s6==1)
	{

		mode=2;
		s6=0;
	}
	}

}	

void Timer0Init(void)
{
	AUXR |=0x80;//定时器时钟模式//AUXR=AUXR|0x80;0010 1010 |1000 0000=
	TMOD &=0xF0;//设置定时器模式
	TH0=0x28;//设置初始值
	TL0=0x00;//设置初始值
	TF0=0;//清楚TF0标志
	TR0=1;//开始计时
}

void time0(void) interrupt 1
{
	if(mode==1){
		TH0=0x28;//设置初始值
		TL0=0x00;//设置初始值
		time++;
	if(time==200)//计时一秒
	{
		time=0;
		P0=b[num];
		num++;
		if(num==10)
		{
		num=0;
		}
	}
	}
	
	if(mode==2){
		TH0=0x28;//设置初始值
		TL0=0x00;//设置初始值
		time++;
	if(time==200)//计时一秒
	{	
		time=0;
		P0=a[num];
		num++;	
		
	if(num==10)
		{
		num=0;
		}
	}
	}
	
}
	
	
void Keyscan(void)//独立按键
{
	if(P30==0)
	{
	Delayms(5);
		if(P30==0)
		{
			s7=1;
		}
		while(!P30);//松手检测
	}
	else if(P31==0)
	{
		Delayms(5);
		if(P31==0)
		{
			s6=1;
		}
		while(!P31);//松手检测
	}
	else if(P32==0)
	{
	Delayms(5);
		if(P32==0)
		{
			s5=0;
		}
		while(!P32);//松手检测
	}
	else if(P33==0)
	{
		Delayms(5);
		if(P33==0)
		{
			s4=0;
		}
		while(!P33);//松手检测
	}
}	

void Delayms(int ms)
{
	int i,j;
	for(i=0;i<ms;i++)
		for(j=845;j>0;j--);   
}


#include <STC15F2K60S2.H>

unsigned char b[]={0xC0,0xF9,0xA4,0xb0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xc7};
unsigned char time;
unsigned char num;
unsigned char mode;
bit s4,s5,s6,s7;

void Delayms(int ms);
void Keyscan(void);
void Timer0Init(void);

void main(void)
{
	P2=0xA0;P0=0x00;P2=0x80;P0=0xFF;
	P2=0xC0;P0=0x04;P2=0xFF;P0=0xFF;
	Timer0Init();
	EA=1;
	ET0=1;
	
	
	while(1)
	{
	Keyscan();
	if(s7==1)
	{
		mode=1;
		s7=0;
	}
	if(s6==1)
	{
		mode=2;
		s6=0;
	}
	if(s5==1)
	{
		mode=3;
		s5=0;
	}
	}
	
}


void Timer0Init(void)
{
	AUXR |=0x80;//定时器时钟模式//AUXR=AUXR|0x80;0010 1010 |1000 0000=
	TMOD &=0xF0;//设置定时器模式
	TH0=0x28;//设置初始值
	TL0=0x00;//设置初始值
	TF0=0;//清楚TF0标志
	TR0=1;//开始计时
}

void time0(void) interrupt 1
{
	if(mode==1){
	TH0=0x28;//设置初始值
	TL0=0x00;//设置初始值
		time++;
	if(time==50)//计时500ms秒
	{
		time=0;
		P0=b[num];
		num++;
		if(num==17)
		{
		num=0;
		}
		}
	}
	
	else if(mode==2){
		TH0=0x28;//设置初始值
		TL0=0x00;//设置初始值
		time++;
	if(time==100)//计时一秒
	{
		time=0;
		P0=b[num];
		num++;
		if(num==17)
		{
		num=0;
		}
	}
	}
	else if(mode==3){
		TH0=0x28;//设置初始值
		TL0=0x00;//设置初始值
		time++;
		if(time==100){	
		P0=b[num];
		num++;   
		if(num==17)
		{
		num=0;
		}
		}
	}
}


void Keyscan(void)//独立按键
{
	if(P30==0)
	{
		Delayms(5);
		if(P30==0)
		{
			s7=1;
		}
		while(!P30);//松手检测
	}
	else if(P31==0)
	{
		Delayms(5);
		if(P31==0)
		{
			s6=1;
		}
		while(!P31);//松手检测
	}
	else if(P32==0)
	{
		Delayms(5);
		if(P32==0)
		{
			s5=1;
		}
		while(!P32);//松手检测
	}
	else if(P33==0)
	{
		Delayms(5);
		if(P33==0)
		{
			s4=1;
		}
		while(!P33);//松手检测
	}
}	

void Delayms(int ms)
{
	int i,j;
	for(i=0;i<ms;i++)
		for(j=845;j>0;j--);   
}



//9999定时器倒计时
#include <STC15F2K60S2.H>
#define uchar unsigned char;
uchar code a[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar num=9999;
uchar time;
void Delayms(int ms);
void Time0Init(void);
void main(void)
{
	P2=0xA0;P0=0x00;P2=0x80;P0=0xFF;
	P2=0xC0;P0=0x03;P2=0xFF;P0=0xFF;
	Time0Init();
	EA=1;
	ET0=1;
	

	
 while(1)
 {

	}
}

void Time0Init(void)
{		
	AUXR |=0x80;//定时器时钟模式//AUXR=AUXR|0x80;0010 1010 |1000 0000=
	TMOD &=0xF0;//设置定时器模式
	TH0=0x28;//设置初始值
	TL0=0x00;//设置初始值
	TF0=0;//清楚TF0标志
	TR0=1;//开始计时

}

void time0() interrupt 1
{
	TH0=0x28;
	TL0=0x00;
	time++;
	if(time==200)
	{
		time=0;
		num--;
		if(num==0)
		num=9999;	
	}
	P2=0xC0;//打开数码管位选537锁存器
	P0=0x01;//0001 0000位选1(第一个数码管)
	P2=0xE0;//打开数码管段选537锁存器
	P0=a[num/1000%10];//段选显示
	Delayms(1);
	
	P2=0xC0;//打开数码管位选537锁存器
	P0=0x02;//0100 0000位选1(第二个数码管)
	P2=0xE0;//打开数码管段选537锁存器
	P0=a[num/100%10];//段选显示
	Delayms(1);
	
	P2=0xC0;//打开数码管位选537锁存器
	P0=0x04;//0010 0000位选1(第三个数码管)
	P2=0xE0;//打开数码管段选537锁存器
	P0=a[num/10%10];//段选显示
	Delayms(1);
	
	P2=0xC0;//打开数码管位选537锁存器
	P0=0x08;//0001 0000位选1(第四个数码管)
	P2=0xE0;//打开数码管段选537锁存器
	P0=a[num%10];//段选显示
	Delayms(1);
}
void Delayms(int ms)
{
	int i,j;
	for(i=0;i<ms;i++)
	for(j=845;j>0;j--);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TvT<

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值