初级会员
- 积分
- 158
- 金钱
- 158
- 注册时间
- 2016-5-7
- 在线时间
- 41 小时
|
做的光耦码盘测速,网上你找的程序修改的,但是程序一直有问题,感觉是定时器和外部中断配置的有些问题,电机有一种想要转起来但是转不起来的样子,,请大神帮忙看看
#include <reg52.h>
#include <intrins.h>
#include "motor.h"
#include "1602.h"
sbit RIGHT_IN1 = P1^3; //右边电机
sbit RIGHT_EN = P1^4;
sbit RIGHT_IN2 = P1^5;
sbit LEFT_IN1 = P1^2; //左边电机
sbit LEFT_EN = P1^1;
sbit LEFT_IN2 = P1^0;
sbit GUANGOU=P3^2; //光耦
#define PWM_PERIOD 100 //PWM周期PWM_PERIOD*100us
#define uchar unsigned char
#define uint unsigned int
//---------- PWM ------------//
uchar PWM_COUNTER = 0; //pwm产生周期 100*100us
uchar LEFT_PWM_DUTY = 50; //左边电机占空比
uchar RIGHT_PWM_DUTY = 50; //右边电机占空比
uint speed,qian,bai,shi,ge,n;
/*********************************************
函数名称: Delay_10Us
函数功能: us延时函数
函数输入: us-延时时间控制变量
函数输出: 无
**********************************************/
void Delay_10Us(uint us)
{
while( us-- );
}
/*********************************************
函数名称: DelayMs
函数功能: ms级延时函数,延时时间:ms*ms
函数输入: ms-延时时间控制变量
函数输出: 无
**********************************************/
void DelayMs(uint ms)
{
unsigned int i,j;
for( i = 0; i < ms; i ++ )
for( j = 115; j > 0; j --);
}
/*********************************************
函数名称: Init
函数功能: 初始化单片机的定时0(用于产生PWM)、定时器1(用于产生时钟)
函数输入: 无
函数输出: 无
**********************************************/
void Init_Timer(void)
{
TMOD = 0x12; //设定T0的工作模式为2,设定T0的工作模式为1
//----装入定时器初值 -----//
TH0 = 0x95; //100us定时
TL0 = 0x95;
TH1 = (65536-50000)/256; //50ms定时
TL1 = (65536-50000)%256;
IT0 = 1;
IP = 0x03;
EA = 1; // 开总中断
ET0 = 1; // 定时器0允许中断
ET1 = 1; // 定时器1允许中断
TR1 = 1; // 启动定时器1
TR0 = 1; // 启动定时器0
}
/*********************************************
函数名称: Timer0_ISR
函数功能: 定时器0中断服务函数,用于输出PWM波
函数输入: 无
函数输出: 无
**********************************************/
void Timer0_ISR(void) interrupt 1 using 1
{
PWM_COUNTER ++;
if(PWM_COUNTER < PWM_PERIOD)
{
if(PWM_COUNTER > LEFT_PWM_DUTY) LEFT_EN = 0;
if(PWM_COUNTER > RIGHT_PWM_DUTY) RIGHT_EN = 0;
}
else
{
PWM_COUNTER = 0;
LEFT_EN = 1;
RIGHT_EN = 1;
}
}
void int0(void) interrupt 0 using 0 //外中断0的中断编号为0
{
n++;
while(GUANGOU==0);
}
/*********************************************
函数名称: Timer1_ISR
函数功能: 定时器1中断服务函数,用于产生时钟
函数输入: 无
函数输出: 无
**********************************************/
void Timer1_ISR() interrupt 3
{
uchar cnt;
cnt=cnt+1;
if(GUANGOU==1)n++;
if(cnt==100)
{
cnt=0;
speed=20*n;
n = 0;
qian=speed/1000;
bai=speed%1000/100;
shi=speed%100/10;
ge=speed%10;
}
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
}
/*********************************************
函数名称: GoHead
函数功能: 前进函数:控制小车以一定速度直线前进,也可以
控制小车转弯
函数输入: speed_left -左轮占空比
speed_right-右轮占空比
函数输出: 无
**********************************************/
void GoHead(uchar speed_left,uchar speed_right)
{
LEFT_IN1 = 0;
LEFT_IN2 = 1;
RIGHT_IN1 = 0;
RIGHT_IN2 = 1;
LEFT_PWM_DUTY = speed_left;
RIGHT_PWM_DUTY = speed_right*5/4; //走直线占空比校正
}
/********************************************
函数名称: main
函数功能: 整个程序的入口
函数输入: 无
函数输出: 无
**********************************************/
void main(void)
{
LcdReset(); //液晶初始化
Init_Timer(); //Timer0、Timer1初始化
DisplayListChar(0,0,"speed",5);
DisplayListChar(0,1,"CUG ROBOT TEAM",14);
EA=1; //开放总中断
EX0=1; //允许使用外中断
IT0=1; //选择负跳变来触发外中断
while(1)
{
GoHead(40,60);
DispOneChar(6,0,qian+0x30); //显示时间”分“的十位
DispOneChar(7,0,bai+0x30); //显示时间”分“的个位
DispOneChar(8,0,shi+0x30); //显示时间”秒“的十位
DispOneChar(9,0,ge+0x30); //显示时间”秒“的个位
}
}
|
|