欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
51單片機(jī)循跡小車制作總結(jié) 附程序源碼
[打印本頁]
作者:
hongniu
時(shí)間:
2015-6-23 19:05
標(biāo)題:
51單片機(jī)循跡小車制作總結(jié) 附程序源碼
本帖最后由 hongniu 于 2015-6-23 19:08 編輯
我的循跡小車歷經(jīng)兩整天,
兩晚的奮戰(zhàn)終于與今天下午巡跡成功了,總結(jié)一下我最大的收獲就是:抓住關(guān)鍵點(diǎn),結(jié)點(diǎn)事件,先把最關(guān)鍵的問題加以解決,以后聯(lián)調(diào)試時(shí)會(huì)很快的,還有一點(diǎn),別人的東西不一定是對(duì)的,即使他做過,你要綜合各方面的信息,做出自己的判斷,還有就是手冊的重要性,這是一個(gè)思考問題、發(fā)現(xiàn)問題、解決問題的過程,很苦燥,但是結(jié)果是很甜的,就像做出了一道數(shù)學(xué)題,還是那句話:即使一小步,也有新高度
程序源碼:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit p0_0=P0^0;
sbit p0_7=P0^7;
sbit p1_7=P0^7;
sbit EN1=P1^2;//m1脈沖輸入
sbit EN2=P1^5;//m2脈沖輸入
//*****************************
sbit HW1=P2^0;//加建
sbit HW2=P2^1;//減鍵 m1
//***************************
sbit p2_2=P2^2;
sbit p2_3=P2^3;
// m2
//*********************
sbit p1_3=P1^3;
sbit p1_4=P1^4; //M2轉(zhuǎn)向組合
//******************************
sbit p1_1=P1^1;
sbit p1_0=P1^0; //M1轉(zhuǎn)向組合
//*****M1***********************************************
uint t=100; //載波周期
uint time0; // 低電平可按鍵調(diào)整量 我這里是 把周期和低電平設(shè)為一個(gè)是程序內(nèi)可調(diào),一個(gè)是程序外可調(diào)而高電平是死的,也可以反之是一樣的
uint time1; // 高點(diǎn)平基準(zhǔn)量
uint timeing0;//立即低電平動(dòng)態(tài)變量
uint timeing1; //立即高電平動(dòng)態(tài)變量
//*****M2****************
//uint t=500; //載波周期
uint time_0; // 低電平可按鍵調(diào)整量 我這里是 把周期和低電平設(shè)為一個(gè)是程序內(nèi)可調(diào),一個(gè)是程序外可調(diào)而高電平是死的,也可以反之是一樣的
uint time_1; // 高點(diǎn)平基準(zhǔn)量
uint timeing_0;//立即低電平動(dòng)態(tài)變量
uint timeing_1; //立即高電平動(dòng)態(tài)變量
//********傳感器中間變量定義****************************
uchar middate,middate1,middate2;
//********************************
//void delay(uint z) //延時(shí)1ms程序
//{
//uint x,a,b;
// for (x=0;x<z;x++)
//
// {
// for(b=120;b>0;b--)
// {
// for(a=3;a>0;a--);
//
// }
// }
//
// }
void stop() //停止函數(shù) 停止 HW1=HW2=0;
{
EA=0; //禁止中斷
EN1=0;
EN2=0;
}
void goon()// 直著走 HW1=1=HW2;
{
EA=1;
time0=50;
time_0=50;
time1=50;
time_1=50;
}
void left()//向左轉(zhuǎn)彎 HW1=1;HW2=0; 修改定時(shí)數(shù)據(jù),實(shí)現(xiàn)實(shí)時(shí)PWM調(diào)制
{
EA=1;
//***************
time_0=50;
time_1=50; // //通過調(diào)整左輪的轉(zhuǎn)速來調(diào)整轉(zhuǎn)彎力度,這里要配合傳感器實(shí)時(shí)采集才行
time0=(time0-1);
time1=(t-time0);
//***********************
timeing0=0;
timeing1=0;
}
void right()//向右轉(zhuǎn)彎 HW1=0;HW2=1;
{
EA=1;
//***************
time0=50;
time1=50; //通過調(diào)整右輪的轉(zhuǎn)速來調(diào)整轉(zhuǎn)彎力度,這里要配合傳感器實(shí)時(shí)采集才行
time_0=(time_0-1);
time_1=(t-time_0);
//******************
timeing_0=0;
timeing_1=0; //太關(guān)鍵了!這一步,因?yàn)椴患拥脑挘?dāng)再一次的time0被修改時(shí)timeing0,和timeing1不為0
// 所以才會(huì)發(fā)生錯(cuò)誤,表現(xiàn)為波形時(shí)斷時(shí)續(xù),而且有尖鋒脈沖,這都是沒有在刷新TIME0的同時(shí)刷新tineing的后果
// 沒想到很簡單的一點(diǎn)事竟差點(diǎn)釀成PWM做不出來!真是有有教訓(xùn)了
// 2010年10月7日晚8:34分與天津開發(fā)區(qū)第四項(xiàng)目部宿舍1
}
void InitTimer0(void) //10us 定時(shí)器初始化設(shè)置函數(shù)
{
TMOD = 0x01;
TH0 =0xff;
TL0 =0xf7;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void main(void)//主函數(shù)
{ P2=0x0f;
InitTimer0(); //10 us(可變啊,根據(jù)不同的精準(zhǔn)度和頻率要求)
//************
p1_0=0;
p1_1=1; //M2
//決策轉(zhuǎn)向
p1_3=1;
p1_4=0; //M1
//************
time0=50; //**************************************************************************************************************//
time1=50; // //
time_0=50; // //
time_1=50; // 通知 //
// L293B的8腳是要接>5V的,16腳要接5V,但是別人的不是這樣的,我是看了手冊,和失敗后這樣做的 // //
// 這里我用了周期是1000us的但是我的定時(shí)器是10us一次的所以我這里取t=100;表示我把周期分成100份 //
// 占空比(q)=高電平(time1)/周期(t);故而time1/100=占空比; //
// 電壓(u)=占空比*最大電壓(Um)故而我的輸出電壓函數(shù)為:U0=Um*q =time1/100*5V(這里我用的是5v電壓=Um) //
// 根據(jù)上述公式可以算出MCU輸出電壓:例如:我要輸出1.5V電壓只要讓time1=30即可,當(dāng)然time0=70(保證頻率不變) //
// 我要輸出3V只要讓time1=60,tim0=40;即可 呵呵呵呵 //
// 大概這也就是數(shù)模轉(zhuǎn)換的原理吧 //
// //
// 2010年10月24日下午與天津第四項(xiàng)目部宿舍 //
//**************************************************************************************************************//
while(1) //主循環(huán)
{
//***********************
middate=0x00;
middate1=0x00;
middate2=0x00;
middate1=HW1; //傳感器信號(hào)采集后處理
middate2=HW2;
CY=0;
middate2=(middate2<<1) ;
middate=(middate1+middate2) ;
// ****************************
switch(middate) //轉(zhuǎn)向關(guān)鍵步函數(shù)
{
case 3:{stop();break; }//停止>>>>>>>>>>>>>>HW1=0=HW2;
case 1:{left();break; }//左轉(zhuǎn)>>>>>>>>>>>>>>HW1=1;HW2=0;
case 2:{right();break; }//右轉(zhuǎn)>>>>>>>>>>>>>>HW1=0;HW2=1;
case 0:{goon();break; }//直行>>>>>>>>>>>>>>HW1=1=HW2;
}
}
}
void Timer0Interrupt(void) interrupt 1 //定時(shí)器中斷函數(shù)生成PWM,接口單元為:time0(PWM1號(hào)低電平時(shí)間),time1(PWM1號(hào)高電平時(shí)間),time_0(PWM2號(hào)低電平時(shí)間),time_1(PWM2號(hào)高電平時(shí)間) ,t(周期)
{ // MCU:P1.2是第一路PWM,P1.5是第二路PWM
if(time0==timeing0)
{
if(time1!=timeing1)
{ //高電平時(shí)間段
TH0 =0xff;
TL0 =0xf7;
EN1=1;
timeing1++;
}
//中斷子函數(shù)(定時(shí)器參量修改)
}
else
if(time0!=timeing0)
{
TH0 =0xff;
TL0 =0xf7;
EN1=0; //低電平時(shí)間段
timeing0++;
}
if(time0==timeing0)
{
if(time1==timeing1)
{
timeing0=0;
timeing1=0;
}
}
//****************M2的************************************************************************************************************************************************************
if(time_0==timeing_0)
{
if(time_1!=timeing_1)
{ //高電平時(shí)間段
TH0 =0xff;
TL0 =0xf7;
EN2=1;
timeing_1++;
}
//中斷子函數(shù)(定時(shí)器參量修改)
}
else
if(time_0!=timeing_0)
{
TH0 =0xff;
TL0 =0xf7;
EN2=0; //低電平時(shí)間段
timeing_0++;
}
if(time_0==timeing_0)
{
if(time_1==timeing_1)
{
timeing_0=0;
timeing_1=0;
}
}
}
復(fù)制代碼
作者:
sdbzwhh
時(shí)間:
2017-1-11 21:04
圖畫的我給滿分
作者:
愛桃子96
時(shí)間:
2017-5-15 10:18
樓主用的是哪些傳感器
作者:
梁光陽
時(shí)間:
2017-5-16 20:44
看了你的圖我還以為你是學(xué)畫畫的
作者:
c.x.d
時(shí)間:
2017-5-16 21:14
學(xué)習(xí) 學(xué)習(xí)
作者:
cd88361417
時(shí)間:
2017-8-15 18:25
學(xué)習(xí) 學(xué)習(xí)
作者:
binyv
時(shí)間:
2018-9-27 23:12
樓主的思路很好,值得參考
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1