#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)故障诊断与排除
①一人转动转向盘,另一人在车下查看传动 机构,如转向盘转了许多而转向臂不动,则故障 在转向器如转向臂转动了许多而前轮并不偏 转,则故障在传动机构。
②如果故障在转向器,应检查传动副啮合间 隙,必要时进行调整。
③如果故障在传动机构,应检查转向臂和
直、横拉杆各球头是否松旷,必要时进行调整。
④经检查上述情况良好,则应架起前轴用手 推动车轮,检查转向节主销与衬套,前轮毂轴承是否松旷,必要时进行调整或修理。
⑤转向盘经过上述检查、调整后仍不稳定, 应检查前轴和车架以及轮辋是否变形,前束是否 符合标准规定,必要时进行调整或修理。
⑥前轮低速摆头和转向盘自由空程大,一般 是各部分间隙过大或有连接松动现象,诊断时应 采用分段区分的方法进行检查。可支起前桥,并 用手沿转向节轴轴向推拉前轮,凭感觉判断是否 松旷。若松旷,说明转向节主销与衬套的配合间 隙过大或前轴主销孔与主销配合间隙过大。若此 处不松旷,说明前轮毂轴承松旷,应重新调整轴 承的预紧度。若非上述原因,应检查前轮定位是否正确,检查前轴是否变形。如果前轮轮胎异常磨损,则应 检查前束是否正确。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)