蓝桥杯STC15单片机复习——定时计数器中断
前言
国赛倒计时1天半,冲冲冲。
本次实验测试STC15的定时计数器,,STC15F2K60S2单片机共有三个定时计数器,我们比较常用的只是定时器0和定时器1.所谓计数器,就是计算定时计数器对应引脚的脉冲,对于国信长天的板子,上面搭载有NE555的谐振电路,可以输出频率可调的方波,本此实验通过计数器采集其输出的方波并计算显示其大致频率。
1、计数器
首先配置定时计数器0为计数器模式,用于采集NE555的信号输出。
#include <STC15F2K60S2.h>
#define uint unsigned int
#define uchar unsigned char
void ALL_Init();
void delay_ms(uint ms);
void SEG_show(uint num);
void Timer0Init(void);
uchar SEG_num[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
int num = 0;
void main()
{
ALL_Init();
Timer0Init();
while(1)
{
SEG_show(num);
}
}
void Time0_run() interrupt 1
{
num++;
}
void Timer0Init(void)
{
AUXR = 0x80; //定时器时钟1T模式
TMOD = 0x04; //设置定时器模式
TL0 = 0xFF; //设置定时初值
TH0 = 0xFF; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1;
EA = 1;
}
void SEG_show(uint num)
{
P25 = 0;P26 = 1;P27 = 1;P0 = 0x01;
P25 = 1;P26 = 1;P27 = 1;
P0 = SEG_num[num/10000];
delay_ms(10);
P25 = 0;P26 = 1;P27 = 1;P0 = 0x02;
P25 = 1;P26 = 1;P27 = 1;
P0 = SEG_num[num/1000%10];
delay_ms(10);
P25 = 0;P26 = 1;P27 = 1;P0 = 0x04;
P25 = 1;P26 = 1;P27 = 1;
P0 = SEG_num[num/100%10];
delay_ms(10);
P25 = 0;P26 = 1;P27 = 1;P0 = 0x08;
P25 = 1;P26 = 1;P27 = 1;
P0 = SEG_num[num/10%10];
delay_ms(10);
P25 = 0;P26 = 1;P27 = 1;P0 = 0x10;
P25 = 1;P26 = 1;P27 = 1;
P0 = SEG_num[num%10];
delay_ms(10);
P25 = 0;P26 = 1;P27 = 1;P0 = 0x00;
}
void delay_ms(uint ms)
{
int i;
for(;ms>0;ms--)
for(i = 864;i>0;i--);
}
void ALL_Init()
{
P25 = 1;P26 = 0;P27 = 1;
P0 = 0x00;
P25 = 0;P26 = 1;P27 = 1;
P0 = 0x00;
P25 = 0;P26 = 0;P27 = 1;
P0 = 0xff;
}
使用杜邦线将板子上的SIGNAL引脚与P34(定时计数器0的引脚)相连,即可采集信号。
2、定时器
成功采集到信号以后,我们需要计算每秒的脉冲数,这样才能得到频率,将定时器计数器1配置为定时器模式,每隔1s进行一次计算。
int num1;
void main()
{
ALL_Init();
Timer0Init();
Timer1Init();
while(1)
{
SEG_show(num1);
}
}
int x = 0;
void Time1_run() interrupt 3
{
x++;
if(x == 999)
{
x = 0;
num1 = 2*num;
num = 0;
}
}
void Timer1Init(void) //1毫秒@11.0592MHz
{
AUXR |= 0x40; //定时器时钟1T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0xCD; //设置定时初值
TH1 = 0xD4; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
ET1 = 1;
EA = 1;
}
在定时器1的中断服务函数中,将采集到的脉冲数*2并显示出来,即可得到频率,对着15这个计数器采集脉冲究竟是上升沿还是下降沿表示有点懵逼,但是经过实际示波器测试,输出的频率确实为采集到的脉冲数的两倍,得到这个关系即可。
结语
至此,完成了STC15的定时器与计数器测试实验。