前一段时间的文章已经跟各位一起刷了一部分的客观题了
接下来将会跟大家一起从官方提供的原理图和芯片手册出发
练习每个模块的程序编写
因为我学习采用的是模块化编程的思路,函数的定义分散在不同的文件中,所以一般不会放完整代码,只会放对应模块相关的程序并说明其使用方法
学习此部分内容需要有一定的单片机基础,类似软件配置这种不会讲述,不懂的建议先上B站刷一下视频
本人使用的开发板 国信长天CT107D单片机竞赛板(这是今年新版,可能与旧版略有不同,但是程序是通用的)
参考资料:
官网能下载的 赛点资源数据包 里面的资料(比赛时会提供)
以及
《“蓝桥杯”全国软件和信息技术专业人才大赛(电子类)实训指导书》(点这里下载)(比赛时不会提供)
定时器程序设计
理论部分
定时器本质上其实是个计数装置,用于对单片机的机器周期或者外部输入的时钟信号进行计数
当对单片机的机器周期进行计数叫定时器,对外部输入的时钟信号进行计数叫计数器
每计一个机器周期或者外部输入时钟信号,计数+1
当计数计到最大数值时就会进入中断去执行某些任务
查看芯片手册
可以看到我们使用的板子的芯片有三个定时器,还能看到每个定时器的模式
其中
- 16位自动重装载模式
- 最大计数长度 0xFFFF(即16位二进制全部为1,10进制65535)
- 计数溢出后会自动重新装载为初始值
- 中断需手动开启
- 16位不可重装载模式
- 最大计数长度 0xFFFF(即16位二进制全部为1,10进制65535)
- 计数溢出后若没有手动重新设置计数值则停止计数
- 中断需手动开启
- 8位自动重装载模式
- 最大计数长度 0xFF(即8位二进制全部为1,10进制255)
- 计数溢出后会自动重新装载为初始值
- 中断需手动开启
- 不可屏蔽中断的16位自动重装载模式
- 最大计数长度 0xFFFF(即16位二进制全部为1,10进制65535)
- 计数溢出后会自动重新装载为初始值
- 中断需手动开启
一般来说都会使用16位自动重装载模式,因为可以定的时长更长而且不用手动重装载
查询手册还可以知道配置定时器需要的寄存器和作用的详细说明
但是由于在STC的程序下载软件中提供了自动生成的功能,所以这部分可以选择先做到会用
(后面会再出一篇详细讲,这里先讲怎么用)
在STC-ISP中,可以翻到一个定时器计算器
选择对应的时钟频率、定时器时长以及对应的模式,软件会自动生成
一般来说都是选择16位自动重载以及1T时钟(12T太快,定时时长很短,暂时用不上)
程序部分
STC的软件已经帮我们生成好部分了,但是这个只是定时器的初始化函数,我们还需要加上中断来使用
/********************************************************************************
* 函 数 名: Timer0Init
* 函数功能: 定时器0初始化
* 输入参数:无
* 返 回 值:无
* 其 他:定时时长1ms
********************************************************************************/
void Timer0Init(void) //1毫秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式(16位自动重载)
TL0 = 0xCD; //设置定时初始值
TH0 = 0xD4; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
EA = 1; //使能系统中断
}
只需要在初始化函数中加入中断的初始化即可
同时还要搭配上中断回调函数,切记使用正确的中断号
/********************************************************************************
* 函 数 名: Timer0_Routine
* 函数功能: 定时器0中断回调函数(模板)
* 输入参数:无
* 返 回 值:无
* 其 他:无
********************************************************************************/
void Timer0_Routine() interrupt 1
{
static unsigned int timer=0;
timer++;
if(timer>500)
{
P0 = ~P0;
P2 = P2 & 0x1F | 0x80; // P27~P25 清零,再定位 Y4C
P2 &= 0x1F; // P27~P25 清零
timer = 0;
}
}
这里实现的是每隔500ms就翻转一次LED
由于定时器定不了500ms那么长,所以需要借助timer
这个参数来计数
总结
定时器虽然也简单,但是使用得非常多,下一篇文章将会告诉大家怎么用定时器实现数码管的动态扫描
最最最重要的事,多看芯片手册和原理图
欢迎大家提出问题并指正
觉得有帮助的话,那就点赞、收藏、关注一下吧~~
随缘更新~~