21ic 發表於 2019-10-24 15:43:40
實現方法:運用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
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容圖片侵權或者其他問題,請聯繫本站作侵刪。 侵權投訴