上位机发送任意PWM,通过单片机控制步进电机的问题
时间:10-02
整理:3721RD
点击:
程序代码如下:
- #include <reg52.h>
- #include<stdlib.h>
- #define uint unsigned int
- #define uchar unsigned char
- uchar flag, a;
- uint Count = 0 ; //中断计数
- uint Direction = 0 ; //控制脉冲方向
- //uint ENA = 1 ;
- sbit PWM = P1^0;
- sbit ENA = P1^1;
- //sbit Direction = P1^2;
- /**********************初始化********************/
- void init(void) //串口中断初始化
- {
- /*(1)串口中断,在串行口工作于方式1和方式3时,由单片机的定时器T1作为波特率发生器。
- (2)定时器T0工作于方式1,即16位定时工作方式,用于产生PWM*/
- TMOD=0x21;
-
- /*******************************************************/
- SM0=0; //串行口工作方式1,功能:10位异步收发,波特率可变
- SM1=1;
- /*低8位计数器TL1与高8位计数器TH1装入同一个技术初值,这就是TH1和TL1相同的原因,改变该计数初值就可以在一定范围内改变波特率*/
- TH1=0xfd; //设置波特率为9600,12MHz实际上波特率为10416.67 bit/s
- TL1=0xfd;
-
- /******************定时器T0的定时初值******************/
- TH0=(65536-1000)/256; //1ms定时时间
- TL0=(65536-1000)%256;
-
- /**************定时/计数器控制寄存器TCON****************/
- TR0 = 1 ; //定时器T0开始定时
- TR1 = 1 ; //定时器T1开始定时
-
- /****************串行口控制寄存器SCON*****************/
- REN = 1; //允许串口接收数据
- /****************中断允许控制寄存器IE*****************/
- ET0 = 1 ; //允许定时器T0中断
- ES = 1; //允许串口中断
- EA = 1; //中断总控制位
- }
- /********************主函数***********************/
- void main(void)
- {
- init();
- while(1)
- {
- if(flag == 1) //串口有数据
- {
- ES = 0; //关闭串行中断
- flag = 0;
- ET0 = 1; //允许定时器T0中断
- ES=1; //允许串口中断
- }
- }
- }
- /*******************T0定时器*********************/
- void Timer0(void) interrupt 1
- {
- TH0 = (65536-1000)/256;
- TL0 = (65536-1000)%256;
- PWM = ~PWM;
- Count++;
- if(Count < a) ;
- else {
- Count = 0;
- ET0 = 0;
- }
- }
- /*******************串口中断*********************/
- void ser(void) interrupt 4
- {
- a = SBUF; //接受数据
- flag = 1; //标志位
- RI = 0; //软件清0
- }
什么问题?
管理员,帮我看看我这种问题怎么去解决呢?
管理员,帮我看看我这种问题怎么去解决呢?
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- //sbit d1=P2^0;
- uint count;
- uint l;//丝杠位移
- uint mz;//脉冲
- uint sd;//速度
- uint zf;//正反转
- uchar Rec[9];
- uchar r;
- /********************************************************
- 控制位定义
- ********************************************************/
- //TB6560输入控制端定义
- sbit CLK = P2^1; //脉冲控制位
- sbit ENA = P1^1; //使能控制位
- sbit DIR = P1^2; //方向控制位
-
- /********************************************************
- 主函数
- ********************************************************/
- void main()
- {
- TMOD=0x21; //11.0592M晶振
- TH0=(65536-50000)/256; //1毫秒中断
- TL0=(65536-50000)%256;
- TH1=0xfd; //波特率9600
- TL1=0xfd;
- SCON=0x50; //串口的工作方式,设置为方式1
- TR1=1; //打开定时器
- ES=1; //打开串口中断
- EA=1; //开启总中断
- ENA=1; //使能控制位
- DIR=0; //旋转方向控制位
- CLK=0; //脉冲控制位
-
-
-
- while(1)
- {
-
-
- }
- }
- void com_isr(void) interrupt 4
- {
- if(RI)
- {
- RI=0; //将寄存器复位等待接收下一个
- Rec[r]=SBUF; //将接收的数据存于变量中
- r++;
- if(r==7)
- {
- r=0;
- l=(Rec[0]-0x30)*100+(Rec[1]-0x30)*10+(Rec[2]-0x30);
- sd=(Rec[3]-0x30)*100+(Rec[4]-0x30)*10+(Rec[5]-0x30);
- zf=(Rec[6]-0x30);
- if(zf==1)DIR=1;
- if(zf==0)DIR=0;
- mz=2*l;
- }
- TR0=1; //定时器 0 启动计数
- ET0=1; //开启定时器 0 中断
- }
- }
- void time0(void) interrupt 1
- {
- TH0=(65536-50000)/256; //重新设置定时器 初值,产生1MS定时中断
- TL0=(65536-50000)%256;
-
- count++;
- if(count>=sd)
- {
- count=0;
- if(mz>0)
- {mz--; //计算脉冲个数,减至0停止
- CLK=~CLK;
- //d1=~d1;
- }
- else {CLK=1;ET0=0;}
-
-
- }
- }