标题:
51单片机通过编码器脉冲值控制小车行驶距离 源程序
[打印本页]
作者:
blinker
时间:
2019-8-6 20:02
标题:
51单片机通过编码器脉冲值控制小车行驶距离 源程序
大一时使用51单片机进行控制小车走过的距离,现整理一下发个帖子凑一下黑币,不喜轻喷。。
主要思路是利用单片机的外部中断来读出编码器脉冲值,进而通过获得的脉冲值来控制行驶距离。
首先利用外部中断测得车轮转一圈获得的脉冲,并测出车轮一圈长度。再利用以上思路便能得出距离从而控制。
在控制小车转过的角度时基本也是以上思路。
单片机源程序如下:
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16;
typedef unsigned char u8;
u16 Encodercout=0;//轮子转一圈大概产生270个脉冲,轮子周长为154mm,走过30度产生58个脉冲
u16 wheelcount=0;
u16 distance=1000;//定义变量为行驶距离,单位为mm
u16 time=0; // 定义占空比的变量
sbit PWM1=P2^0; //P2.0输出右轮pwm
sbit PWM2=P2^1; //输出左轮pwm 右轮较快
sbit motorl1=P2^2;
sbit motorl2=P2^3;//右轮
sbit motorr1=P2^4;
sbit motorr2=P2^5;//左轮
void motor();
//void delay(u16 a)
//{
// while(a--);
//}
void Int0Init()
{
//设置INT0
IT0=1;//跳变沿出发方式(下降沿)
EX0=1;//打开INT0的中断允许。
EA=1;//打开总中断
}
void TimeInt()
{
TMOD=0x01;//定时器0工作方式1
TH0=0xfc;//(65536-10)/256;//赋初值定时
TL0=0x18;//(65536-10)%256;//1ms
EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
}
//void UsartInit()
//{
// SCON=0X50; //设置为工作方式1
// TMOD=0X20; //设置计数器工作方式2
// PCON=0X80; //波特率加倍
// TH1=0XF3; //计数器初始值设置,注意波特率是4800的
// TL1=0XF3;
// ES=1; //打开接收中断
// EA=1; //打开总中断
// TR1=1; //打开计数器
//}
//void Usart() interrupt 4
//{
// u8 receivedata;
// receivedata=SBUF;//接收寄存器
// RI=0; //接受位清零
// SBUF = Encodercout; //发送寄存器
// while(!TI); // 等待发送完成
// TI=0; //发送位清零
// receivedata = 0;
//}
void main()
{
while(1)
{
Int0Init();
// UsartInit();
TimeInt();
if(wheelcount<=(distance/154))
{
motor();
}
else if(Encodercout<=(distance%154)/154*270)
{
motor();
}
else
{
motorl1=0;
motorr1=0;
}
}
}
void motor()
{
motorl1=1;
motorl2=0;
motorr1=1;
motorr2=0;
}
void tim0() interrupt 1
{
TH0=0xfc;//(65536-10)/256;//赋初值定时
TL0=0x18;//(65536-10)%256;1ms
time++;
if(time>=100)
time=0;
else if(time<=50) //轮占空比%30,可改 21:28
{
PWM1=1;
PWM2=0;
}
else if(time>50&time<=99)
{PWM1=0;
PWM2=1;
}//左轮占空比
else if(time>99&time<100)
{
PWM1=0;
PWM2=0;
}
}
void Int0() interrupt 0 //外部中断0的中断函数
{
if(Encodercout>=270)
{
Encodercout=1;
Encodercout++;
wheelcount++;
}
else
{
Encodercout++;
}
}
复制代码
作者:
a5a5a5ss
时间:
2019-10-16 18:54
为什么程序里有一部分内容加//隐藏掉了?
作者:
快乐眼泪
时间:
2023-8-30 22:06
谢谢楼主分享!先收藏了有时间研究一下!
作者:
xingzhe8
时间:
2023-8-31 07:44
a5a5a5ss 发表于 2019-10-16 18:54
为什么程序里有一部分内容加//隐藏掉了?
那是串口函数 因为用不到
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1