用AT89S52 wifi控制 L298N驱动四个马达 加一个可以转动的SG90 9G舵机舵机 的程序

用AT89S52 wifi控制 L298N驱动四个马达 加一个可以转动的SG90 9G舵机舵机 的程序,第1张

#include<reg52.h>

#include<intrins.h>

#define uchar unsigned char

#define uint unsigned int

sbit P3_2=P3^2 //保留

sbit P3_4=P3^4 //led控制

sbit P3_6=P3^6 //舵机控制

sbit P3_7=P3^7

sbit P2_0=P2^0 //电机速度控制 (没用)

sbit P2_1=P2^1

uchar io1=20,io2=20,sdd1=1,sdd2=1 //舵机及电机初始状态变量

uchar temp[1],cmd1[4],cmd2[4],cmd3[4],cmd4[4],cmd5[4] //存放WIFI串口发下来的数据

uchar IRCOM[7]

void chaoshengbo_conv(void)

/********************************************************************

* 名称 : Delay_1ms()

* 功能 : 延时子程序,延时时间为 1ms * x

* 输入 : x (延时一毫秒的个数)

* 输出 : 无

***********************************************************************/

void Delay_1ms(uint i)//1ms延时

{

uint x,j

for(j=0j<ij++)

for(x=0x<=300x++)

}

void delay_ms(uint z)//延时函数

{

uint x,y

for(x=2000x>0x--)

for(y=zy>0y--)

}

void delay1_us(uint z)//延时函数

{

uint x,y

for(x=200x>0x--)

for(y=zy>0y--)

}

void forward(void)

{

P1=0xaa

}

void right(void)//右转

{

P1=0xa5

}

void left(void)//左右

{

P1=0x5a

}

void back(void)//后退

{

P1=0x55

}

void stop(void)//停止

{

P1=0xff

}

/********************************************************************

* 名称 : Com_Int()

* 功能 : 串口中断子函数

* 输入 : 无

* 输出 : 无

***********************************************************************/

uchar cont=0

void UART() interrupt 4//串口

{

RI=0

temp[cont]=SBUF

if(SBUF!=0xff)

{

if(temp[0]==0x01)

{

cmd1[cont]= temp[cont]

}

else if(temp[0]==0x02)

{

cmd2[cont]= temp[cont]

}

else if(temp[0]==0x03)

{

cmd3[cont]= temp[cont]

}

else if(temp[0]==0x04)

{

cmd4[cont]= temp[cont]

}

else if(temp[0]==0x05)

{

cmd5[cont]= temp[cont]

}

cont++

}

else

{

cont=0

}

}

/********************************************************************

* 名称 : Com_Init()

* 功能 : 串口初始化,晶振11.0592,波特率9600,使能了串口中断

* 输入 : 无

* 输出 : 无

***********************************************************************/

void Com_Init(void)

{

TMOD = 0x21

PCON = 0x00

SCON = 0x50

TH1 = 0xFa //22.0592晶振设置波特率 9600

TL1 = 0xFa

TR1 = 1 //启动定时器1

RCAP2H=0xff

RCAP2L=0x54

TR2=1

ET2=1

EA=1 //开总中断

// EX1=1 //外部中断1 允许

// IT1=1 //中断由下降沿 触发

PCON=0

IP=0X10 //中断优先顺序为PX1、PS

ES = 1 //开串口中断

EA = 1 //开总中断

cmd5[2]=15 //舵机初始位置

}

uchar t1=0,t2=0

void timer2() interrupt 5 //舵机频率50hz 100us一次

{

RCAP2H=0xff

RCAP2L=0x54

TF2=0

t1++

t2++

if(t1==io1) //io 为串口接收到的速度数据十进制 从10到30

{

P3_6=0 //舵机控制端1

}

else if(t1==200)

{

P3_6=1

t1=0

}

if(t2==io2) //io 为串口接收到的速度数据十进制 从10到30

{

P3_7=0 //舵机控制端(2)

}

else if(t2==200)

{

P3_7=1

t2=0

}

}

uchar sd1=0,sd2=0

