关于大赛中对定时器的用法和体会,适用于各类型的单片机
//定时器计数器
#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--);
}