【Proteus仿真】51单片机+直流电机PWM调速实验
【Proteus仿真】51单片机+直流电机PWM调速实验
- Proteus仿真

- 采用L293驱动直流电机
-PWM是采用定时器中断实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
| /\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* \* \* \*关于频率和占空比的确定,对于12M晶振,假定PWM输出频率为1KHZ,这样定时中断次数 \* \*设定为C=10,即0.01MS中断一次,则TH0=FF,TL0=F6;由于设定中断时间为0.01ms,这样\* \*可以设定占空比可从1-100变化。即0.01ms\*100=1ms \* \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/ //#include <REGX51.H> #include <STC89C5xRC.H>
#define uchar unsigned char /\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* \* TH0和TL0是计数器0的高8位和低8位计数器,计算办法:TL0=(65536-C)%256; \* \* TH0=(65536-C)/256,其中C为所要计数的次数即多长时间产生一次中断;TMOD是计数器\* \* 工作模式选择,0X01表示选用模式1,它有16位计数器,最大计数脉冲为65536,最长时 \* \* 间为1ms\*65536=65.536ms P10 P11 \*Keyup Keydown
\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/ #define V\_TH0 0XFF #define V\_TL0 0XF6 #define V\_TMOD 0X01 #define Keydown P15 #define Keyup P14 #define keystop P13 #define keystar P12 void init\_sys(void); /\*系统初始化函数\*/ void Delay5Ms(void);
unsigned char ZKB1,ZKB2;
void main (void) { init\_sys(); ZKB1=40; /\*占空比初始值设定,启动时的默认速度\*/ ZKB2=70; /\*占空比初始值设定\*/ EA=0; while(1) { if (!Keyup) //如果按了+键,增加占空比 { Delay5Ms(); if (!Keyup) { ZKB1++; ZKB2=100-ZKB1; } }
if (!Keydown) //如果按了-键,减少占空比 { Delay5Ms(); if (!Keydown) { ZKB1--; ZKB2=100-ZKB1; } } /\*对占空比值限定范围\*/ if (ZKB1>99) ZKB1=1; if (ZKB1<1) ZKB1=99; if(!keystop) { //停止 Delay5Ms(); if(!keystop) EA=0; } if(!keystar) { //启动 Delay5Ms(); if(!keystar) EA=1; } }
}
/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* \*函数功能:对系统进行初始化,包括定时器初始化和变量初始化\*/ void init\_sys(void) /\*系统初始化函数\*/ { /\*定时器初始化\*/ TMOD=V_TMOD; TH0=V_TH0; TL0=V_TL0; TR0=1; ET0=1; EA=1; }
//延时 void Delay5Ms(void) { unsigned int TempCyc = 1000; while(TempCyc--); }
/\*中断函数\*/ void timer0(void) interrupt 1 using 2 { static uchar click=0; /\*中断次数计数器变量\*/ TH0=V_TH0; /\*恢复定时器初始值\*/ TL0=V_TL0; ++click; if (click>=100) click=0;
if (click<=ZKB1) /\*当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整\*/ P10=0; else P10=1;
if (click<=ZKB2) P11=0; else P11=1;
}
|
仿真资源和程序源码
1 2 3
| 链接:https://pan.baidu.com/s/19kGRozFvK-d537bHQA1H8g 提取码:5j6u
|
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!