上位机发送任意PWM,通过单片机控制步进电机的问题

2019-07-15 17:20发布

本帖最后由 发烧友LV 于 2015-5-4 20:11 编辑

问题描述
程序代码如下:
  1. #include <reg52.h>
  2. #include<stdlib.h>

  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. uchar flag, a;
  6. uint Count = 0 ; //中断计数
  7. uint Direction = 0 ; //控制脉冲方向
  8. //uint ENA = 1 ;

  9. sbit PWM = P1^0;
  10. sbit ENA = P1^1;        
  11. //sbit Direction = P1^2;

  12. /**********************初始化********************/
  13. void init(void)  //串口中断初始化
  14. {         
  15. /*(1)串口中断,在串行口工作于方式1和方式3时,由单片机的定时器T1作为波特率发生器。
  16.   (2)定时器T0工作于方式1,即16位定时工作方式,用于产生PWM*/
  17.         TMOD=0x21;
  18.         
  19. /*******************************************************/        
  20.         SM0=0; //串行口工作方式1,功能:10位异步收发,波特率可变
  21.         SM1=1;
  22. /*低8位计数器TL1与高8位计数器TH1装入同一个技术初值,这就是TH1和TL1相同的原因,改变该计数初值就可以在一定范围内改变波特率*/        
  23.         TH1=0xfd; //设置波特率为9600,12MHz实际上波特率为10416.67 bit/s
  24.         TL1=0xfd;
  25.         
  26. /******************定时器T0的定时初值******************/        
  27.     TH0=(65536-1000)/256;  //1ms定时时间
  28.     TL0=(65536-1000)%256;
  29.         
  30. /**************定时/计数器控制寄存器TCON****************/
  31.         TR0 = 1 ;   //定时器T0开始定时
  32.         TR1 = 1 ;   //定时器T1开始定时
  33.         
  34. /****************串行口控制寄存器SCON*****************/
  35.         REN = 1;    //允许串口接收数据
  36. /****************中断允许控制寄存器IE*****************/
  37.     ET0 = 1 ;   //允许定时器T0中断
  38.         ES = 1;     //允许串口中断
  39.         EA = 1;     //中断总控制位  
  40. }

  41. /********************主函数***********************/
  42. void main(void)
  43. {
  44.         init();
  45.         while(1)
  46.         {
  47.                 if(flag == 1) //串口有数据
  48.                 {
  49.                 ES = 0;   //关闭串行中断        
  50.                         flag = 0;
  51.                         ET0 = 1;  //允许定时器T0中断
  52.                         ES=1;     //允许串口中断
  53.                 }
  54.         }
  55. }

  56. /*******************T0定时器*********************/
  57. void Timer0(void) interrupt 1
  58. {
  59.    TH0 = (65536-1000)/256;
  60.    TL0 = (65536-1000)%256;
  61.    PWM = ~PWM;
  62.    Count++;
  63.    if(Count < a) ;
  64.    else {
  65.              Count = 0;  
  66.          ET0 = 0;   
  67.                 }
  68. }

  69. /*******************串口中断*********************/
  70. void ser(void) interrupt 4
  71. {
  72.         a = SBUF; //接受数据
  73.         flag = 1; //标志位
  74.         RI = 0;        //软件清0
  75. }
复制代码


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。