欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
wifi小車的單片機源碼
[打印本頁]
作者:
反清
時間:
2017-10-21 11:18
標題:
wifi小車的單片機源碼
小車源碼,親測可用
所有資料51hei提供下載:
wifi車體控制 最初版.zip
(40.52 KB, 下載次數: 10)
2017-10-21 11:17 上傳
點擊文件名下載附件
wifi小車源碼
下載積分: 黑幣 -5
單片機源程序如下:
#include<reg52.h>
#include<math.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
P0M1=0X00;
P0M0=0XFF;//設置P0 為強推挽輸出
uchar Buffer =0; //從串口接收的數據
uint URTAReceivedCount=0,n=1;
uchar data Tempdatatable[5],CommandDatatable[5];//數據包
uchar serVal[2];
uint pwm[]={1120,1190,1382,1382,1382,1382,1382,500}; //初始90度,(實際是1382.4,取整得1382)
uchar pwm_flag=0;
uint code ms0_5Con=461; //0.5ms計數 (實際是460.8,取整得461)461
uint code ms2_5Con=2304; //2.5ms計數2304
bit key_stime_ok;
sbit StatusLight=P2^0; //狀態燈
sbit MainLight=P2^1; //主大燈
sbit servo0=P0^0; //舵機控制
sbit servo1=P0^1;
sbit servo2=P0^2;
sbit servo3=P0^3;
sbit servo4=P0^4;
sbit servo5=P0^5;
sbit servo6=P0^6;
sbit servo7=P0^7;
/*sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;*/
/*********************************************************/
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_4=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;
/********************************************************************
* 名稱 : Delay_1ms()
* 功能 : 延時子程序,延時時間為 1ms * x
* 輸入 : x (延時一毫秒的個數)
* 輸出 : 無
***********************************************************************/
void Delay_1ms(uint i)//1ms延時
{
uint x,j;//uchar x,j;
for(j=0;j<i;j++)
for(x=0;x<=148;x++);
}
void TurnOnStatusLight()
{
StatusLight=0;
}
/********************************************************************
* 名稱 : Send_Data()
* 功能 : 向上位機傳送字符
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void Send_Data(uchar type,uchar cmd,uchar dat)
{
uchar data Buffer[5];//構建數據包
uchar *p;
uint Send_Count=0;
p = Buffer;
Buffer[0]=0XFF;
Buffer[1]=type;
Buffer[2]=cmd;
Buffer[3]=dat;
Buffer[4]=0XFF;
while(1)
{
if(*p==0XFF)
{
Send_Count++; //0XFF標志統計位
}
SBUF = *p; //發送
while(!TI) //如果發送完畢,硬件會置位TI,等待發送完畢
{
_nop_();
}
p++;
TI = 0;
if(Send_Count == 2) //當統計到兩次出現0XFF,則認為一個數據包發送完畢,跳出循環
{
TI = 0;
break;
}
}
}
/********************************************************************
協議規定:
包頭 類型位 數據位 數據位 結束位
0XFF 0X** OX** 0X** 0XFF
各命令說明:
類型位 數據位 數據位 功能
0X00 0X02 0X00 前進
0X00 0X01 0X00 后退
0X00 0X03 0X00 左轉
0X00 0X04 0X00 右轉
0X00 0X00 0X00 停止
0X01 0X01 角度 舵機1
0X01 0X02 . 舵機2
0X01 0X01 . 舵機3
0X01 0X02 . 舵機4
0X01 0X01 . 舵機5
0X01 0X02 . 舵機6
0X01 0X01 . 舵機7
0X01 0X02 數據 舵機8
0X02 0X01 車燈亮
0X02 0X02 車燈滅
0X03 雷達數據 發送雷達數據
***********************************************************************/
/********************************************************************
* 名稱 : Com_Int()
* 功能 : 串口中斷子函數
***********************************************************************/
void Com_Int(void) interrupt 4
{
uchar temp;
ES=0; //關串口中斷
RI=0; //軟件清除接收中斷
temp=SBUF;
if(temp==0XFF && URTAReceivedCount<3)
{
Tempdatatable[0]==0XFF; //包頭
URTAReceivedCount++;
}
else
{
Tempdatatable[n]=temp;
n++;
if(URTAReceivedCount==0&&n==2)
n=1;
}
if(URTAReceivedCount==2)//包尾
{
Tempdatatable[0]=0XFF;
Tempdatatable[4]=0XFF;
n=1;
URTAReceivedCount=0; //組包完畢
temp="";
// Send_Data(Tempdatatable[1],Tempdatatable[2],Tempdatatable[3]); //發送組成的數據包回去
}
CommandDatatable[0]=Tempdatatable[0];
CommandDatatable[1]=Tempdatatable[1];
CommandDatatable[2]=Tempdatatable[2];
CommandDatatable[3]=Tempdatatable[3];
CommandDatatable[4]=Tempdatatable[4];
ES=1;//開串口中斷
}
/********************************************************************
* 名稱 : Com_Init()
* 功能 : 串口初始化,晶振11.0592,波特率9600,使能了串口中斷
***********************************************************************/
void Com_Init(void)
{
TMOD=0x21;
PCON=0x00;
SCON=0x50;
TH1=0xFd; //設置波特率 9600
TL1=0xFd;
TR1=1; //啟動定時器1
ES= 1; //開串口中斷
EA= 1; //開總中斷
IT0=0;
EX0=1;
}
/***************************************************************/
void Moto_TurnLeft()
{
P1_0=0;
P1_1=1;
P1_2=0;
P1_3=1;
P1_4=1;
P1_5=0;
P1_6=1;
P1_7=0;
}
void Moto_TurnRight() //右轉函數
{ P1_0=1;
P1_1=0;
P1_2=1;
P1_3=0;
P1_4=1;
P1_5=0;
P1_6=1;
P1_7=0;
}
void Moto_Stop(void)
{
P1_0=1;
P1_1=1;
P1_2=1;
P1_3=1;
P1_4=1;
P1_5=1;
P1_6=1;
P1_7=1;
}
void Moto_Forward()
{
P1_0=1;
P1_1=0;
P1_2=0;
P1_3=1;
P1_4=0;
P1_5=1;
P1_6=1;
P1_7=0;
}
void Moto_Backward()
{
P1_0=0;
P1_1=1;
P1_2=1;
P1_3=0;
P1_4=1;
P1_5=0;
P1_6=0;
P1_7=1;
}
/***********************************************************************/
void Timer0Init()
{
/*0度=0.5ms, 45度=1ms, 90度=1.5ms, 135度=2ms, 180度=2.5ms
/.5 ms初始值 F700, (12n/11059200=2.5/1000, n=2304, X=65536-2304=63232 > F700)*/
TMOD |= 0x01; //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響
TH0=-ms2_5Con>>8; //給定初值,17ms中斷
TL0=-ms2_5Con;
EA=1; //總中斷打開
ET0=1; //定時器0中斷打開
TR0=1; //定時器0開關打開
}
/********************************************************************
* 功能 : 舵機PWM中斷, //舵機控制函數 周期為20ms 一個循環20MS = 8*2.5ms
***********************************************************************/
void SteeringGear() interrupt 1
{
switch(pwm_flag)
{
case 1: servo0=1; TH0=-pwm[0]>>8; TL0=-pwm[0]; break;
case 2: servo0=0; TH0=-(ms2_5Con-pwm[0])>>8; TL0=-(ms2_5Con-pwm[0]); break;
case 3: servo1=1; TH0=-pwm[1]>>8; TL0=-pwm[1]; break;
case 4: servo1=0; TH0=-(ms2_5Con-pwm[1])>>8; TL0=-(ms2_5Con-pwm[1]); break;
case 5: servo2=1; TH0=-pwm[2]>>8; TL0=-pwm[2]; break;
case 6: servo2=0; TH0=-(ms2_5Con-pwm[2])>>8; TL0=-(ms2_5Con-pwm[2]); break;
case 7: servo3=1; TH0=-pwm[3]>>8; TL0=-pwm[3]; break;
case 8: servo3=0; TH0=-(ms2_5Con-pwm[3])>>8; TL0=-(ms2_5Con-pwm[3]); break;
case 9: servo4=1; TH0=-pwm[4]>>8; TL0=-pwm[4]; break;
case 10: servo4=0; TH0=-(ms2_5Con-pwm[4])>>8; TL0=-(ms2_5Con-pwm[4]); break;
case 11: servo5=1; TH0=-pwm[5]>>8; TL0=-pwm[5]; break;
case 12: servo5=0; TH0=-(ms2_5Con-pwm[5])>>8; TL0=-(ms2_5Con-pwm[5]); break;
case 13: servo6=1;TH0=-pwm[6]>>8; TL0=-pwm[6]; break;
case 14: servo6=0;TH0=-(ms2_5Con-pwm[6])>>8; TL0=-(ms2_5Con-pwm[6]); break;
case 15: servo7=1;TH0=-pwm[7]>>8; TL0=-pwm[7]; break;
case 16: servo7=0;TH0=-(ms2_5Con-pwm[7])>>8; TL0=-(ms2_5Con-pwm[7]); break;
default: TH0=0xff; TL0=0x80; pwm_flag=0;
}
pwm_flag++;
}
void SetSteeringGear(uchar i, uchar val)
{
uint a = (val+46)*10;
if(a<ms0_5Con)
a=ms0_5Con;
if(a>ms2_5Con)
a=ms2_5Con;
pwm[i]=a;
CommandDatatable[2]=0xff; //清除緩存
}
/********************************************************************
* 功能 : 串口中斷接收數據
***********************************************************************/
/*********************************************************************************
** 函數功能 : 主函數
*********************************************************************************/
void main()
{
MainLight=0;
Delay_1ms(6000);
Com_Init();//串口初始化
Timer0Init();//舵機PWM中斷初始化
while(1)
{
if(CommandDatatable[0]==0XFF && CommandDatatable[4]==0XFF)
{
switch (CommandDatatable[1]) //根據鍵值不同,執行不同的內容
{
case 0X00: //類型位0X00,表明是控制數據包,進入控制數據case
switch(CommandDatatable[2]) //根據數據位的值來進行選擇執行不同的動作
{
case 0X00:Moto_Stop();break;
case 0X02:Moto_Forward();break;
case 0X01:Moto_Backward();break;
case 0X03:Moto_TurnLeft();break;
case 0X04:Moto_TurnRight();break;
/*case 0X05:Moto_R_F();break;
case 0X06:Moto_L_F();break;
case 0X07:Moto_R_B();break;
case 0X08:M0to_L_B();break;
default : break;*/
}
break;
case 0X01: //類型位0X01,表明是舵機數據包,進入舵機case
switch(CommandDatatable[2])
{
case 0x01:SetSteeringGear(0,CommandDatatable[3]);break;
case 0x02:SetSteeringGear(0,CommandDatatable[3]);break;
case 0x03:SetSteeringGear(2,CommandDatatable[3]);break;
case 0x04:SetSteeringGear(3,CommandDatatable[3]);break;
case 0x05:SetSteeringGear(4,CommandDatatable[3]);break;
case 0x06:SetSteeringGear(5,CommandDatatable[3]);break;
case 0x07:SetSteeringGear(6,CommandDatatable[3]);break;
case 0x08:SetSteeringGear(7,CommandDatatable[3]);break;
default : break;
}
break;
case 0X02: //類型位0X02,表明是大燈數據包,進入大燈case
switch(CommandDatatable[2])
{
case 0X01:MainLight=1;break;
case 0X02:MainLight=0;break;
default : break;
}
break;
default : break;
}
}
}
}
復制代碼
作者:
guangxin
時間:
2018-4-12 20:39
樓主你這個真可以用嗎我編譯后怎么還有錯誤
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1