PWM波发生器 下载本文

PWM波发生器

一、 任务

在硬件电路PWM.DSN中实现P1.7输出PWM波。周期T=100ms,初始占空比

(T1/T)为50%,按键KEY1每次增加占空比10%(直到90%),KEY2每次减小占空比10%(直到10%)。

二、 设计参考:

T1 T T2

① PWM产生方法: 思路:

在一个载波周期内,时间小于T1时P1.7输出为1,其余P1.7均为0。因此,通过比较当前时间值与设定值的位置关系来决定P1.7置0或置1,即可生成PWM波形。 算法: 定义变量

1、 占空比设定值(记为Duty,数值为1~9,时间单位为定时时间常数)。 2、 当前时间值(记为设置Counts,数值为0~10,时间单位为定时时间常数) 设置定时时间为固定常数(10ms),在定时中断服务时做以下处理: 1、 重置定时器; 2、 Counts ++; 3、 Counts %= C;(C为固定载波周期,数值为10,时间单位为定时时间常数) 4、 IF Counts < Duty THEN P1.7 = 1 ELSE P1.7 = 0; 5、 继续其他服务。

② 按键应考虑去除键抖动,在改变PWM占空比后应等待键释放,释放时同样要考虑

去除键抖动。

C语言版:#include #define uchar unsigned char uchar Duty; uchar Counts; uchar C=10; sbit P1_7=P1^7; sbit P1_1=P1^1; sbit P1_0=P1^0;

void main() { TMOD = 0x15; EA = 1; ET1 = 1; TH1 = 0xd8; TL1 = 0xf0; TH0= 0; TL0= 0; TR1 = 1; TR0 = 1; Duty = 5; while(1) { } }

void INT_Timer1() interrupt 3 using 1 { TH1 = 0xd8; TL1 = 0xf0; if(P1_0==0) { a: if(P1_0==1) {Duty++; if(Duty==10) Duty = 9; } else goto a; } if(P1_1==0) { b: if(P1_1==1) {Duty--; if(Duty==0) Duty = 1; } else goto b;

}

}

Counts++; Counts%=C; if(Counts < Duty) P1_7 = 1; else P1_7 = 0;