初级会员
- 积分
- 117
- 金钱
- 117
- 注册时间
- 2019-5-23
- 在线时间
- 26 小时
|
#include "STC_NEW_8051.H"
#include <intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
#define DUTY_VAL 0x47 //
#define TIMEROVERFLOWVAL 5
sbit PWM_PIN=P1^3;
sbit GYKZ=P0^6;
sbit SND = P3^3; //外部输入使能端,1表示启动工作,0表示不工作
void PCA_ClkSourceInit();
void PCA_Init();
//定时器中断的初始化配置
void Timer_Init()
{
TMOD&=0x0f; //
TMOD|=0x10; //
TH1=(65536-2000)/256;
TL1=(65536-2000)%256;//赋初值2ms
TF1=0;
TR1=1;
ET1=1;
EA=1;
}
//定时中断服务程序
void Timer_ISR() interrupt 3
{
//static uint cnt=0;
static uint tr200ms=0;
static uint tr2500ms=0;
TH1=(65536-2000)/256;
TL1=(65536-2000)%256;//赋初值2ms
tr200ms++;
if(tr200ms==100)//0.2S
{
tr200ms=0;
flag_200ms=1;
tr2500ms++;
{
if(tr2500ms==13)//2.6S
{
tr2500ms=0;
flag_2500ms=1;
}
}
}
}
void main()
{
PCA_ClkSourceInit();
PCA_Init();
GYKZ=1;
SND=1;
WDT_CONTR = 0X38; //启动看门狗71ms
while(1)
{
if(SND==1) GYKZ=PWM_PIN;//p1.3PCA输出28%的700多HZ的方波
//else中有问题,不知道问题在哪里像要SND=0的时候0.2S内GYKZ=PWM_PIN;超过0.2S GYKZ=1;到2.5S时 GYKZ=PWM_PIN;依次循环
else//这里有问题,想SND=0的时候0.2S内GYKZ=PWM_PIN;超过0.2S GYKZ=1;到2.5S时 GYKZ=PWM_PIN;依次循环
{
if(flag_200ms==1) //200ms到
{GYKZ=1;flag_200ms=0;}
if(flag_2500ms==1) //2.6s到
{
flag_2500ms=0;
GYKZ=PWM_PIN;
}
}
}
}
void PCA_Init()
{
CMOD=0x04; //设置时钟来源为timer0的溢出率
CCAPM0=0x42; //8位PWM输出
CL=0;
CH=0;
CCAP0L=DUTY_VAL; //占空比设置
CCAP0H=DUTY_VAL; //占空比设置
CR=1; //开始PCA输出
}
//PCA的时钟来源Timer0的溢出率设置
void PCA_ClkSourceInit()
{
TMOD&=0xf0;
TMOD|=0x02; //8位自动重载模式
TL0=0xff+1-TIMEROVERFLOWVAL;
TH0=0xff+1-TIMEROVERFLOWVAL;
TR0=1; //开始定时器0
}
由于单用定时器做700HZ 28%的方波,定时器中断差不多要0.1MS一次,这样会造成整个程序一直在中断中,所以修改成PCA输出,但是想要SND=0时,GYKZ0.2S内发700
HZ28%方波,然后停止2.6S后再发
|
|