⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pwm.c

📁 PWM-C程序实现控制小车速度
💻 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 + -