|
爱科技、爱创意、爱折腾、爱极致,我们都是技术控
您需要 登录 才可以下载或查看,没有账号?立即注册
x
//24.000MHz
// 改变num,来改变占空比
//有的电调是1000~2000us,中间值是1500us(可以认为是静止状态)
// (如果有干扰影响,就注释掉演示的部分,再测验)
#include<reg52.h>
sfr AUXR = 0x8e; //辅助寄存器
#define T 8 //定时器中断周期(us),精度直接影响PWM的精度,特别是中间值,需要细调。
unsigned int pp;
#define MAX 20000/T //20000us/定时器1中断时间, 频率周期
#define MaxP 2000/T //电调最大PWM 2000us/定时器1中断时间
#define MinP 1000/T //电调最小PWM 1000us/定时器1中断时间
#define MidP 1500/T //电调中间PWM 1500us/定时器1中断时间
unsigned int num=MidP; //电调变量,默认取中间值
sbit pwm = P3^3; //PWM输出
sbit s2 = P3^2; //增按键
sbit s3 = P3^5; //减按键
//==================================================
//这些是演示使用的
bit dir=0;
unsigned int cnt=0;
void Timer0Init(void){ //1毫秒@11.0592MHz
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xCD; //设置定时初始值
TH0 = 0xD4; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1;
}
void tm0_isr() interrupt 1{
cnt++;
}
//=============================================
void Delay1ms(unsigned int n){ //1ms@24MHz
unsigned char i, j;
while(n--){
i = 24;
j = 84;
do{
while (--j);
} while (--i);
}
}
void Timer1Init(void){ //PWM定时器
AUXR |= 0x40; //定时器时钟1T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0x40; //8 微秒@24.000MHz
TH1 = 0xFF; //设置定时初始值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
ET1 = 1; //开定时器0中断
EA = 1; //开总中断
}
void keyscan(){
if(s2==0){
Delay1ms(1);
while(0==s2);
if(num<MaxP) num+=5;
}
if(s3==0){
Delay1ms(1);
while(0==s2);
if(num>MinP) num-=5;
}
}
void main(){
Delay1ms(100);
Timer1Init(); //PWM定时器
Timer0Init(); //演示定时器
while(1){
// keyscan();
pwm=(pp<num)?1:0;
//演示代码
if(cnt==400){
if(0==dir){
num-=5;
if(num<MinP){
pp=0;
num=MidP;
dir=1;
cnt++;//给机会暂缓
}else{
cnt=0;
}
}else if(1==dir){
num+=5;
if(num>=MaxP){
pp=0;
num=MidP;
dir=0;
cnt++;//给机会暂缓
}else{
cnt=0;
}
}
}else if(cnt>=4500){ //暂缓一下
cnt=0;
}
//演示代码结束
}
}
void Timer1_isr(void) interrupt 3 using 1{
pp++;
if(pp==MAX){
pp=0;
}
}
//代码简单
//仅作测试,懂的TX很容易修改、运行起来。
//STC15F204EA,使用内置的时钟,测试过, 基本稳定
|
打赏
-
查看全部打赏
|