蓝桥杯STC15单片机复习——定时计数器中断

蓝桥杯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的定时器与计数器测试实验。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值