找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2049|回复: 3
收起左侧

求程序,根据输入的方波,来输出pwm,来控制电机转速,89c51应该是stc12c5芯片

[复制链接]
ID:636039 发表于 2019-11-14 19:28 | 显示全部楼层 |阅读模式
30黑币

3(`VUU)7AY)8CHI7PNSRBS0.png
O(LS_LS8AH5%HOS}GZTWAO3.png
回复

使用道具 举报

ID:636039 发表于 2019-11-14 20:44 | 显示全部楼层
我这个程序能实现这个功能吗???
#include "define.h"
#include "delay.h"
#include "play.h"
#include "motor.h"
#include "mic.h"


/********请先在define.h中调整晶振频率与周期配置**************/


u8 mode = 0; //速度级别
void change_mode()
{
        static u8 i=0,j=0;     //计时变量约为8ms
         if(mic_flag==2)
                {
                         i++;
                        if(i>10&&mic_flag==2)
                        {
        //开机确认
                                if(mode==0)
                                {
                                        Play_music(PCM8sfkj,sizeof(PCM8sfkj));
                                        j=50;
                                        mic_flag=0;
                                        while(j--)
                                        {
                                                delay_ms(100);
                                                if(mic_flag==2)
                                                {
                                                        Play_music(PCM8zstz,sizeof(PCM8zstz));
                                                        mode=1;
                                                        mic_flag=0;
                                                        break;
                                                }               
                                        }
                                }
                                else if(mode==1)       
                                {       
                                        mode=2;
                                }
                                else if(mode==2)       
                                {
                                        Play_music(PCM8zstz,sizeof(PCM8zstz));                                        
                                        mode=1;
                                }       
                                mic_flag=0;
                                i=0;
                        }
                }
                else if(mic_flag==3)
                {
                         i++;
                        if(i>15&&mic_flag==3)
                        {
                          mode=0;
                                mic_flag=0;
                                i=0;
                        }
                }
}
void change_PWM()
{
                if(mode==0)
                {
                        PCA_PWM0 = 0x03;
                        CCAP0H = CCAP0L = 0xff;
                }
                else if(mode==1)
                {
                        PCA_PWM0 = 0x00;
                        CCAP0H = CCAP0L = CCAP0L-1;
                }
                else if(mode==2)
                {
                        PCA_PWM0 = 0x00;
                        CCAP0H = CCAP0L = CCAP0L;
                }

}
void main()
{

  Timer1Init();
        IT0Init();
        PWMInit();
        Play_init();
        delay_ms(1000);
        while(1)
        {
                change_mode();
    change_PWM();
                Digital_Display_One(CCAP0L/16);
                delay_ms(50);
        }
  
}



void delay_ms(uint ms)  
{      
         unsigned char i, j;
        do
        {                    
                i = TIME_I;
                j = TIME_J;
                do
                {
                        while (--j);
                } while (--i);      
        }while(--ms);
}
#if Machine_Cycle==12UL
void delay5us()                //@12.000MHz
{
        _nop_();
}
#elif Machine_Cycle==2UL
void delay5us()                //@12.000MHz
{
        unsigned char i;
        i = 12;
        while (--i);
}

void IT0Init(void)                //100微秒@11.0592MHz
{
        IT0=1;
        EX0=1;
        EA=1;
}
void Timer1Init(void)                //50毫秒@11.0592MHz
{
        AUXR &= 0xBF;                //定时器时钟12T模式
        TMOD &= 0x0F;                //设置定时器模式
        TMOD |= 0x10;                //设置定时器模式
        TL1 = 0x66;                //设置定时初值
        TH1 = 0xFC;                //设置定时初值
        TF1 = 0;                //清除TF1标志
        TR1 = 1;                //定时器1开始计时
        EA = 1;
        ET1 = 1;
}     
u32 times=0;
void T1INT() interrupt 3
{
        TL1 = 0x66;                //设置定时初值
        TH1 = 0xFC;                //设置定时初值
        times++;
}
u8 mic_flag=0;
void EX0INT(void)  interrupt 0
{  
        static u32 last_time=0;
        u32 differ;
        differ=times-last_time;
        last_time=times;
        if(differ>1000)
        {
                mic_flag=1;
        }
        else if(mic_flag>0&&differ>100&&differ<500)
        {
                 mic_flag++;
        }
}

void PWMInit()
{      
        CCON = 0;                       //清除PCA控制寄存器
                                 
        CL = 0;                         //复位PCA定时器计数值
        CH = 0;
        CMOD=0x0a;                                                                                        //工作模式:频率=Sysclk/4/256=10800Hz 无中断
       
        CCAP0H = CCAP0L = 0xff;         //PWM0设置占空比50%
        PCA_PWM0 = 0x03;
        CCAPM0 = 0x42;                  //PCA模块0 工作在8比特方式 无中断
        CR = 1;                         //PCA定时器运行
}
回复

使用道具 举报

ID:617449 发表于 2019-11-15 10:31 | 显示全部楼层
你是想根据方波的什么特征开控制PWM?
回复

使用道具 举报

ID:636039 发表于 2019-11-23 12:21 | 显示全部楼层
来51学习1 发表于 2019-11-15 10:31
你是想根据方波的什么特征开控制PWM?

方波的脉宽啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表