久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
循跡小車程序(C51)
[打印本頁]
作者:
heicad
時間:
2014-10-21 14:55
標題:
循跡小車程序(C51)
啟動鍵為U2P32
停止鍵為U2P33*/
#include <at89x52.h>
#define uchar unsigned char
#define uint unsigned int
void motor_r_z(void);//右邊電動機正轉
void motor_l_z(void);//左邊電動機正轉
void motor_r_f(void);//右邊電動機反轉
void motor_l_f(void);//左邊電動機反轉
void go(uchar,uchar);//小車前進
void stop(void);//小車停止
sbit IN1=P2^5;//L298N的IN1接到P2.5
sbit IN2=P2^4;//L298N的IN2接到P2.4
sbit IN3=P2^1;//L298N的IN3接到P2.1
sbit IN4=P2^2;//L298N的IN4接到P2.2
sbit ENA=P2^0;//L298N的ENA接到P2.0
sbit ENB=P2^3;//L298N的ENB接到P2.2
sbit left_k=P0^5;//小車左轉信號輸入端為P0.5,P0.5為1時說明已經檢測到黑線
sbit right_k=P0^4;//小車右轉信號輸入端為P0.4,P0.4為1時說明已經檢測到黑線
sbit start_k=P3^2;//啟動按鍵為U2P32
sbit stop_k=P3^3;//停止按鍵為U2P33
sbit sound=P2^7;//蜂鳴器接到了P2.7上,P2.7為低電平的時候,蜂鳴器響。
uchar data t_0;//每產生一次T0定時器中斷的時候t_0加1
uchar data motor_r;//motor_r用于存放右邊電機轉速和轉向的數據
uchar data motor_l;//motor_l用于存放左邊電機轉速和轉向的數據
uchar data Speed_Parameters;
//********************************延時程序
void delay_1ms(uint n)
{
uint i,j;
for(j=n;j>0;j--)
for(i=20;i>0;i--);
}
//****************************初始化函數
void ini(void)
{
TMOD=0x01; //T0工作在方式1
TH0=0xff; //裝入T0初值
TL0=0xf6;
TR0=1;//開T0中斷
ET0=1;//T0允許中斷
EA=1;
t_0=0;
P2=0x00;
sound=0;
delay_1ms(100);//蜂鳴器響100ms
sound=1;
}
//********************************蜂鳴器響
void Sound(void)
{
sound=0;
delay_1ms(60);
sound=1;
}
//******************************啟動處理函數
void start(void)
{
uchar a;
aa:while(start_k);//防抖程序
for(a=0;a<50;a++)
{
delay_1ms(1);
while(start_k)
goto aa;
}
Sound();//調用蜂鳴器發音程序
go(0x40,0x40);//直行
}
//*******************************直行函數
void go(uchar left_motor,uchar right_motor)
{
Speed_Parameters=right_motor;//給速度參數賦值
motor_r_z();//調用右邊電機正轉函數
Speed_Parameters=left_motor;
motor_l_z();//調用左邊電機正轉函數
}
//*******************************右邊電動機正轉
void motor_r_z(void)
{
motor_r=0x64+Speed_Parameters;
ENA=1;
}
//********************************左邊電機正轉
void motor_l_z(void)
{
motor_l=0x64-Speed_Parameters;
ENB=1;
}
//*********************************停止函數
void stop(void)
{
ENB=0;
ENA=0;
}
//********************************T0中斷服務程序(PWM產生)
void time0(void) interrupt 1 using 2
{
TR0=0;//停止T0計數
TH0=0xff;//當晶振頻率是12M時,每隔0.01ms中斷一次,200次中斷為PWM信號輸出的周期,
TL0=0xf6;//PWM信號的頻率=1000/(200*0.01ms)=500HZ
++t_0;//產生一次中斷t_0加1
ACC=t_0;//將t_0的值賦值給ACC
CY=0;//清零CY
ACC-=motor_r;//用ACC減去右邊電動機的參數(此參數決定了右邊電機的轉向和速度)
if(CY==1)//判斷CY是否置1,如果為1,說明ACC-motor_r已經為負數,置位了CY
{
IN1=1;//IN1由原來的0變成了1
IN2=0;//IN2由原來的1變成了0
goto PWM_2;
}
IN1=0;//如果CY不等于1,IN1=0,IN2=1
IN2=1;
PWM_2:
ACC=t_0;//重新將t_0的值賦值給ACC
CY=0;//清零CY
ACC-=motor_l;//用ACC減去左邊電動機的參數(此參數決定了左邊電機的轉向和速度)
if(CY==1)//判斷CY是否置1,如果為1,說明ACC-motor_l已經為負數,置位了CY
{
IN3=1;//IN3由原來的0變成了1
IN4=0;//IN4由原來的1變成了0
goto HIGHT;
}
IN3=0;//如果CY不等于1,IN3=0,IN4=1
IN4=1;
HIGHT:
//ACC=t_0; //重新將t_0的值賦值給ACC
if(t_0!=0xc8)//判斷t_0的值是否不等于200
goto EXIT;//如果不等于200,程序指針指向EXIT執行程序
ACC=0;//如果t_0的值等于200,清零ACC和t_0
t_0=ACC;
EXIT:
TR0=1;//打開TO計數
}
//********************************啟動或關閉小車
void all_on(void)
{
if((left_k==1)&&(right_k==1))
{
stop();
start();//跳到啟動處理函數,執行程序
while((left_k==1)&&(right_k==1));
}
}
//**********************************主函數
void main(void)
{
uchar a;
ini();//調用初始化函數
start();//調用啟動處理函數
////判斷左傳感器狀態////
while(1)
{
aa:
all_on();
while(!left_k)//判斷左邊傳感器的值是否為0
goto bb;//如果是0,程序指針指向標號bb,執行程序
P1_0=0;//如果是1,點亮P1.0上連接的發光二極管
// Sound();
while(left_k)//如果left_k的值一直為1,不斷的循環執行 go(0x00,0x64);小車左轉 直到left_k的值為0為止。
{
go(0x00,0x45);//0x00,0x64分別代表左右電動機的轉速,兩個值的取值為0x00到0x64之間,0x00最慢。0x64最快
all_on();
} //0x00,0x64這兩個值不一樣代表兩個電機向前轉的速度不同,小車將拐彎
go(0x40,0x40);//執行到這句說明left_k已經為1,說明左傳感器已經離開了黑線。小車直線前進
//0x40,0x40這連個值同表示小車執行這個函數時將向前走,用戶可以自任意修改這些數值,達到小車走黑線
//最穩定的效果,建議不要取得太大(十六進制0x64是最大,其實也就是十進制數的100),也就是速度等級
//為0到100個等級。
P1_0=1;//關閉LED指示燈
////判斷右傳感器狀態////
bb:
all_on();
while(!right_k)//判斷右傳感器的值是否為0
goto cc;//如果是0,程序指針指向標號cc,執行程序
P1_1=0;//如果是1,點亮P1.1上連接的發光二極管
// Sound();
while(right_k)//如果right_k的值一直為1,不斷的循環執行go(0x64,0x0),小車右轉,直到right_k的值為0為止
{
go(0x45,0x00);
all_on();
}
go(0x40,0x40);//執行到這句說明right_k已經為1,說明左傳感器已經離開了黑線。小車直線前進
P1_1=1;//關閉LED指示燈
///判斷是否按下停止按鈕//////
cc:
while(stop_k)//判斷停止鍵是否按下,按下的時候stop_k為1
goto aa;////如果是1,程序指針指向標號aa,執行程序
for(a=0;a<20;a++)//如果是0,進入防抖程序
{
delay_1ms(1);
while(stop_k)//判斷20次stop_k是否為1
goto cc;//如果是1,程序指針指向標號cc,執行程序
}
stop();//20次判斷之后stop_k都是0,立馬停止兩個電動機
start();//跳到啟動處理函數,執行程序。
}
}
復制代碼
作者:
yyxtj
時間:
2015-4-18 16:00
下載看看,學習一下,謝謝!
作者:
路人甲111
時間:
2016-3-26 15:59
下載看看 ,謝謝樓主
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
亚洲大片在线观看
|
日韩av在线免费播放
|
日日爽夜夜爽
|
日韩一区在线视频
|
午夜激情网站
|
亚洲天堂影院
|
久久免费视频观看
|
91看片网
|
国产成人精品免费视频
|
国产精品毛片av
|
视频在线观看一区
|
亚洲青涩
|
欧美成人精品欧美一级私黄
|
欧美一级片在线观看
|
久草综合网
|
在线观看免费黄色
|
国产黄色大片
|
91亚洲国产成人精品性色
|
久久高清免费视频
|
新av在线
|
91亚洲视频
|
成人三级在线观看
|
激情综
|
精品久久一区二区
|
日日av
|
久草综合在线
|
亚洲 欧美 另类 综合 偷拍
|
特黄老太婆aa毛毛片
|
亚洲免费成人
|
久久久久免费
|
国产精品二区一区二区aⅴ污介绍
|
欧美一区二区三区四区五区
|
精品欧美一区二区精品久久
|
亚洲男人的天堂在线观看
|
日韩中文字幕一区二区三区
|
日日爽夜夜爽
|
欧美成人激情
|
国产精品自拍小视频
|
精品国产欧美
|
日韩av免费在线观看
|
日韩不卡在线
|