void timer0() interrupt 1 //电机频率100HZ

{

TH0=0xfe

TL0=0x0b

sd1++

sd2++

if(sd1==sdd1) //sdd 为串口接收到的速度数据十进制 从0到30

{

P2_0=0

}

else if(sd1==31)

{

P2_0=1

sd1=0

}

if(sd2==sdd2) //sdd 为串口接收到的速度数据十进制 从0到30

{

P2_1=0

}

else if(sd2==31)

{

P2_1=1

sd2=0

}

}

/********************************************************************

* 名称 : Main()

* 功能 : 主函数

* 输入 : 无

* 输出 : 无

***********************************************************************/

void main()

{

Delay_1ms(100)

P1=0xff

P2=0xff

P3=0xff

Com_Init()

while(1) // 为WIFI *** 控

{

if(cmd1[1]==0x01)

{

forward()

}

else if(cmd1[1]==0x02)

{

left()

}

else if(cmd1[1]==0x03)

{

right()

}

else if(cmd1[1]==0x04)

{

back()

}

else if(cmd1[1]==0x00)

{

stop()

}

if(cmd3[1]==0x01)//cmd3[1]==0x01 为WIFI *** 控灯

{

P3_4=1// 灯亮

}

else if(cmd3[1]==0xfe)

{

P3_4=0// 灯灭

}

else if(cmd3[1]==0x02)//cmd3[1]==0x02 为WIFI *** 控蜂鸣器

{

P3_5=0// 蜂鸣器鸣叫

}

else if(cmd3[1]==0x03)//cmd3[1]==0x02 为WIFI *** 控蜂鸣器

{

P3_5=1// 蜂鸣器停止

}

if(temp[0]==0x04) //cmd3[1]==0x01 为WIFI *** 控电机速度

{

if(cmd4[1]==0x01)//控制小车行驶速度

{

sdd1=cmd4[2]//cmd4[1] 为串口接收到的速度数据十进制 从10到30

}

else if(cmd4[1]==0x02)

{

sdd2=cmd4[2]//cmd4[1] 为串口接收到的速度数据十进制 从10到30

}

}

if(temp[0]==0x05)

{

if(cmd5[1]==0x01)//cmd5[0]==0x05 为WIFI *** 控摄像头舵机

{

io1=cmd5[2]//cmd5[2] 为串口接收到的速度数据十进制 从10到30

}

else if(cmd5[1]==0x02)

{

io2=cmd5[2]//cmd5[2] 为串口接收到的速度数据十进制 从10到30

}

}

Delay_1ms(1)

}

}

舵机的位置要看你的占空比是多少,你这里没有说清楚你是否由给边占空比后转动了九十度,那么你应该是弄出来了才是,吧占空比调回他会回到“复位时”的位置才是。

如果是你手动拨到“0”,然后单片机开启舵机转动九十度要回转那你就调整占空比就好了。

(我这有个初学的程序,可以给你参考,需要的话)

常见故障形成的原因及其检修办法。

1.行驶跑偏

⑴现象:汽车行驶中,转向盘位于中间位置不动,汽车却自动地向某一边行驶。

⑵原因:

左、右轮胎磨损不等或气压不相同。两前轮定位参数不一致,后轮定位参数不准确(形成推力角)。左、右转向横拉杆弯曲、变形,铰链处间隙过大。两前悬架螺旋d簧d力不等或变形过大。轮毂轴承磨损后出现间隙过大。车架变形。前轴或后轴变形。轴向机调整不当。单侧制动拖滞。

⑶排除方法:根据故障原因逐一进行排除。

2.转向沉重

⑴现象左右转动转向盘时,感到非常吃力。

⑵原因:前轮定位不正确。轮胎气压不足。转向传动机构变形、磨损,球头销过紧。转向器内缺油,转向器啮合副啮合间隙过小,轴承损坏或预紧度过大。安全转向柱及法兰盘变形。前螺旋d簧折断或车身、车架变形。主销与其衬套配合间隙过小或压力轴承损坏。横、直拉杆球头节配合间隙过小。各活动部件缺油。

