PWM波发生器

PWM波发生器

赶着做了一波本人单片机课程的实验考试题目,配合proteus仿真。因为仿真用了许多芯片,还挺有意思的,所以分享一下。

PWM波发生器

一、  任务

在硬件电路PWM.DSN中实现P1.7输出PWM波。周期T=100ms,初始占空比(T1/T)为50%,按键KEY1每次增加占空比10%(直到90%),KEY2每次减小占空比10%(直到10%)。

二、  设计参考:

① 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占空比后应等待键释放,释放时同样要考虑去除键抖动。

仿真电路



我的设计思路:

输出PWM:利用定时器来控制IO输出的高低电平时间来产生PWM。

按键设计:因为题目给的接口不好用中断,直接在主函数里判断按键的电平就好了。

源代码:

#include "reg51.h"
unsigned char sign_num = 50;  //调节占空比标志位 
char count = 0;               //计时标志位
unsigned char dir = 0;        //高低电平改变标志位
sbit key1 = P1^0;             
sbit key2 = P1^1;
sbit PWM1 = P1^7;

void delay(void)   //20ms
{
    unsigned char a,b;
    for(b=215;b>0;b--)
        for(a=45;a>0;a--);
}

void TIMER_Init()         //定时器初始化,定时器0,工作方式1,每1MS进入一次中断
{
	TMOD = 0x01;
	TH0 = 0xFC;
	TL0 = 0x18;
	TR0 = 1;
	ET0 = 1;
         EA = 1;
}

 void main()
{
	TIMER_Init();
	while(1)
	{
	if(key1 == 0)                        //按键1
	{                                    //延时消抖
		delay();
		while(key1 ==0);
		sign_num+=10;                 //增加初始电平的占空比
	}
		if(key2 == 0)                //按键2
	{
		delay();
		while(key2 ==0);
		sign_num-=10;
	}
 if(dir == 0) PWM1 = 1;                      
 if(dir == 1) PWM1 = 0;
	}
}
 
void PWM() interrupt 1
{
	TH0 = 0xFC;        //重置时间
	TL0 = 0x18;
	count++;
	if(count == sign_num) dir = 1;  
        if(count >100 || count <0)    //PWM的周期 100ms
	{
		dir = 0;
		count = 0;
	}
}

OK写完了。











猜你喜欢

转载自blog.csdn.net/qq_31131773/article/details/80605004