直流电机调速仿真文件和程序在文件夹
单片机源程序如下:
- //**********cx.c************************************************
- #include <REG51.h>
- #include <string.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define Led_wx P2
- #define Led_dx P0
- //**********定义变量********************************************
- uchar pwm=20; //定义pwm周期数
- uchar pwmH=1; //定义高电平脉冲个数计数器
- uchar counter=0; //定义脉冲个数计数器
- uchar Ledplay[6]; //
- uchar bn=0; //
- uchar M=1; //
- bit SW=0; //
- bit LR=0; //
- //**********定义端口********************************************
- sbit KSW=P1^0; //定义启停控制引脚
- sbit KLR=P1^1; //定义左、右转控制引脚
- sbit KSPU=P1^2; //定义加速控制引脚
- sbit KSPD=P1^3; //定义减速控制引脚
- sbit M1=P3^0; //定义电机驱动控制引脚
- sbit M2=P3^1; //定义电机驱动控制引脚
- sbit M3=P3^7;
- //**********定义函数********************************************
- uchar code no[]= //-----------数码代码
- {
- 0x3f, //0
- 0x06, //1
- 0x5b, //2
- 0x4f, //3
- 0x66, //4
- 0x6d, //5
- 0x7d, //6
- 0x07, //7
- 0x7f, //8
- 0x6f, //9
- 0x38, //L 10
- 0x77, //R 11
- 0x40 //- 12
- };
- uchar code wex[]= //-----------显示位码
- {
- 0xfe, //选中第一位
- 0xfd, //选中第二位
- 0xfb, //选中第三位
- 0xf7, //选中第四位
- 0xef, //选中第五位
- 0xdf //选中第六位
- };
- //****************************************************************
- void Delay(unsigned int i) //延时单次6us
- {
- while(i--);
- }
- void DelayM(unsigned int t) //延时单次1ms
- {
- unsigned char i;
- while(--t!=0)
- {
- for(i=0;i<120;i++);
- }
- }
- //*****************************************************************
- void putin (int u) //字符载入函数-将字符装入显示寄存器
- {
- Ledplay[bn]=no[u];
- bn++; //换下一个显示缓冲环节
- }
- //*****************************************************************
- void clearRAM (void) //寄存器清空函数-6个寄存器清空(0x00)
- {
- uchar a; //定义变量用于清空数据指针
- for(a=0;a<6;a++) //指向2个寄存器
- {
- Ledplay[a]=0; //将指向的寄存器清空
- }
- }
- void ledxs(void) //数码管显示子程序
- {
- uchar i;
- uchar Date=0;
- uchar wx=0;
- for(i=0;i<6;i++) //扫描数码管1~6位
- {
- Date=wex[i];
- Date=Date & 0x3f; //取低6位数据
- wx=Led_wx & 0xc0 | Date; //屏蔽高2位端口
- Led_wx=wx; //送数据
- Led_dx=Ledplay[i];
- DelayM(2);
- }
- }
- void Time0_int(void) //定时器T0初始化
- {
- TMOD=0X02;
- TH0=56;
- TL0=56;
- ET0=1;
- EA=1;
- TR0=1;
- }
- void Time0() interrupt 1 using 1 //定时服务程序
- {
- M3=1;
- counter++;
- if (counter>=pwmH)
- {
- M=0;
- }
- if (counter==pwm)
- {
- counter=0;
- M=1;
- }
- }
- //**********主函数*******************************************
- main()
- {
- Time0_int();
- while(1)
- {
- //**********按键处理*****************************************
- if(KSW==0) //检测开始、停止
- {
- DelayM(20); //延时去抖
- if(KSW==0)
- {
- SW=~SW;
- }
- while(KSW==0); //等待键释放
- }
- if(KLR==0) //检测左转、右转
- {
- DelayM(20); //延时去抖
- if(KLR==0)
- {
- LR=~LR;
- }
- while(KLR==0); //等待键释放
- }
- if(KSPU==0) //检测加速
- {
- DelayM(20); //延时去抖
- if(KSPU==0)
- {
- pwmH++;
- if(pwmH==pwm)
- {
- pwmH=pwm-1;
- }
- }
- while(KSPU==0);
- }
- if(KSPD==0) //检测减速
- {
- DelayM(20); //延时去抖
- if(KSPD==0)
- {
- pwmH--;
- if(pwmH==0)
- {
- pwmH=1;
- }
- }
- while(KSPD==0);
- }
- //****************************************************************
- if(SW==0)
- {
- M1=0;
- M2=0;
- bn=0;
- clearRAM();
- }
- if(SW==1)
- {
- bn=0;
- clearRAM();
- putin(pwm%10); //显示PWM个位
- putin(pwm/10); //显示PWM十位
- putin(12); //显示-
- putin(pwmH%10); //显示PWMH个位
- putin(pwmH/10); //显示PWMH十位
- if(LR==0)
- {
- M1=0;
- M2=M;
- putin(11); //显示左转L
- }
- if(LR==1)
- {
- M1=M;
- M2=0;
- putin(10); //显示右转R
- }
- }
- ledxs(); //数码管显示
- }
- }
复制代码
所有资料51hei提供下载:
直流电机调速.rar
(52.38 KB, 下载次数: 69)
|