控制/MCU
实现方法:运用PWM输出功能输出一定频率(F)的脉冲,在一定的时间、以一定的频率输出的脉冲个数是确定的。所以根据所要输出的脉冲个数(PlusCount)可以确定输出脉冲的时间(TimePlus)。
TimePlus=PlusCount/F;
定时我们采用T0的工作方式3,即自动重装模式。
EA=1
TMOD=0x02;//自动重装模式
AUXR = 0x80;//T0 为12T模式
TH0=TL0=256;
void Timer0() interrupt 1
{
TimeCount++;
if(TimeCount==InitCount)
{
CR = TR0=0;//停止T00; // PLUS STOP
TimeCount=0;
}
}
因此,中断一次的时间(T)为:256us
脉冲输出方式为:SYSclk/2
因此,F=12M/2/256
所需要中断的次数(InitCount)为,
InitCount=TimeCount/T
=PlusCount/F/T = PlusCount/12M/2/256/256us = PlusCount/6
源代码如下:
#include“stc12cxx.h”
#include “intrins.h”
#define uchar unsigned char
#define uint unsigned int
unsigned long TimeCount=0,InitCount;
void Init()//初始化子程序
{EA=1;
ET0=1;
P1M0 = 0xff;
P1M1 = 0xff; //Set all P1 as Open-Drain mode
TMOD=0x02;//自动重装模式
AUXR = 0x00;//T0 为12T模式
TH0=TL0=256;
}
void PWM_heat(uchar pwm_num)
{
CCON = 0;
CL = 0;
CH = 0;
//CMOD = 0x00; //SYSclk/12
CMOD = 0x02; //SYSclk/2
//CMOD = 0x04; //T0产生
CCAP0H = CCAP0L = pwm_num; //占空比
CCAPM0 = 0x42; //脉宽调节模式
}
void PulsOut(unsigned long PulsCount)
{
InitCount =PulsCount/6;//(PulsCount/23435)*4000;
PWM_heat(0x7f);
TR0=CR = 1; //启动1;//启动T0
}
void main()
{
Init();
PulsOut(234500);
while (1);
{
}
}
void Timer0() interrupt 1
{
TimeCount++;
if(TimeCount==InitCount)
{
CR = TR0=0;//停止T00; // PLUS STOP
TimeCount=0;
}
}
来源;21ic
全部0条评论
快来发表一下你的评论吧 !