❶ 用c語言寫一個單片機控制小車走直線的程序,小車一共3個輪子,一個萬向輪,另兩個是電機驅動的,用51單片
自己看注釋改一下就行 函數都寫好了了 沒用的刪掉就可以了
#include<reg52.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
#define L_M 1
#define R_M 2
uchar temp2,temp1,t,m1,m2,redline;
sbit tr=P2^4; //超聲波
sbit ec=P2^5; //
sbit en=P2^7; //液晶的EN
sbit rs=P2^6; //液晶RS選擇端
//液晶數據口 P0口
sbit Rin_1=P2^0; //尋跡管腳輸入
sbit Rin_2=P2^1;
sbit Lin_2=P2^2;
sbit Lin_1=P2^3;
sbit L_EN=P1^0; //左側電機使能
sbit L_1=P1^1; //左側電機控制 1
sbit L_2=P1^2; //左側電機控制 2
sbit R_1=P1^3; //右側電機控制 1
sbit R_2=P1^4; //右側電機控制 2
sbit R_EN=P1^5; //右側電機使能
void delay(uint z) //延時程序1
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delay1s(uchar t) //1s延時函數
{
uchar a,h,i,j,k;
for(a=t;a>0;a--)
{
for(h=5;h>0;h--)
for(i=4;i>0;i--)
for(j=116;j>0;j--)
for(k=214;k>0;k--);
}
}
void v_cotrol(uchar number,uchar speed)
{
if(speed<100)
{
if(number==1)
m1=abs(speed);
if(number==2)
m2=abs(speed);
}
}
void turnleft()
{
L_1=1; // left fan zhuan //
L_2=0;
R_1=1; // right fanzhuan
R_2=0;
}
void turnright()
{
L_1=0; // left zheng zhuan
L_2=1;
R_1=0; // right fanzhuan
R_2=1;
}
void gostright()
{
L_1=0; // left zheng zhuan
L_2=1;
R_1=1; // right zhengzhuan
R_2=0;
}
void goback()
{
L_1=1; // left zheng zhuan
L_2=0;
R_1=0; // right zhengzhuan
R_2=1;
}
void stop()
{
L_1=1; // stop
L_2=1;
R_1=1; // stop
R_2=1;
}
void timer0_int()
{
TMOD=0X01;
TH0=-100/256;
TL0=-100%256;
EA=1;
ET0=1;
TR0=1;
}
state_int()
{
Rin_1=1;
Rin_1=1;
Lin_1=1;
Lin_1=1;
t=0;
m1=50;
m2=50;
stop();
}
void main()
{
timer0_int();
state_int();
while(1)
{
//避障程序
if((Lin_1==1)&&(Lin_2==1)&&(Rin_1==1)&&(Rin_2==1))
gostright();
if((Lin_1==1)&&(Lin_2==1)&&(((Rin_1==1)&&(Rin_2==0))||((Rin_1==0)&&(Rin_2==1))||((Rin_1==0)&&(Rin_2==0))))
turnleft();
if((Rin_1==1)&&(Rin_2==1)&&(((Lin_1==1)&&(Lin_2==0))||((Lin_1==0)&&(Lin_2==1))||((Lin_1==0)&&(Lin_2==0))))
turnright();
if((((Lin_1==1)&&(Lin_2==0))||((Lin_1==0)&&(Lin_2==1))||((Lin_1==0)&&(Lin_2==0)))&&(((Rin_1==1)&&(Rin_2==0))||((Rin_1==0)&&(Rin_2==1))||((Rin_1==0)&&(Rin_2==0))))
goback();
if((Lin_1==1)&&(Lin_2==1)&&(Rin_1==1)&&(Rin_2==1))
gostright();
if((Lin_1==1)&&(Lin_2==1)&&(((Rin_1==1)&&(Rin_2==0))||((Rin_1==0)&&(Rin_2==1))||((Rin_1==0)&&(Rin_2==0))))
turnleft();
if((Rin_1==1)&&(Rin_2==1)&&(((Lin_1==1)&&(Lin_2==0))||((Lin_1==0)&&(Lin_2==1))||((Lin_1==0)&&(Lin_2==0))))
turnright();
if((((Lin_1==1)&&(Lin_2==0))||((Lin_1==0)&&(Lin_2==1))||((Lin_1==0)&&(Lin_2==0)))&&(((Rin_1==1)&&(Rin_2==0))||((Rin_1==0)&&(Rin_2==1))||((Rin_1==0)&&(Rin_2==0))))
goback();
}
while(1);
}
timer0() interrupt 1
{
TH0=-100/256;
TL0=-100%256;
if(t==0)
{
temp1=m1;
temp2=m2;
}
if(t==temp1)
L_EN=0;
if(t==temp2)
R_EN=0;
t++;
if(t==50)
{
t=0;
L_EN=1;
R_EN=1;
}
}
❷ 我們做51單片機尋跡小車,走直線的時候小車會左右扭,拐彎的時候有時又拐不過(速度慢時可以 )求指教!
走直線的時候小車會左右扭,可能是因為你循跡路線的寬度與你循跡模塊中感測器的寬度不是很適宜,也有可能是你的程序沒處理好(如延時),拐彎的時候有時又拐不過(速度慢時可以 )說明你的程序有待修改,沒見你的實物與程序,具體情況還得具體分析,我說的僅供參考!
❸ 求51單片機可以用的直線插補的c程序
限於篇幅,程序省去 按鍵子程序 延時子程序 液晶初始化及相關程序、字元部分
#include<reg52.h>
#include<intrins.h>
#definemode0x81//方式0,A口、B口輸出,C口高4位輸出,低4位輸入
#include"stdio.h"
#include"string.h"
#include"math.h"
xdataunsignedcharPA_at_0x7f00;
xdataunsignedcharPB_at_0x7f01;
xdataunsignedcharPC_at_0x7f02;
xdataunsignedcharcaas_at_0x7f03;//控制字
sbitP32=P3^2;
sbitP33=P3^3;
sbitP35=P3^5;
#defineucharunsignedchar
#defineuintunsignedint
unsignedcharh,Pos;
unsignedintR,NX,NY;
unsignedcharkey;
codeunsignedcharKeyTable[]={//鍵碼定義
0x0f,0x0b,0x07,0x03,
0x0e,0x0a,0x06,0x02,
0x0d,0x09,0x05,0x01,
0x0c,0x08,0x04,0x00
};
codeunsignedcharLEDMAP[]={//八段管顯示碼
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};
unsignedcharCode_;//字元代碼寄存器
#definePD161//122/2分成左右兩半屏(122x32)
unsignedcharColumn;
unsignedcharPage_;//頁地址寄存器D1,DO:頁地址
unsignedcharCode_;//字元代碼寄存器
unsignedcharCommand;//指令寄存器
unsignedcharLCDData;//數據寄存器
xdataunsignedcharCWADD1_at_0x1cff;//寫指令代碼地址(E1)
xdataunsignedcharDWADD1_at_0x1eff;//寫顯示數據地址(E1)
xdataunsignedcharCRADD1_at_0x1dff;//讀狀態字地址(E1)
xdataunsignedcharDRADD1_at_0x1fff;//讀顯示數據地址(E1)
xdataunsignedcharCWADD2_at_0x3cff;//寫指令代碼地址(E2)
xdataunsignedcharDWADD2_at_0x3eff;//寫顯示數進地址(E2)
xdataunsignedcharCRADD2_at_0x3dff;//讀狀態字地址(E2)
xdataunsignedcharDRADD2_at_0x3fff;//讀顯示數據地址(E2)
//----------------------液晶-----------------
//清屏
//************************中文顯示程序***********************************/
/*************************直線插補***************************8*/
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=50;y>0;y--);
}
voidzhengx()
{
PA=0x00;
delay(10);
PA=0x01;
delay(10);
}
voidfux()
{
PA=0x02;
delay(10);
PA=0x03;
delay(10);
}
voidzhengy()
{
PB=0x00;
delay(10);
PB=0x10;
delay(10);
}
voidfuy()
{
PB=0x20;
delay(10);
PB=0x30;
delay(10);
}
voidxian(intNX,intNY)
{intFM,NXY,XOY,ZF,z;
FM=0;
{if(NX>0)
if(NY>0)
XOY=1;
else
XOY=4;
else
if(NY>0)
XOY=2;
else
XOY=3;}
for(NXY=fabs(NX)+fabs(NY)-1;NXY>=0&&P32!=0&&P33!=0;NXY--)
{{if(NX>0)
if(NY>0)
XOY=1;
else
XOY=4;
else
if(NY>0)
XOY=2;
else
XOY=3;}
for(NXY=fabs(NX)+fabs(NY)-1;NXY>=0;NXY--)
{if(FM>=0)
{if(XOY==1||XOY==4)
{ZF=1;
zhengx();
}
else
{ZF=2;
fux();
}
FM=FM-fabs(NY);
}
else
{if(XOY==1||XOY==2)
{
ZF=3;
zhengy();
}
else
{ZF=4;
fuy();
}
FM=FM+fabs(NX);
}
}
for(z=0;z<200;z++)
{P35=0;
delay(10);
P35=1;
delay(10);
}
}
}
❹ 單片機最多可以擬合多少個點(擬合成直線方程的)
1.單片機擬合的重點不在於多少個點(一個都沒有當然不行,這里是排除極端現象),而在於擬合演算法; 2.目前市面上的單片機有8位,16位,32位等等,價格和運算能力都很不錯,有些還有自己的支持庫,因此,純粹從單片機考慮不是太大的問題; 3.一般的做法是:先採集這些數據(盡可能多),利用模擬軟體如matlab進行演算法模擬,根據這個模擬可以直接的了解到需要擬合該直線的最少數據,根據此數據選擇或者優化演算法,然後根據此演算法選擇適當價格和運算能力的單片機;根據單片機單位時間(即你需要處理的最小周期)採集數據,由此可以確定下來最終的實現演算法 4.一般的方法有:插值法,最小二乘法(用法最為廣泛,實現也容易,多用於計算機),方差逼近法等等
❺ 單片機最多可以擬合多少個點(直線方程)
256個吧,單片機的數據一般(51單片機)都是用8個二進制位表示的,8個二進制位可以構成2^8=256種組合,所以可以擬合256個點。
如果有更高位數的單片機,則可以擬合更多的點,這跟單片機的位數有關的。。
❻ 使用單片機如何檢測直線位移感測器的信號,用到A/D轉換嗎能寫個大體的程序嗎
直線位移感測器 是什麼型號 有驅動程序沒有,時序圖也行 有線的還是無線的 紅外還是藍牙還是射頻脈沖的還是超聲 數字的還是模擬的 要求精度多高
❼ 怎樣用單片機控制步進電動機完成直線運動
使用51單片機加步進電機驅動晶元,如6128,組成步進電機控制電路,再使用齒輪齒條或者絲杠達到運動方式的轉化,就可把電機的旋轉運動變成齒條或絲杠的直線運動。步進電機的單片機控制可在網上搜索,機械部分參考機械原理。