📄 pwm.c
字号:
#include <c8051f000.h>
#define uchar unsigned char
sbit P10=P1^0; /*PWM脉冲输出*/
sbit P11=P1^1; /*正反转方向控制,Pll=l正转,Pll=O反转*/
sfr CLKSEL = 0x97;
uchar zdzt=0x0C; /*定义转动状态变量zdzt,初始状态为停转0CH */
uchar yzdzt=0x0A;/*定义原转动状态变量yzdzt,初始值为正转0AH*/
uchar zsgw=0x02;/*定义转速高位(非压缩BCD码)变量zsgw,初始值为2 */
uchar zsdw=0x00; /*定义转速低位(非压缩BCD码)变量zsdw,初始值为O */
uchar bs=0; /*定义步数变量bs,初始值为O,每一个PWM周期bs加1*/
uchar zqsbw=0; /*定义总圈数百位(非压缩BCD码)变量zqsbw,初始值为0*/
uchar zqssw=0; /*定义总圈数十位(非压缩BCD码)变量zqssw,初始值为0*/
uchar zqsgw=0; /*定义总圈数个位(非压缩BCD码)变量zqsgw,初始值为0*/
uchar n=20; /*定义转速(二进制数,r/s)变量n,初始值为20r/s */
unsigned int TX1; /*T0在P1.0为高电平时的计数初值*/
unsigned int TX2; /*T0在P1.0为低电平时的计数初值*/
unsigned int zqs=0;/*定义总圈数(二进制数)变量zqs,初始值为0,PWM周期T=10ms时每100个PWM周期即每ls总圈数zqs增加转zs圈 */
uchar zqsgzj=0x00;/*定义总圈数(二进制数)高字节变量zqsgzj,初始值为00H */
uchar zqsdzj=0x00;/*定义总圈数(二进制数)低字节变量zqsdzj,初始值为0OH */
void Delay(int t);
/* 键盘扫描子程序 功能:判断何键按下并显示 */
/* 键盘处理子程序,将转速变量n中的二进制数转换为非压缩BCD码存储至
转速高位(非压缩BCD码)变量zsgw和转速低位(非压缩BCD码)变量zsdw中 */
/* 定时器T0中断子程序,产生PWM脉冲*/
void PWM(void)interrupt 1
{if(P10==1) /*若P1.0为高电平状态*/
{P10=0; /* 使P1.0变为低电平*/
TH0=62133/256;/*重置T0在P1.0为低电平时的计数初值*/
TL0=62133%256;}
else if(P10==0)/*若P1.0为低电平为状态*/
{P10=1; /* 使P1.0为高电平*/
TH0=TX1/256;/*重置T0在P1.0为高电平时的计数初值*/
TL0=TX1%256;
if(zdzt==0x0C)goto LP;/*若为停止状态,圈数不增加*/
bs++; /*每1个周期T,bs加l*/
if(bs==100) /*每100个周期T,即每1s转n圈*/
{bs=0;
zqs=zqs+n;
}/*每ls显示刷新1次,这样不会闪烁*/
}
LP:;
}
/* 消抖延时子程序*/
void Delay(int t)
{int k;
for(k=0;k<t;k++);
}
/* 主程序 */
main()
{
//晶振配置,采用内部
CLKSEL=0x00;
OSCXCN=0x00;
OSCICN=0x96;
TMOD=0x21; /*与PC通信时定时器T1工作为方式2,T0工作为方式 1 */
CKCON=0x08;
PCON=0x00; /*SMOD=0 */
IE=0x92; /*开串行口及哟中断 */
PT0=1; /*定时0为高优先级 */
SP=0x60;/**/
/**/
TH0=0xF0; /*转速n=20r/s时T0在P1.0为高电平时的计数初值*/
TL0=0xD7;
P10=0; /*置电动机转停状态为停 */
P11=1; /*置电动机转向为正转 */
while(1)
{
zdzt=0x0A;
if(zdzt==0x0C)
{TR0=0;
P10=0; /*关电动机*/
goto LP0;}
if(zdzt==yzdzt) /*如果电动机转向与原转向相同*/
P11=P11; /*电动机转向不变*/
else if(zdzt!=yzdzt)/*如果电动机转向与原转向相反*/
{TR0=0; /*关T0*/
if(P10==1)
{P10=0;
Delay(20); /*延时20us再翻转*/
yzdzt=zdzt; /*重置原转动状态*/
P11=!P11; /*电动机转向翻转*/
P10=1;}
else{yzdzt=zdzt; /*重置原转动状态*/
P11=!P11;} /*电动机转向翻转*/
}
TR0=1; /*启动PWM脉冲定时器T0*/
LP0:;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -