您现在所在的是:

单片机论坛

回帖:5个,阅读:51 [上一页] [1] [下一页]
2633
czhaii
文章数:442
年度积分:275
历史总积分:2633
注册时间:2016/3/13
发站内信
发表于:2026/4/7 10:48:19
#0楼


#include "../comm/STC8h.h"  //包含此头文件后,不需要再包含"reg51.h"头文件
#include "../comm/usb.h"     //USB调试及复位所需头文件
#include "intrins.h"

/****************************** 用户定义宏 ***********************************/

#define MAIN_Fosc       24000000L   //定义主时钟
#define Timer0_Reload   (65536UL -(MAIN_Fosc / 1000))       //Timer 0 中断频率, 1000次/秒

/*****************************************************************************/

#define PWM1_1      0x00 //P:P1.0  N:P1.1
#define PWM1_2      0x01 //P:P2.0  N:P2.1
#define PWM1_3      0x02 //P:P6.0  N:P6.1

#define PWM2_1      0x00 //P:P1.2/P5.4  N:P1.3
#define PWM2_2      0x04 //P:P2.2  N:P2.3
#define PWM2_3      0x08 //P:P6.2  N:P6.3

#define PWM3_1      0x00 //P:P1.4  N:P1.5
#define PWM3_2      0x10 //P:P2.4  N:P2.5
#define PWM3_3      0x20 //P:P6.4  N:P6.5

#define PWM4_1      0x00 //P:P1.6  N:P1.7
#define PWM4_2      0x40 //P:P2.6  N:P2.7
#define PWM4_3      0x80 //P:P6.6  N:P6.7
#define PWM4_4      0xC0 //P:P3.4  N:P3.3

#define ENO1P       0x01
#define ENO1N       0x02
#define ENO2P       0x04
#define ENO2N       0x08
#define ENO3P       0x10
#define ENO3N       0x20
#define ENO4P       0x40
#define ENO4N       0x80

#define PWM_PERIOD  1023    //设置周期值

/*************  本地变量声明    **************/
bit B_1ms;          //1ms标志

u16 PWM1_Duty;
u16 PWM2_Duty;
u16 PWM3_Duty;
u16 PWM4_Duty;

bit PWM1_Flag;
bit PWM2_Flag;
bit PWM3_Flag;
bit PWM4_Flag;

//USB调试及复位所需定义
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";                      //设置自动复位到ISP区的用户接口命令

//P3.2口按键复位所需变量
bit Key_Flag;
u16 Key_cnt;

void UpdatePwm(void);
void KeyResetScan(void);
//========================================================================
// 函数: void delay_ms(u8 ms)
// 描述: 延时函数。
// 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.
// 返回: none.
// 版本: VER1.0
// 日期: 2022-6-3
// 备注:
//========================================================================
void delay_ms(u8 ms)
{
   u16 i;
   do{
       i = MAIN_Fosc / 10000;
       while(--i);   //10T per loop
   }while(--ms);
}    
/******************** 主函数 **************************/
void main(void)
{
   P_SW2 |= 0x80;     //扩展寄存器(XFR)访问使能

   RSTFLAG |= 0x04;   //设置硬件复位后需要检测P3.2的状态选择运行区域,否则硬件复位后进入USB下载模式

   P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
   P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
   P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
   P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
   P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
   P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
   P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
   P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口

   PWM1_Flag = 0;
   PWM2_Flag = 0;
   PWM3_Flag = 0;
   PWM4_Flag = 0;

   PWM1_Duty = 0;
   PWM2_Duty = 256;
   PWM3_Duty = 512;
   PWM4_Duty = 1024;

   //USB调试及复位所需代码-----
   P3M0 &= ~0x03;
   P3M1 |= 0x03;
   IRC48MCR = 0x80;
   while (!(IRC48MCR & 0x01));
   usb_init();
   //-------------------------

   //  Timer0初始化
   TMOD &= 0xf0;//16 bits timer auto-reload
   AUXR |= 0x80;//Timer0 set as 1T
   TH0 = (u8)(Timer0_Reload / 256);
   TL0 = (u8)(Timer0_Reload % 256);
   ET0 = 1;    //Timer0 interrupt enable
   TR0 = 1;    //Tiner0 run

   PWMA_CCER1 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
   PWMA_CCER2 = 0x00;
   PWMA_CCMR1 = 0x68; //通道模式配置
   PWMA_CCMR2 = 0x68;
   PWMA_CCMR3 = 0x68;
   PWMA_CCMR4 = 0x68;
   PWMA_CCER1 = 0x55; //配置通道输出使能和极性
   PWMA_CCER2 = 0x55;

   PWMA_ARRH = (u8)(PWM_PERIOD >> 8); //设置周期时间
   PWMA_ARRL = (u8)PWM_PERIOD;

   PWMA_ENO = 0x00;
   PWMA_ENO |= ENO1P; //使能输出
   PWMA_ENO |= ENO1N; //使能输出
   PWMA_ENO |= ENO2P; //使能输出
   PWMA_ENO |= ENO2N; //使能输出
   PWMA_ENO |= ENO3P; //使能输出
   PWMA_ENO |= ENO3N; //使能输出
   PWMA_ENO |= ENO4P; //使能输出
   PWMA_ENO |= ENO4N; //使能输出

   PWMA_PS = 0x00;  //高级 PWM 通道输出脚选择位
   PWMA_PS |= PWM1_1; //选择 PWM1_1 通道
//    PWMA_PS |= PWM2_2; //选择 PWM2_2 通道
   PWMA_PS |= PWM3_1; //选择 PWM3_1 通道
//    PWMA_PS |= PWM4_2; //选择 PWM4_2 通道

   PWMA_BKR = 0x80; //使能主输出
   PWMA_CR1 |= 0x81; //ARR预装载,开始计时

   IE2 |= 0x80;   //IE2相关的中断位操作使能后,需要重新设置EUSB
   EA = 1;     //打开总中断
P0=0X00;
    delay_ms(50);
    P0=0XFF;
                delay_ms(50);
    P0=0X00;
    delay_ms(50);
    P0=0XFF;
delay_ms(50);

   while (1)
   {
       if (bUsbOutReady) //USB调试及复位所需代码
       {
//            memcpy(UsbInBuffer, UsbOutBuffer, 64);      //原路返回, 用于测试HID
//            usb_IN();
           
           usb_OUT_done();
       }
   }
}


