標題:
51單片機通過編碼器脈沖值控制小車行駛距離 源程序
[打印本頁]
作者:
blinker
時間:
2019-8-6 20:02
標題:
51單片機通過編碼器脈沖值控制小車行駛距離 源程序
大一時使用51單片機進行控制小車走過的距離,現(xiàn)整理一下發(fā)個帖子湊一下黑幣,不喜輕噴。。
主要思路是利用單片機的外部中斷來讀出編碼器脈沖值,進而通過獲得的脈沖值來控制行駛距離。
首先利用外部中斷測得車輪轉(zhuǎn)一圈獲得的脈沖,并測出車輪一圈長度。再利用以上思路便能得出距離從而控制。
在控制小車轉(zhuǎn)過的角度時基本也是以上思路。
單片機源程序如下:
#include "reg52.h" //此文件中定義了單片機的一些特殊功能寄存器
typedef unsigned int u16;
typedef unsigned char u8;
u16 Encodercout=0;//輪子轉(zhuǎn)一圈大概產(chǎn)生270個脈沖,輪子周長為154mm,走過30度產(chǎn)生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()
{
//設(shè)置INT0
IT0=1;//跳變沿出發(fā)方式(下降沿)
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; //設(shè)置為工作方式1
// TMOD=0X20; //設(shè)置計數(shù)器工作方式2
// PCON=0X80; //波特率加倍
// TH1=0XF3; //計數(shù)器初始值設(shè)置,注意波特率是4800的
// TL1=0XF3;
// ES=1; //打開接收中斷
// EA=1; //打開總中斷
// TR1=1; //打開計數(shù)器
//}
//void Usart() interrupt 4
//{
// u8 receivedata;
// receivedata=SBUF;//接收寄存器
// RI=0; //接受位清零
// SBUF = Encodercout; //發(fā)送寄存器
// while(!TI); // 等待發(fā)送完成
// TI=0; //發(fā)送位清零
// 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的中斷函數(shù)
{
if(Encodercout>=270)
{
Encodercout=1;
Encodercout++;
wheelcount++;
}
else
{
Encodercout++;
}
}
復制代碼
作者:
a5a5a5ss
時間:
2019-10-16 18:54
為什么程序里有一部分內(nèi)容加//隱藏掉了?
作者:
快樂眼淚
時間:
2023-8-30 22:06
謝謝樓主分享!先收藏了有時間研究一下!
作者:
xingzhe8
時間:
2023-8-31 07:44
a5a5a5ss 發(fā)表于 2019-10-16 18:54
為什么程序里有一部分內(nèi)容加//隱藏掉了?
那是串口函數(shù) 因為用不到
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1