|
通過設(shè)計(jì)進(jìn)一步掌握51單片機(jī)的應(yīng)用,特別是在嵌入式系統(tǒng)中的應(yīng)用。進(jìn)一步學(xué)習(xí)51單片機(jī)在系統(tǒng)中的控制功能,能夠合理設(shè)計(jì)單片機(jī)的外圍電路,并使之與單片機(jī)構(gòu)成整個(gè)系統(tǒng)。
制作方案
該小車采用藍(lán)牙模塊對(duì)單片機(jī)進(jìn)行控制,單片機(jī)根據(jù)采集到的信號(hào)的不同狀態(tài)判斷小車當(dāng)前狀態(tài),通過電機(jī)驅(qū)動(dòng)芯片L298N發(fā)出控制命令,控制電機(jī)的工作狀態(tài)以實(shí)現(xiàn)對(duì)小車姿態(tài)片機(jī)的外圍電路,并使之與單片機(jī)構(gòu)成整個(gè)系統(tǒng)的控制。本次設(shè)計(jì)的藍(lán)牙小車可實(shí)現(xiàn)9種狀態(tài):前進(jìn)、后退、左轉(zhuǎn)、右轉(zhuǎn)、加速、減速、左漂、右漂、停止。設(shè)計(jì)構(gòu)思結(jié)構(gòu)如圖下所示。
0.png (6.77 KB, 下載次數(shù): 69)
下載附件
2019-9-8 04:01 上傳
51hei圖片20190907105837.jpg (106.33 KB, 下載次數(shù): 41)
下載附件
2019-9-7 10:58 上傳
單片機(jī)源程序如下:
/*****************************************************/
/********版權(quán)所有:電子科技協(xié)會(huì)--嵐 **********/
/********** 藍(lán)牙遙控變速小車 ************************/
// 接口連接:
// 電機(jī)接口(4電機(jī)兩兩相連 并為兩組)
// P0.2和P0.3-----右電機(jī)
// P0.0和P0.1-----左電機(jī)
// P0.4-----------通道使能A
// P0.5-----------通道使能B
/*****************************************************/
#include <reg52.h> //調(diào)用reg52頭文件
//宏定義
#define uchar unsigned char /*宏定義將unsigned char 用uchar代替,表示無符號(hào)字節(jié)型,char類型變量的大小通常為1個(gè)字節(jié)*/
#define uint unsigned int /*宏定義將unsigned int用uint代替,表示無符號(hào)整型,int類型變量的大小通常為4個(gè)字節(jié)*/
/////////////////////////////////////
uchar n='0',num0=0,num1=0; /*給n,num0,num1賦予初始值0*/
char zuo_pwm = 40,you_pwm = 40; /*使單片機(jī)的定時(shí)器功能來產(chǎn)生穩(wěn)定的PWM(40Hz)脈沖波*/
/*定義P0.1,2,3,4口為控制驅(qū)動(dòng)信號(hào)的I/O口*/
sbit zuo1=P0^0;
sbit zuo2=P0^1;
sbit you1=P0^2;
sbit you2=P0^3;
//定義P0.4,5口為通道使能A,B分別控制左右各兩輪的速度
sbit ENA=P0^4;
sbit ENB=P0^5;
sbit d1=P1^0;
sbit d2=P1^1;
sbit d3=P1^2;
sbit d4=P1^3;
sbit x1=P1^7;
sbit dd=P1^6;
/* 函數(shù)功能:設(shè)置串口*/
void init() //單片機(jī)串口初始化函數(shù)
{
d1=1;d2=1;d3=1;d4=1;x1=0;dd=1;
TMOD=0x21; //定時(shí)器1工作模式
SCON=0x50;
//設(shè)置串口方式1且允許串口接收。
TMOD &= 0xF0; //設(shè)置定時(shí)器模式
TMOD |= 0x01; //設(shè)置定時(shí)器模式
TL0 = 0x91; //設(shè)置定時(shí)初值
TH0 = 0xFF; //設(shè)置定時(shí)初值
TH1=0xfd; //設(shè)置初值為0xfd,波特率是9600bps
TL1=0xfd;
EA=1; //打開總中斷
ET0=1; //打開定時(shí)器0中斷允許
TR1=1; //定時(shí)器1開始計(jì)時(shí)
TR0=1; //定時(shí)器0開始計(jì)時(shí)
ES=1; //打開接收中斷
}
/*********小車狀態(tài)函數(shù)**********/
/********************************************************************
* 名稱 : qianjin()
* 功能 : 左右電機(jī)啟動(dòng),都是前進(jìn),整車表現(xiàn)為前進(jìn)。
***********************************************************************/
void qian ()
{
zuo_pwm=20; //左輪調(diào)速為全速的50%
you_pwm=20; //右輪調(diào)速為全速的50%
zuo1=1;
zuo2=0;
you1=1;
you2=0;
}
/********************************************************************
* 名稱 :jiansu ()
* 功能 : 左右電機(jī)啟動(dòng),都是前進(jìn),整車表現(xiàn)為低速前進(jìn)。
***********************************************************************/
void jiansu ()
{
zuo_pwm=10; //左輪調(diào)速為全速的20%
you_pwm=10; //左輪調(diào)速為全速的20%
zuo1=1;
zuo2=0;
you1=1;
you2=0;
}
/********************************************************************
* 名稱 :jiasu ()
* 功能 : 左右電機(jī)啟動(dòng),都是前進(jìn),整車表現(xiàn)為全速前進(jìn)。
***********************************************************************/
void jiasu ()
{
zuo_pwm=40;//左輪調(diào)速為全速的100%
you_pwm=40;//左輪調(diào)速為全速的100%
zuo1=1;
zuo2=0;
you1=1;
you2=0;
}
/********************************************************************
* 名稱 :hou ()
* 功能 : 左右電機(jī)啟動(dòng),都是后退,整車表現(xiàn)為后退。
***********************************************************************/
void hou ()
{
zuo_pwm=30;//左輪調(diào)速為全速的75%
you_pwm=30;//左輪調(diào)速為全速的75%
zuo1=0;
zuo2=1;
you1=0;
you2=1;
}
/********************************************************************
* 名稱 :zuozhuan()
* 功能 : 左右電機(jī)啟動(dòng),左輪后退,右輪前進(jìn),整車表現(xiàn)為低速左轉(zhuǎn)。
***********************************************************************/
void zuozhuan()
{
zuo_pwm = 13;//左輪調(diào)速為全速的20%
you_pwm = 13;//左輪調(diào)速為全速的32.5%
zuo1=0;
zuo2=1;
you1=1;
you2=0;
}
/********************************************************************
* 名稱 :youzhuan()
* 功能 : 左右電機(jī)啟動(dòng),左輪前進(jìn),右輪后退,整車表現(xiàn)為低速右轉(zhuǎn)。
***********************************************************************/
void youzhuan()
{
zuo_pwm = 13;//左輪調(diào)速為全速的32.5%
you_pwm = 13;//右輪調(diào)速為全速的20%
zuo1=1;
zuo2=0;
you1=0;
you2=1;
}
/********************************************************************
* 名稱 :youpiao()
* 功能 : 只有右電機(jī)啟動(dòng),右輪后退,左輪不轉(zhuǎn),整車表現(xiàn)為右漂(由于速度慢表現(xiàn)不明顯)。
***********************************************************************/
void youpiao()
{
zuo_pwm=35;//左輪調(diào)速為全速的87.5%
you_pwm=35;//左輪調(diào)速為全速的87.5%
zuo1=0;
zuo2=0;
you1=0;
you2=1;
}
/********************************************************************
* 名稱 :zuopiao()
* 功能 : 只有左電機(jī)啟動(dòng),右輪不轉(zhuǎn),左輪后退,整車表現(xiàn)為左漂(由于速度慢表現(xiàn)不明顯)。
***********************************************************************/
void zuopiao()
{
zuo_pwm=35; //左輪調(diào)速為全速的87.5%
you_pwm=35; //左輪調(diào)速為全速的87.5%
zuo1=0;
zuo2=1;
you1=0;
you2=0;
}
/********************************************************************
* 名稱 :stop ()
* 功能 : 左右電機(jī)都不啟動(dòng),左右輪都不轉(zhuǎn),整車表現(xiàn)為停止。
***********************************************************************/
void stop ()
{
zuo1=0;
zuo2=0;
you1=0;
you2=0;
}
/*主函數(shù)*/
void main ()
{
init (); //初始化
while (1) //循環(huán)函數(shù)
{
switch (n) //藍(lán)牙控制,switch(表達(dá)式),case(常量表達(dá)式 )
{
case '2':qian ();d1=0;d2=0;d3=1;d4=1; break;//接收手機(jī)串口發(fā)送的指令2 執(zhí)行前進(jìn)函數(shù) 控制小車前進(jìn) 執(zhí)行后退出switch
case '3':jiansu ();d1=0;d2=0;d3=0;d4=0; break;//接收手機(jī)串口發(fā)送的指令3 執(zhí)行減速函數(shù) 控制小車低速 執(zhí)行后退出switch
case '4':jiasu ();d1=0;d2=0;d3=1;d4=1; break;//接收手機(jī)串口發(fā)送的指令4 執(zhí)行加速函數(shù) 控制小車全速 執(zhí)行后退出switch
case '5':hou ();d1=1;d2=1;d3=0;d4=0; break;//接收手機(jī)串口發(fā)送的指令5 執(zhí)行后退函數(shù) 控制小車后退 執(zhí)行后退出switch
case '6':zuozhuan ();d1=1;d2=0;d3=1;d4=0;break;//接收手機(jī)串口發(fā)送的指令6 執(zhí)行左轉(zhuǎn)函數(shù) 控制小車左轉(zhuǎn) 執(zhí)行后退出switch
case '7':youzhuan ();d1=0;d2=1;d3=0;d4=1;break;//接收手機(jī)串口發(fā)送的指令7 執(zhí)行右轉(zhuǎn)函數(shù) 控制小車右轉(zhuǎn) 執(zhí)行后退出switch
case '8':zuopiao();d1=0;d2=0;d3=0;d4=0; break;//接收手機(jī)串口發(fā)送的指令8 執(zhí)行左漂函數(shù) 控制小車左漂 執(zhí)行后退出switch
case '9':youpiao();d1=0;d2=0;d3=0;d4=0; break;//接收手機(jī)串口發(fā)送的指令9 執(zhí)行右漂函數(shù) 控制小車右漂 執(zhí)行后退出switch
case '0':stop();d1=0;d2=0;d3=0;d4=0;x1=0;break;//接收手機(jī)串口發(fā)送的指令0 執(zhí)行停止函數(shù) 控制小車停止 執(zhí)行后退出switch
case '1':x1=1;d1=1;d2=1;d3=0;d4=0; break;
case 'A':x1=0;d1=1;d2=1;d3=1;d4=1; break;
case 'B':dd=0;d1=0;d2=0;d3=0;d4=0; break;
case 'C':dd=1;d1=1;d2=1;d3=1;d4=1; break;
default:break; //未接收到指令直接退出switch
}
}
}
/* 函數(shù)功能:設(shè)置串口*/
void UART_SER()interrupt 4 //串行口中斷函數(shù)
{
if (RI)//判斷是接收中斷產(chǎn)生
{
RI=0; //讀標(biāo)志位清零
n=SBUF;//讀入緩沖區(qū)的值
TI=1; //TI=1時(shí),執(zhí)行下面的程序
SBUF=n;//將內(nèi)容返回到手機(jī)端,可在手機(jī)查看發(fā)送的內(nèi)容
}
if (TI) //如果是發(fā)送標(biāo)志位,寫標(biāo)志位清零
TI=0;
}
//定時(shí)器0中斷函數(shù)
void Timer1Interrupt(void) interrupt 1 //指明是定時(shí)器中斷0
{
TL0 = 0x91; //設(shè)置定時(shí)初值
TH0 = 0xFF; //設(shè)置定時(shí)初值
num0++; //PWM調(diào)占空比
num1++;
if(num0 <= zuo_pwm) //判num0是否小于等于zuo_pwm,
{ ENA=1; } //若是通道使能A打開
else ENA = 0; //若否通道使能B關(guān)閉
if(num0 == 40) //判斷num0是否達(dá)到40
{
ENA = ~ENA; //若是通道使能A狀態(tài)取反
num0 = 0; //將num0的值歸為0
}
if(num1 <= you_pwm) //判num1是否小于等于you_pwm,
{
ENB = 1; //若是通道使能B打開
}
else ENB = 0; //若否通道使能B關(guān)閉
if(num1 == 40) //判斷num1是否達(dá)到40
{
ENB = ~ENB; //若是通道使能B狀態(tài)取反
num1 = 0; //將num1的值歸為0
}
}
完整的Word格式文檔51黑下載地址:
藍(lán)牙遙控小車.docx
(1.16 MB, 下載次數(shù): 42)
2019-9-7 10:59 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|