51单片机 产生PWM

main.c

/*
  定时器生成PWM信号的使用
*/
#include <REGX52.H>
#include "Time0Init.h"
//TL0 = 0x66;   TH0 = 0xFC;   定时器中断为 1ms  所以pwm的 周期为 pwm_total * 1ms  = 10ms
unsigned int Time0_Count = 0; //定时器中断计数
unsigned int pwm_low = 3;   // pwm波 低电平 计数次数(定时器中断次数) 单位
//  高电平计数单位 = pwm_total - pwm_low    pwm_low = 5的时候 就是50% 占空比 
//  pwm_low = 8   pwm波低电平占8  高电平占2   就是20% 占空比 
unsigned int pwm_total = 10;  // pwm 总电平(周期) 计数次数 单位

void main()
{  
	//定时器初始化
	Time0_Init();
	while(1){
		if(Time0_Count == pwm_low){
			P3_2 = 1;   //pwm高电平的时间 
		}
		if(Time0_Count == pwm_total){
			P3_2 = 0;   //pwm低电平的时间
			Time0_Count = 0;
		}
	}
}

void Time0_Routine() interrupt  1
{
	Time0_Count++;
	//设定初值  保证下次计数从这个初值在当前频率下累加到65535的时间为1ms
	TL0 = 0x66;    
	TH0 = 0xFC;
}

Time0Init.c

#include <REGX52.H>
//定时器0初始化函数 1毫秒@11.0592MHz  定时器时钟12T模式
void Time0_Init()
{
	//设定定时器0为16位自动重装方式 (方式1) 1111(前4位设定定时器1工作方式)
	// 0000 (后4位设定定时器0工作方式)此寄存器不可以位寻址
	//下面两条语句不改变定时器1的工作方式 只改变定时器0的工作方式
	TMOD &= 0xF0;//&赋值不会改变高4位的数据  将低四位数据清零
	TMOD |= 0x01;//不改变高4位数据  只改变置1的位
	//中断溢出标志位 0 不触发中断 硬件置1 触发中断
	TF0 = 0;
	//开启定时器0
	TR0 = 1;
	//赋初值 由STC-ISP软件计算获取 定时器模式16位 定时器时钟12T  FC66相当于十进制64614 在当前设定的晶振频率下从64614计数到65535 为1ms
	TL0 = 0x66;     //设定定时初值  中断时间为1ms
	TH0 = 0xFC;     //设定定时初值  中断时间为1ms
	//开启定时器1中断
	ET0 = 1;
	//开启总中断
	EA = 1;
	//设置定时器1的中断优先级为低
	PT0 = 0;
}

Time0Init.h

#ifndef __Time0Init_H__
#define __Time0Init_H__
void Time0_Init();
#endif

猜你喜欢

转载自blog.csdn.net/weixin_42854045/article/details/127812212