历史上的今天
今天是:2024年12月20日(星期五)
2019年12月20日 | 分享一个51单片机直流电机调速源程序
2019-12-20 来源:51hei
帮助新手更快掌握学习关于51单片机模拟PWM波进行直流电机调速的系统设计
单片机源程序如下:
/*******************************************************************/
/* 程序名:PWM直流电机调速 */
/* 晶振:11.00592 MHz CPU型号:AT89C51 */
/* 直流电机的PWM波控制,可以直接的调速从0到20级的调速 */
/*****************************************************************/
#include #define TH0_TL0 (65536-1000)//设定中断的间隔时长 unsigned char count0 = 50;//低电平的占空比 unsigned char count1 = 0;//高电平的占空比 bit Flag = 1;//电机正反转标志位,1正转,0反转 sbit Key_add=P2 ^ 0; //电机减速 sbit Key_dec=P2 ^ 1; //电机加速 sbit Key_turn=P2 ^ 2; //电机换向 sbit PWM1=P2^6;//PWM 通道 1,反转脉冲 sbit PWM2=P2^7;//PWM 通道 2,正转脉冲 unsigned char Time_delay; /************函数声明**************/ void Delay(unsigned char x); void Motor_speed_high(void); void Motor_speed_low(void); void Motor_turn(void); void Timer0_init(void); /****************延时处理**********************/ void Delay(unsigned char x) { Time_delay = x; while(Time_delay != 0);//等待中断,可减少PWM输出时间间隔 } /*******按键处理加pwm占空比,电机加速**********/ void Motor_speed_high(void) { if(Key_add==0) { Delay(10); if(Key_add==0) { count0 += 5; if(count0 >= 100) { count0 = 100; } } while(!Key_add);//等待键松开 } } /******按键处理减pwm占空比,电机减速*****/ void Motor_speed_low(void) { if(Key_dec==0) { Delay(10); if(Key_dec==0) { count0 -= 5; if(count0 <= 0) { count0 = 0; } } while(!Key_dec ); } } /************电机正反向控制**************/ void Motor_turn(void) { if(Key_turn == 0) { Delay(10); if(Key_turn == 0) { Flag = ~Flag; } while(!Key_turn); } } /***********定时器0初始化***********/ void Timer0_init(void) { TMOD=0x01; //定时器0工作于方式1 TH0=TH0_TL0/256; TL0=TH0_TL0%256; TR0=1; ET0=1; EA=1; } /*********主函数********************/ void main(void) { Timer0_init(); while(1) { Motor_turn(); Motor_speed_high(); Motor_speed_low(); } } /**************定时0中断处理******************/ void Timer0_int(void) interrupt 1 using 1 { TR0 = 0;//设置定时器初值期间,关闭定时器 TL0 = TH0_TL0 % 256; TH0 = TH0_TL0 / 256 ;//定时器装初值 TR0 = 1; if(Time_delay != 0)//延时函数用 { Time_delay--; } if(Flag == 1)//电机正转 { PWM1 = 0; if(++count1 < count0) { PWM2 = 1; } else PWM2 = 0; if(count1 >= 100) { count1=0; } } else //电机反转 { PWM2 = 0; if(++count1 < count0) { PWM1 = 1; } else PWM1 = 0; if(count1 >= 100) { count1=0; } } } /************************************************ void Delay(unsigned char x) { Time_delay = x; while(Time_delay != 0);//等待中断,可减少PWM输出时间间隔 } Delay(10); if(Time_delay != 0)//延时函数用 { Time_delay--; } 其实这三个部分是相关联的。 Delay(10)这是延时防抖的这是毫无疑问的,但这个消抖在消抖的同时将一开始只是声明了下的Time- delay赋值了,赋值还不算他还牵扯到定时器里去了。你看在赋值后Time-delay变成了10,看第二个部分 的while(Time-delay!=10);这个语句正如注释所说的等待中断,当等来了中断后你可以看第三个部 分了,看见了吧终端中有将Time-delay减一,每中断一次就减一次直到等于0之后。也就是说延时的时长 是十个中断的时长。注释中:可减少PWM输出时间间隔 也就可想而知了。 *****************************************************/
史海拾趣
|
linux 下 CY7C68013 的 slavefifo 驱动 linux 下 CY7C68013 的 slavefifo 驱动 在 linux 下 自己编写 68013 驱动 1:在驱动程序调试中发现 写函数 成功执行了,68013 也 收到了数据,但是相应的硬件并不出现 68013 slavefifo 模式下应该出现的结果。 2:但是 68013 slavef ...… 查看全部问答> |
|
各位: CPU为PXA270,采集电压芯片为WM9712 ,通过AC-LINK采集电压 一共有两处用到: 1、触摸屏, 2、电池当前电压 问题: 正常情 ...… 查看全部问答> |
|
小弟使用的是C8051F020芯片 以太网接口芯片是CP2201 由于开发使用芯片自带的库文件 函数和socket有些类似 程序基本实现将从PC收到的数据再次传回去 发送发送一段时间后(10ms或100ms) 单片机将不收数据了 不知道是什么原因?… 查看全部问答> |
|
STM32可以编译包括运行,但是收不到数据。很郁闷。 公司台式电脑没串口,用的是USB转串口,相当于虚拟串口,串口调试助手,是用COM3口。下述程序可以运行,LED也会闪,但是串口调试助手上就是收不到数据。 请帮忙看看,十分感谢! 附近 ...… 查看全部问答> |
|
大家好,我按着TI的资料做了一块2401的板子,做出来后不要说用来做调试了,就是连都不能连上.接下来的工作根本无法进行.后来找JTAG的资料来研究,发现EUM0和EUM1是用来作为接收来自仿真器的中断 ...… 查看全部问答> |
|
我用这个28035运行其他的程序能够运行,应该说明系统时钟应该能够支持系统的运行。 但是我现在在做一个28035+TOPWAY 的液晶屏的显示就是显示不出来。 以前我在MSP430F149上已经实现了。这次只是换到DSP28035上就 ...… 查看全部问答> |
|
前不久参加医疗电子大会,重点了解了一下现在很热门的一个存储器——FRAM。Speaker认为因为FRAM的以下优势在医疗应用已经取得绝对主导地位: 首先,在医疗领域,FRAM的抗辐射性是一个比较大的优势,因为医院里的特殊环境所致(CT扫描X射线、用于消 ...… 查看全部问答> |




