微信搜索:ReCclay,也可免费阅读博主蓝桥系列所有文章,后台回复“代码”即可获取蓝桥所有备赛代码!关注博主公众号,还可拥有加入博主粉丝群实时沟通技术难题、免费下载CSDN资源等多项福利,还在等什么呢?快快扫码关注,学习才不会迷路。
这里再向各位同学推荐一个CSDN博主 ReRrain 的蓝桥备赛博客,博主秉持初学者思路,向你讲述自己蓝桥备赛的心路历程,娓娓道来蓝桥备赛经验,个人觉得非常不错,值得细细品读。
导读:《蓝桥杯单片机组》专栏文章是博主2018年参加蓝桥杯的单片机组比赛所做的学习笔记,在当年的比赛中,博主是获得了省赛一等奖,国赛二等奖的成绩。成绩虽谈不上最好,但至少问心无愧。如今2021年回头再看该系列文章,仍然感触颇多。为了能更好地帮助到单片机初学者,今年特地抽出时间对当年的文章逻辑和结构进行重构,以达到初学者快速上手的目的。需要指出的是,由于本人水平有限,如有错误还请读者指出,非常感谢。那么,接下来让我们一起开始愉快的学习吧。
不积跬步无以至千里,不积小流无以成江海。
一、前言
本节将通过一个简单的样例,实现定时器T2的PWM波产生。众所周知,定时器T1通常用来周期性中断操作,比如LED扫描、数码管扫描、按键扫描等等。也就是说T1无法再生成PWM,学会使用定时器T2产生PWM波,对于比赛绝对是百利无一害!
二、实战代码
话不多说,直接上代码!
#include <stc15.h>
typedef unsigned char u8;
void Timer2Init(void);
void CloseFucker();
void main()
{
EA = 1;
CloseFucker();
Timer2Init();
while(1);
}
void CloseFucker()
{
P2 = (P2&0x1F) | 0xA0;
P0 &= 0xAF;
P2 = P2&0x1F;
}
void Timer2Init(void) //10微秒@11.0592MHz
{
AUXR |= 0x04; //定时器时钟1T模式
T2L = 0x91; //设置定时初值
T2H = 0xFF; //设置定时初值
AUXR |= 0x10; //定时器2开始计时
IE2 |= (1<<2); //允许中断
}
void InterruptTimer2() interrupt 12
{
static u8 PWMCnt = 0;
PWMCnt++;
if(PWMCnt >= 250)
{
PWMCnt = 0;
}
if(PWMCnt <= 200)
{
P2 = (P2&0x1F) | 0x80;
P0 = 0xFE;
P2 = P2&0x1F;
}
else
{
P2 = (P2&0x1F) | 0x80;
P0 = 0xFF;
P2 = P2&0x1F;
}
}
尤其注意定时器T2的初始化过程,是直接对8位
寄存器进行操作的,然后还有T2
在15系列
的中断号 12
。
小结:本篇文章主要介绍了单片机比赛中的一个重要操作技巧:使用定时器T2产生PWM波。该部分无论是对蓝桥杯,还是对以后实际项目的攻关,都是大有裨益的!希望读者可以借此机会好好研究一下,争取能够做到举一反三!
希望大家多多支持我的原创文章。如有错误,请大家及时指正,非常感谢。
微信搜索:ReCclay,即可免费阅读博主蓝桥系列所有文章,后台回复“代码”即可获取蓝桥所有备赛代码!关注博主公众号,还可拥有加入博主粉丝群实时沟通技术难题、免费下载CSDN资源等多项福利,还在等什么呢?快快扫码关注,学习才不会迷路。