51单片机+L293D控制直流电机起保停+数码管PWM调速显示
51单片机+L293D控制直流电机起保停+数码管PWM调速显示
- PWM速度10级可调
- 采用L293D驱动
- 数码管显示PWM当前占空比
- 可优化的地方是数码管可以采用其他驱动芯片来驱动,提高驱动能力和减少单片机的IO口占用,例如74LS138译码器来驱动,前面几篇文章有写到采用数码管驱动芯片来做示例的可以参照。
- 仿真演示

- 程序代码
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 125 126 127 128 129 130 131 132 133 134
| #include <STC89C5xRC.H> typedef unsigned char u8; typedef unsigned int u16; #define EN1 P22 #define D1 P20 #define D2 P21 #define button\_Z P10 #define buttun\_R P11 #define button\_T P12 #define PWM\_add P13 //#define PWM\_sub P14 u8 flag=0; u8 flag1=0; static u8 b =5; u8 code table[]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
void init(); void zhengzhuan(); void fanzhuang(); void ting(); void buttonscan(); void delayms(u8 rms); void display(u16 num);
void main (){
init(); EA=1; while(1) { buttonscan(); } }
void zhengzhuan(){ //EN1=1; ET0=1; D1=1; D2=0; } void fanzhuang(){ //EN1=1; ET0=1; D1=0; D2=1; } void ting(){ // EN1=0; ET0=0; D1=1; D2=1; } void buttonscan(){ if(button_T==0){ ting(); } if(button_Z==0){ zhengzhuan(); } if(buttun_R==0){ fanzhuang(); } if(PWM_add==0&&flag==0){ flag=1; } if(PWM_add==1&&flag==1) { b++; if(b>10)b=0; flag=0; } display(b);
} void init() { TMOD=0X01; TH0 = (65536-1000)/256; TL0 = (65536-1000)%256; TR0 =1; ET0=1; EA=1; ET0=1; } void time0 ()interrupt 1 {//中断处理函数 static u16 a; TH0 = (65536-1000)/256; TL0 = (65536-1000)%256; a++; if(a>9) //1khz a=0; if(a<b) //占空比可改 EN1=1; else EN1=0; } void display(u16 num) { P27=0; P0=table[(num/1000)]; delayms(2); P0=0X00;//消隐 P27=1;
P26=0; P0=table[(num/1000)]; delayms(2); P0=0X00; P26=1;
P25=0; P0=table[(num/10)]; delayms(2); P0=0X00; P25=1;
P24=0; P0=table[(num%10)]; delayms(2); P0=0X00;
P24=1; }
void delayms(u8 rms) { u8 i,j; for(i=0;i<rms;i++) for(j=0;j<110;j++); }
|
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!