51 驱动直流电机,测试可用,可调速
单片机源程序如下:
- #include <REG52.H> //包含51单片机相关的头文件
- #define uchar unsigned char
- #define uint unsigned int
- /*==================
- 对各个输出端口的定义
- 对占空比的端口定义
- ====================*/
- sbit IN4=P1^3; //定义左轮前进
- sbit IN3=P1^2; //定义左轮后退
- sbit IN1=P1^0; //定义右轮前进
- sbit IN2=P1^1; //定义右轮后退
- sbit ENA=P1^6; //定义右轮使能
- sbit ENB=P1^7; //定义左轮使能
- uint Duty_left; //定义左轮占空比
- uint Duty_right; //定义右轮占空比
- uint i; //中断中控制占空比变量
- /*===========
- ms级延时函数
- =============*/
- void delay(uint n)
- {
- int x,y;
- for(x=n;x>0;x--)
- for(y=115;y>0;y--);
- }
- /*=======
- 停止函数
- =========*/
- void tingzhi()
- {
- Duty_left=0; //左轮占空比
- Duty_right=0; //右轮占空比
- IN1=0;
- IN2=0;
- IN3=0;
- IN4=0;
- }
- /*=======
- 前进函数
- =========*/
- void qianjin()
- {
- Duty_left=100; //左轮占空比
- IN4=0;
- IN3=1;
- delay(3000);
- ENB=0;
- delay(3000);
- ENB=1;
- }
- /*============
- pwm初始化函数
- ==============*/
- void pwm_init()
- {
- TMOD |= 0x01; //设置定时器工作方式0x01
- TH0=(65536-1)/256; //取约150HZ,12M晶振,每次定时66us,分100次,
- TL0=(65536-1)%256; //这样开头定义的变量正好直接表示占空比的数值
- EA=1; //打开总中断
- ET0=1; //开启定时器0中断
- TR0=1; //启动定时器0
- }
- main()
- {
- pwm_init();
- while(1)
- {
- qianjin();
- }
- }
- /*========
- 中断函数
- ==========*/
- void T0_timer() interrupt 1
- {
- i++;
- if(i<=Duty_right)
- ENA=1;
- else
- ENA=0;
- if(i<=Duty_left)
- ENB=1;
- else
- ENB=0;
- if(i==100)
- {
- i = 0;
- }
- TH0=(65536-1)/256; //取约150HZ,12M晶振,每次定时66us,分100次,
- TL0=(65536-1)%256; //这样开头定义的变量正好直接表示占空比的数值
- }
复制代码
所有资料51hei提供下载:
直流电机驱动.zip
(21.86 KB, 下载次数: 91)
|