📄 pwm.c
字号:
/********************************************************************************
**
** 文 件:PWM.C
** 功 能:用于直流电机PWM调速
** I / O :PWM输出CEX0:P0.2
*********************************************************************************/
#include<c8051f020.h>
sbit k1=P0^3;
sbit k2=P0^4;
sbit k4=P1^4;
sbit k5=P1^5;
sbit k6=P1^6;
sbit k7=P1^7;
void clock(void);
void pwms(void);
void xbrs(void);
void tint(void);
void setoff(void);
void delay(long int);
void senddata(unsigned char,unsigned char);
unsigned char f=0,f1;
unsigned char i=1;
unsigned long int c=0,c1,c2,c3,c4,c5;
unsigned int a[10];
unsigned long int s=0;
unsigned int m=0;
unsigned char n;
/*************************************************************************
void int0(void) interrupt 0
{ //外部中断0
` //T0为脉宽测量用
s=TH0*256;
s=s+TL0;
TH0=0x00;
TL0=0x00;
c5=s/10000;
c4=s%10000/1000;
c3=s%1000/100;
c2=s%100/10;
c1=s%10;
senddata(1,c1);
senddata(2,c2);
senddata(3,c3);
senddata(4,c4);
senddata(5,c5);
}
/*******************************16位PWM匹配中断********************************/
void pwmint(void)interrupt 9
{
f++;
if(f>14)
{
m=PCA0CPH0*256;
m=m+PCA0CPL0;
if(f1==0)
{
if(m<65000)
m=m+1000;
else
m=65535;
}
if(f1>0)
{
if(m>20000)
m=m-1000;
else if(m>4000)
m=m-100;
else
m=0;
}
c=m;
n=m/256;
m=m-(n*256);
PCA0CPL0=m;
PCA0CPH0=n;
c=c*1000/65536;
f=0;
}
senddata(1,c%10);
senddata(2,(0x80+c%100/10));
senddata(3,c%1000/100);
CCF0=0;
}
/*********************************定时器1中断**********************************
void t1int(void)interrupt 3
{
i++;
if(i>19)
{
f=1;
i=1;
senddata(1,1);
senddata(2,2);
senddata(3,3);
senddata(4,4);
senddata(5,5);
}
TH1=0x3C;
TL1=0xB0;
}
/********************************* MAIN() *************************************/
main()
{
clock();
tint();
xbrs();
setoff();
pwms();
CR=1;
f1=0;
// TR1=1;
TH0=0x00;
TL0=0x00;
TCON=0x11;
TMOD=0x09;
k1=0;k2=1;
while(1)
{
while(k4);
f1=1;
while(k5);
k1=1;k2=0;
while(k6);
f1=0;
k1=0;k2=0;
}
}
/*********************************CLOCK SET**************************************/
void clock(void) //clock det
{
unsigned char e;
WDTCN=0xde; //CLOSE WDOG
WDTCN=0xad;
OSCXCN=0x67; //ENABLE EXTERNAL CLK
delay(10000);
delay(10000);
e=!OSCXCN&0x80;
while(e);
OSCICN|=0x08;
}
/*********************************PWM SET**************************************/
void pwms(void) //enable ecf ccf0,16pwm
{
PCA0CN=0x00;
PCA0MD=0x00; //SYSTEM CLOCK 1/12
PCA0CPL0=0xb0;
PCA0CPH0=0x3c;
PCA0CPM0=0xCB; //ENABLE CCF0 INT
}
/*********************************XBR SET**************************************/
void xbrs(void) //ENABLE XBR,CEX0,INT0
{
XBR2=0x40;
XBR1=0x00;
XBR0=0x0c;
P0MDOUT=0xFF;
P1MDOUT=0xFF;
}
/**********************************INT T1*************************************/
void tint(void) //ENABLE EA,EX0,TR0,GATE0,T0 METHOD 1
{
EA=1;
/* EX0=1;
PX0=0;
ET1=1;
PT1=1; */
EIE1|=0x08;
EIP1|=0x08; //pwm16 pipei int
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -