上位机发送任意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. }
复制代码


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
A670521546
1楼-- · 2019-07-15 18:03
什么问题?
发烧友LV
2楼-- · 2019-07-15 18:26
A670521546 发表于 2015-5-4 16:07
什么问题?

管理员,帮我看看我这种问题怎么去解决呢?
发烧友LV
3楼-- · 2019-07-15 23:29
A670521546 发表于 2015-5-4 16:07
什么问题?

管理员,帮我看看我这种问题怎么去解决呢?
发烧友LV
4楼-- · 2019-07-16 00:19
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. //sbit d1=P2^0;

  5. uint count;
  6. uint l;//丝杠位移
  7. uint mz;//脉冲
  8. uint sd;//速度
  9. uint zf;//正反转

  10. uchar Rec[9];
  11. uchar r;
  12. /********************************************************
  13.                        控制位定义
  14. ********************************************************/
  15. //TB6560输入控制端定义
  16. sbit CLK = P2^1; //脉冲控制位
  17. sbit ENA = P1^1; //使能控制位       
  18. sbit DIR = P1^2; //方向控制位


  19. /********************************************************
  20.                          主函数
  21. ********************************************************/
  22. void main()
  23. {
  24.         TMOD=0x21;                 //11.0592M晶振
  25.         TH0=(65536-50000)/256;         //1毫秒中断
  26.         TL0=(65536-50000)%256;
  27.         TH1=0xfd;                         //波特率9600
  28.         TL1=0xfd;                               
  29.         SCON=0x50;                 //串口的工作方式,设置为方式1
  30.         TR1=1;                                 //打开定时器
  31.         ES=1;                                   //打开串口中断
  32.         EA=1;                                   //开启总中断
  33.         ENA=1;         //使能控制位
  34.         DIR=0;         //旋转方向控制位
  35.         CLK=0;         //脉冲控制位
  36.        
  37.        
  38.    
  39.         while(1)
  40.         {
  41.          
  42.          
  43.         }
  44. }
  45. void com_isr(void) interrupt 4
  46. {       
  47.         if(RI)
  48.         {
  49.          RI=0;                                                //将寄存器复位等待接收下一个
  50.          Rec[r]=SBUF;                                        //将接收的数据存于变量中
  51.          r++;
  52.          if(r==7)
  53.          {
  54.                  r=0;
  55.                  l=(Rec[0]-0x30)*100+(Rec[1]-0x30)*10+(Rec[2]-0x30);
  56.                  sd=(Rec[3]-0x30)*100+(Rec[4]-0x30)*10+(Rec[5]-0x30);
  57.                  zf=(Rec[6]-0x30);
  58.                  if(zf==1)DIR=1;
  59.                  if(zf==0)DIR=0;
  60.                 mz=2*l;
  61.          }
  62.         TR0=1;                                                //定时器 0 启动计数       
  63.         ET0=1;                                                //开启定时器 0 中断
  64.         }

  65. }

  66. void time0(void)  interrupt 1
  67. {  
  68.         TH0=(65536-50000)/256;                //重新设置定时器 初值,产生1MS定时中断
  69.         TL0=(65536-50000)%256;
  70.        
  71.         count++;                                       
  72.         if(count>=sd)                       
  73.         {
  74.           count=0;
  75.                 if(mz>0)
  76.                 {mz--;      //计算脉冲个数,减至0停止
  77.                         CLK=~CLK;
  78.                         //d1=~d1;
  79.                 }
  80.                 else {CLK=1;ET0=0;}
  81.                
  82.           
  83.         }
  84. }
复制代码

一周热门 更多>