⑶排除方法

①由于导致转向沉重的故障因素很多,诊断 时应首先判明故障所在部位,然后再进一步确定 在哪一个部件。

②拆下转向臂,转动转向盘,如感觉沉重则应 调整轴承紧度和传动副啮合间隙。若有松紧不均 或有卡住现象,则应拆下转向轴检查传动副及轴 承有无损坏,转向轴与主管有无摩擦或卡住现象, 必要时进行修理或更换。

③转动转向盘时,如感到轻松,则故障在传动机构,应顶起前轴,并用手左、右扳动前轮。如过 紧,应检查转向节主销与衬套,推力轴承和直、横 拉杆球头销配合是否过紧,润滑是否良好,必要时 进行调整和润滑。

④先支起前桥,用手转动转向盘,若感到转向 很容易,不再有转动困难的感觉,这说明故障部位 在前桥与车轮。因为支起前桥后,转向时已不存 在车轮与地面的摩擦阻力,而只是取决于转向器 等的工作状况。此时应仔细检查前轮胎气压是否 过低,前轴有无变形同时也要考虑检查前钢板 d簧是否良好,车架有无变形。必要时,检查车轮 定位角度是否正确

⑤若上述情况均正常良好,则应检查前轴和 车架是否变形,前束是否符合标准,必要时调整 前束。

3.左、右转向轻重不一致

⑴现象:汽车行驶中,向左再向右转动转向盘,感到一侧重,另一侧轻。

⑵原因:分配阀中的滑阀调整不当,使滑阀偏离中间位置。分配阀滑阀台肩两侧的预开缝隙不等。滑阀内有污物,使滑阀或反作用柱塞卡住,造成左右移动阻力不同。动力缸一侧存有空气。车身、车架变形或前悬架有故障。

⑶排除方法:视各有关部件的损坏程度进行调整、修复或更换。

4、低速摆头和转向不稳

(1)故障现象:汽车低速直线行驶时前轮摇摆,感到方向不稳。转弯时大幅度转动方向盘, 才能控制汽车的行使方向。

(2)故障原因

①转向节臂装置松动。②转向器轴承过松。 ③传动副啮合间隙过大。

④横、直拉杆球头销磨损严重。

⑤转向节主销与衬套磨损严重,配合间隙过 大。

⑥前轮毂轴承松旷前轴弯曲轮毂轴承间 隙过大。

⑦车架轮辋变形前束过大轮毂轴承间隙 过大。

⑧转向主销与衬套磨损松旷,配合间隙增大 ⑨轮毂轴承间隙过大。

⑩前束过大轮毂螺栓松动或数量不全。

(3)故障诊断与排除

①一人转动转向盘,另一人在车下查看传动 机构,如转向盘转了许多而转向臂不动,则故障 在转向器如转向臂转动了许多而前轮并不偏 转,则故障在传动机构。

②如果故障在转向器,应检查传动副啮合间 隙,必要时进行调整。

③如果故障在传动机构,应检查转向臂和

直、横拉杆各球头是否松旷,必要时进行调整。

④经检查上述情况良好,则应架起前轴用手 推动车轮,检查转向节主销与衬套,前轮毂轴承是否松旷,必要时进行调整或修理。

⑤转向盘经过上述检查、调整后仍不稳定, 应检查前轴和车架以及轮辋是否变形,前束是否 符合标准规定,必要时进行调整或修理。

⑥前轮低速摆头和转向盘自由空程大,一般 是各部分间隙过大或有连接松动现象,诊断时应 采用分段区分的方法进行检查。可支起前桥,并 用手沿转向节轴轴向推拉前轮,凭感觉判断是否 松旷。若松旷,说明转向节主销与衬套的配合间 隙过大或前轴主销孔与主销配合间隙过大。若此 处不松旷,说明前轮毂轴承松旷,应重新调整轴 承的预紧度。若非上述原因,应检查前轮定位是否正确,检查前轴是否变形。如果前轮轮胎异常磨损,则应 检查前束是否正确。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/11155208.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存