单片机
返回首页

51单片机使用定时器中断模拟PWM控制端口电压

2019-01-26 来源:eefocus

  最近应实验室需求写一篇51单片机产生PWM的文章供参考.


  单片机芯片STC89C52,晶振12MHz,编译环境Keil5.


  分析:若使单片机端口为高电平, 则单片机输出电压为恒值5V. 反之低电平输出电压为0V. 但是我们如果在周期为T的时间内使单片机高电平出现t1秒, 低电平出现t2秒, 那么在周期内, 高电平出现的时间为, 低电平时间为. 由于周期T的时间极短, 那么在连续的时间t内, 相应端口输出电压为.


  实验使用定时器0, 定时器0由两个寄存器进行控制,分别为定时器/计数器工作方式寄存器TMOD,  定时器/计数器控制寄存器TCON.


TMOD是一个八位寄存器,如下:

TMOD寄存器高4位控制定时器1低四位控制定时器0: 


1. GATE位为门控制位, 选择是否让外部中断控制定时器,此位一般置0, 即不让外部中断控制定时器.


2. C/T位为选择定时器/计数器模式选择, 此实验中使用定时器模拟时间周期T,  所以置0选择定时器模式.


3. M1和M0为定时器工作方式选择位, 控制方式如下:


 


一般在周期短,要求定时精度高的情况下选择方式2,但此实验选择方式1的16位计数器.


16位计数器的意思是周期T的长度不超过机器周期的倍,在12MHz晶振的作用下,机器周期为1us,故周期T不超过65536us.


TCON控制寄存器寄存器的高4位用于控制定时/计数器的启动和中断申请, 低4位用于控制外部中断(此处不介绍).


TF1:定时器1溢出中断请求标志位。定时器1计数溢出时由硬件自动置TF1为1。CPU响应中断后TF1由硬件自动清0。定时器1工作时,CPU可随时查询TF1的状态。所以,TF1可用作查询测试的标志。TF1也可以用软件置1或清0,同硬件置1或清0的效果一样。

TR1:定时器1运行控制位。TR1置1时,定时器1开始工作;TR1置0时,定时器1停止工作。TR1由软件置1或清0。所以,用软件可控制定时/计数器的启动与停止。

TF0:定时器0溢出中断请求标志位,其功能与TF1类同。

TR0:定时器0运行控制位,其功能与TR1类同。

 


定时器工作方式: (以工作方式1为模板)


  方式1为16位计数,由定时器的低8位 和 定时器的高8位组成。定时器的低8位溢出时向定时器的高8位进位+1,定时器的高8位溢出时,置位TCON中的TF0标志,然后定时器高8为与低8位请零, 并向CPU发出中断请求.


TL0->TH0->TF0->产生中断(TL0/TH0/TF0清零)


下面介绍个定时器0实现PWM控制LED亮度的代码:


利用定时器0产生周期为100*100us, 低电平持续时间为100*20us的方波. 


方波如下:


因为这里我们是产生周期为10ms(100Hz)的PWM,所以可设置中断的时间基准为100us, 中断100次即为10ms. 并在中断里设置时间变量为n.


 1、当n>20时(0< n


 2、当20


 3、当n=100时,表明周期T已满,n清零;


 下面程序产生20%占空比的pwm:


#include

 

#define T 100     //定义时间进度为100个机器周期,即100us

 

sbit LED=P1^0;

 

unsigned int pwm_num=20;     //PWM中低电平出现的时间t2

 

void main()

{

TMOD = 0x01;            //选择为定时器0 工作方式1

TH0=(65536-T)/256;      //定时器高八位

TL0=(65536-T)%256;      //定时器低八位

TR0=1;                  //开启定时器

ET0=1;                  //开启定时器1的中断使能

EA=1;                   //开启总中断

while (1);              //等待中断发生

}

 

void Timer1() interrupt 1   //中断1(定时器0专用中断通道)

{

static unsigned char n; //静态变量n  可以看成每100us加一次的时间t

TH0=(65536-T)/256;      //重装定时器的值

TL0=(65536-T)%256;

n++;                    //表明周期T已到100*100us

if (n==100)

n=0;

LED = (n<=pwm_num) ? 0 : 1;   //判断时间是否超过t2

}

最终实验现象为:LED灯亮度变低.

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 家用电源无载自动断电装置的设计与制作

  • 短波AM发射器电路设计图

  • 带有短路保护系统的5V直流稳压电源电路图

  • 如何调制IC555振荡器

  • 基于ICL296的大电流开关稳压器电源电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章