51单片机 怎么用定时器输出方波从宽到窄,单片机用定时器输出,不借助按键调速。 用来控制步进电机转速,给定高速脉冲时无法启动,必须有一个加速的过程。 单片机源程序如下: #include<reg52.h> //宏定义 //*************************************************************** #define uchar unsigned char #define uint unsigned int #define TERM 10//周期为10 //*************************************************************** //管脚定义 //*************************************************************** sbit ZHENGKEY = P2^4;//正转 sbit KUAIZHENGKEY = P2^5;//快正转 sbit FANKEY = P2^6; //反转 sbit DIR = P0^1; //方向 sbit EN = P0^2; //使能 sbit CP = P0^3; // 脉冲 //*************************************************************** //变量定义 //*************************************************************** //*************************************************************** //函数定义 //*************************************************************** void sysinit(void);//初始化 void delayms(unsigned int Num);//延时函数 void T0_time(void); //*************************************************************** //主函数 //*************************************************************** void main() { static bit temp; ZHENGKEY = 1; FANKEY = 1; sysinit(); temp = 0; CP = 1; while(1) { jianshu(); if (ZHENGKEY == 0) //正转 { delayms(10); if (ZHENGKEY == 0) { EN = 1; TR0=1; DIR = 1; } } else if (KUAIZHENGKEY == 0) //快正转 { delayms(10); if (KUAIZHENGKEY == 0) { EN = 1; TR0=1; DIR = 1; } } else if (FANKEY == 0) //反转 { delayms(10); if (FANKEY == 0) { EN = 1; TR0=1; DIR = 02; } } else { EN = 0; TR0=0; } } } void sysinit(void) { TMOD = 0x02; TH0=(65536-80)/256; TL0=(65536-80)%256; EA=1; ET0=1; TR0=0; } void T0_time()interrupt 1 { TH0=(65536-80)/256; TL0=(65536-80)%256; CP=~CP; } void jianshu() { } void delayms(unsigned int Num) { unsigned int i,j; for(i=0;i<Num;i++) { for(j=0;j<300;j++); }; } |
dwb123 发表于 2021-8-2 11:39
给中断啊,定时中断然后改变占空比就可以了。
chenchuanke 发表于 2021-8-3 09:26
他这个用pwm应该不行,应该是控制一个频率在一定时间内由低到高或者是由高到低的一个过程。步进电机都必须 ...
捕获.PNG (27.46 KB, 下载次数: 76)
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |