栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

前言
国赛倒计时1天半,冲冲冲。
本次实验测试STC15的定时计数器,,STC15F2K60S2单片机共有三个定时计数器,我们比较常用的只是定时器0和定时器1.所谓计数器,就是计算定时计数器对应引脚的脉冲,对于国信长天的板子,上面搭载有NE555的谐振电路,可以输出频率可调的方波,本此实验通过计数器采集其输出的方波并计算显示其大致频率。

1、计数器
首先配置定时计数器0为计数器模式,用于采集NE555的信号输出。

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/976469.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号