/********************** Timer0 1ms中断函数 ************************/
void timer0(void) interrupt 1
{
   if(!PWM1_Flag)
   {
       PWM1_Duty++;
       if(PWM1_Duty > PWM_PERIOD) PWM1_Flag = 1;
   }
   else
   {
       PWM1_Duty--;
       if(PWM1_Duty <= 0) PWM1_Flag = 0;
   }

   if(!PWM2_Flag)
   {
       PWM2_Duty++;
       if(PWM2_Duty > PWM_PERIOD) PWM2_Flag = 1;
   }
   else
   {
       PWM2_Duty--;
       if(PWM2_Duty <= 0) PWM2_Flag = 0;
   }

   if(!PWM3_Flag)
   {
       PWM3_Duty++;
       if(PWM3_Duty > PWM_PERIOD) PWM3_Flag = 1;
   }
   else
   {
       PWM3_Duty--;
       if(PWM3_Duty <= 0) PWM3_Flag = 0;
   }

   if(!PWM4_Flag)
   {
       PWM4_Duty++;
       if(PWM4_Duty > PWM_PERIOD) PWM4_Flag = 1;
   }
   else
   {
       PWM4_Duty--;
       if(PWM4_Duty <= 0) PWM4_Flag = 0;
   }
   
   UpdatePwm();
   KeyResetScan();   //P3.2口按键触发软件复位,进入USB下载模式,不需要此功能可删除本行代码
}


//========================================================================
// 函数: UpdatePwm(void)
// 描述: 更新PWM占空比.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2012-11-22
//========================================================================
void UpdatePwm(void)
{
   PWMA_CCR1H = (u8)(PWM1_Duty >> 8); //设置占空比时间
   PWMA_CCR1L = (u8)(PWM1_Duty);
   PWMA_CCR2H = (u8)(PWM2_Duty >> 8); //设置占空比时间
   PWMA_CCR2L = (u8)(PWM2_Duty);
   PWMA_CCR3H = (u8)(PWM3_Duty >> 8); //设置占空比时间
   PWMA_CCR3L = (u8)(PWM3_Duty);
   PWMA_CCR4H = (u8)(PWM4_Duty >> 8); //设置占空比时间
   PWMA_CCR4L = (u8)(PWM4_Duty);
}



//========================================================================
// 函数: void KeyResetScan(void)
// 描述: P3.2口按键长按1秒触发软件复位,进入USB下载模式。
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2022-6-11
// 备注:
//========================================================================
void KeyResetScan(void)
{
   if(!P32)
   {
       if(!Key_Flag)
       {
           Key_cnt++;
           if(Key_cnt >= 1000) //连续1000ms有效按键检测
           {
               Key_Flag = 1; //设置按键状态,防止重复触发

               USBCON = 0x00;      //清除USB设置
               USBCLK = 0x00;
               IRC48MCR = 0x00;
               
               delay_ms(10);
               IAP_CONTR = 0x60;   //触发软件复位,从ISP开始执行
               while (1);
           }
       }
   }
   else
   {
       Key_cnt = 0;
       Key_Flag = 0;
   }
}



1481
玩命南半球
文章数:20
年度积分:113
历史总积分:1481
注册时间:2018/3/21
发站内信
发表于:2026/4/7 13:35:11
#1楼
工控板表情
10906
solidcam
文章数:2380
年度积分:627
历史总积分:10906
注册时间:2015/8/10
发站内信
发表于:2026/4/7 17:40:17
#2楼
直流电机是内阻很小的高速电机吗
2633
czhaii
文章数:442
年度积分:275
历史总积分:2633
注册时间:2016/3/13
发站内信
发表于:2026/4/7 19:00:13
#3楼
两个功率都不大
一个没有减速器的4000转
29011
goldage
文章数:16058
年度积分:529
历史总积分:29011
注册时间:2006/1/10
发站内信
2018论坛热心网友
发表于:2026/4/7 21:18:14
#4楼
黑呼呼,啥都看不到
120
微鑫科技
文章数:1265
年度积分:120
历史总积分:120
注册时间:2019/11/26
发站内信
发表于:2026/4/7 22:32:33
#5楼
做工控类产品,还是用32G系列车规级的吧。

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2026 Gkong.com, All Rights Reserved

62.4004