本帖最后由 人人学会单片机 于 2020-12-31 15:10 编辑
很多小白不明白PWM怎么回事。只能说明你们看的教程没讲。我们人人学会单片机教程就讲过。其实很简单的。特分享CPU定时器模拟PWM输出给你们
#include "STC89.H" //头文件包含
#include <intrins.h> //头文件包含
typedef unsigned char u8; //重新定义数据类型名
typedef unsigned short u16; //重新定义数据类型名
typedef unsigned long u32; //重新定义数据类型名
sbit PWM_OUT=P2^1;
u8 idata PWM_Write_Byte[3]=0;
//****************************祁绪电子 2020年5月***
// 定时器0初始化 晶振11059200,12T,输出50Hz的PWM,占空比0~255
// 定时器初值为:256-(11059200÷12÷50Hz÷256) = 184 = 0xB8
void PWM_Init(void)
{
TMOD &= 0xF0; //配置定时器工作模式
TMOD |= 0x02; //配置定时器工作模式 8位自动重装模式
TL0 = 0xB8;; //定时器初值
TH0 = 0xB8; //定时器重装初值
TR0 = 1; //启动定时器0
ET0=1; //允许定时器0申请中断
EA=1; //中断总闸闭合
}
//****************************祁绪电子 2020年5月***
//定时器0的CPU处理函数,位置任意写都行
void PWM_Display_timer0() interrupt 1
{
static u8 pwm_t=0; //局部变量,不丢失数据
if(pwm_t<PWM_Write_Byte[0])
{
PWM_OUT=1;
}
else PWM_OUT=0;
pwm_t++;
}
//***************************祁绪电子 2020年5月***
// PWM 数模变换数据分配
void PWM_Allot()
{
static u8 kkk=0;
static u8 count=0;
count++;
if(count>100)
{
count=0;
kkk++;
PWM_Write_Byte[0]=kkk; //kkk为占空比自动增加
PWM_Write_Byte[1]=10;
PWM_Write_Byte[2]=10;
}
}
void main() //主函数
{
PWM_Init();
while(1) //主函数大循环
{
PWM_Allot();
}
}
|