#include <reg52.h>
#include "string.h"
#include "intrins.h"
#include "LCD1602.H"
unsigned int exte_count=0,exte_time=0,mil=0;//测速脉冲 //测速计算时间单位 500mS 里程
unsigned char time1s_Flag;
unsigned int count; //5us次数标识
sbit pwm =P1^0 ; //PWM信号输出
unsigned int jd; //角度标识
#define CAR_SPEED_MAX 10
sbit PWM_R=P1^7; //PWM输出
sbit PWM_L=P1^2;
sbit Moto_RA=P1^6;
sbit Moto_RB=P1^5;
sbit Moto_LA=P1^4;
sbit Moto_LB=P1^3; //左右电机驱动
unsigned char Moto_Speed_R; //速度 0-10
unsigned char Moto_Speed_L; //速度 0-10
unsigned char Moto_Speed_Num; //PWM调速
sbit XJ_R1=P3^4; //PWM输出
sbit XJ_R2=P3^5; //PWM输出
sbit XJ_L2=P3^6;
sbit XJ_L1=P3^7;
unsigned char Car_Sta; //小车状态(方向改变时有一小段时间速度为满速)
unsigned char Recv_Flag=0; //有新的一帧数据
/**蓝牙遥控代码 Begin**/
#define RECV_BUFF_MAX 20
#ifndef BAUDRATE
#define BAUDRATE 11259200
#endif
unsigned char Recv_Buff[RECV_BUFF_MAX];
unsigned char Recv_Point;
unsigned char Recv_Delay;
code unsigned char download[16]={"budiaodianxiazai"};
code char houtui[6]={"houtui"};
//62 75 64 69 61 6F 64 69 61 6E 78 69 61 7A 61 69
#define IAP_ENABLE 0x60 //IAP允许
sfr IAP_CNTR = 0xE7; //IAP控制寄存器
/*void delay(unsigned int i)//??
{
unsigned int j,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}*/
/***********************************
*函数名称:void Uart_byte(unsigned char adata)
*函数功能:串口字节发送
*参数说明:adata 要发送的字节
*返回说明:无
*其它说明:无
***********************************/
void Uart_byte(unsigned char adata)
{
TI=0;
SBUF=adata;
while(!TI);
TI=0;
}
/***********************************
*函数名称:void Uart_init(unsigned int bps)
*函数功能:串口初始化
*参数说明:bps:波特率
*返回说明:无
*其它说明:波特率9600
***********************************/
/*void Uart_Init(unsigned long bps)
{
unsigned char val;
TMOD|=0x20;
val=BAUDRATE/(384*bps);
TH1=256-val;
TL1=256-val;
SCON=0x50;
TR1=1;
REN=1;
ES=1;
}*/
void UartInit(void) //9600bps@22.1184MHz
{
SCON = 0x50; //8???,?????
TMOD &= 0x0F; //?????1???
TMOD |= 0x20; //?????1?8???????
TL1 = 0xFA; //??????
TH1 = 0xFA; //????????
ET1 = 0; //禁止定时器1中断
TR1 = 1; //?????1
REN=1;
ES=1;
}
/***********************************
*函数名称:void Uart_send(unsigned char *buf,unsigned char num)
*函数功能:串口发送
*参数说明:buf 要发送的数组 num 要发送的长度
*返回说明:无
*其它说明:无
***********************************/
void Uart_send(unsigned char *buf,unsigned char num)
{
while(num--)
{
TI=0;
SBUF=*buf++;
while(!TI);
TI=0;
}
}
/***********************************
*函数名称:void Uart_recv(void)
*函数功能:完成一帧接受
*参数说明:无
*返回说明:无
*其它说明:无
***********************************/
void Uart_recv(void)
{
if (Recv_Point&&(!Recv_Delay))
{
Recv_Flag=1;
}
}
/***********************************
*函数名称:unsigned char Uart_string(char* arry)
*函数功能:串口解析【查找特定字符串】
*参数说明:arry 要查找的字符数组
*返回说明:0 没找到 1 找到
*其它说明:所有查找结束后 必须清空Recv_Buff缓存
***********************************/
unsigned char Uart_string(char* arry)
{
char * p; //指针变量
p=strstr(Recv_Buff,arry); //strstr函数 在Recv_Buff中查找特定字符串
if (p) //如果在Recv_Buff中找到特定字符串 会返回其所在位置 不关心位置在哪 只关心找到了
{
return 1;
}
return 0; //没找到特定字符串 strstr函数会返回NULL[空]给指针p 所以返回0
}
/***********************************
*函数名称:void L298N_Init(void)
*函数功能:初始化
*参数说明:无
*返回说明:无
*其它说明:无
***********************************/
void Uart_Power_Download(void)
{
unsigned int i=20000;
if (Uart_string("budiaodianxiazai"))
{
P1=0xf0;
i=60000;
while(i--);
IAP_CNTR = IAP_ENABLE; //允许IAP, 也就是直接进入下载程序
}
}
/***********************************
*函数名称:void Uart_Buff_Clear(void)
*函数功能:清空串口缓存数组
*参数说明:无
*返回说明:无
*其它说明:无
***********************************/
void Uart_Buff_Clear(void)
{
unsigned char i;
Recv_Point=0;
for (i=0;i<RECV_BUFF_MAX;i++)
{
Recv_Buff[i]=0;
}
}
/***********************************
*函数名称:void Uart (void) interrupt 4
*函数功能:串口中断服务程序
*参数说明:无
*返回说明:无
*其它说明:无
***********************************/
void Uart (void) interrupt 4
{
if (RI)
{
RI=0;
Recv_Buff[Recv_Point++]=SBUF;
if (Recv_Point>=RECV_BUFF_MAX)
{
Recv_Point=0;
}
Recv_Delay=19;
}
}
/**蓝牙遥控代码 End**/
/****** PWM调速代码 begin ******/
/***********************************
*函数名称:void PWM_Init(void)
*函数功能:PWM初始化
*参数说明:无
*返回说明:无
*其它说明:配置定时器0 设置初始速度值
***********************************/
void Timer0Init(void) //125微妙@22.1184MHz
{
TMOD &= 0xF0; //???????
TMOD |= 0x01; //???????
TL0 = 0x28; //??????
TH0 = 0xFF; //??????
TF0 = 0; //??TF0??
ET0=1;//开定时器中断
TR0 = 1; //???0????
EA=1;
PWM_R=1;
PWM_L=1;
}
/***********************************
*函数名称:void Time0_isr (void) interrupt 1
*函数功能:定时器0中断服务程序
*参数说明:无
*返回说明:无
*其它说明:无
***********************************/
void Time0_Int() interrupt 1 //中断程序
{
TL0 = 0x30; //??????
TH0 = 0xFF; //??????
if(count< jd) //判断0.125ms次数是否小于角度标识
pwm=1; //确实小于,PWM输出高电平
else
pwm=0; //大于则输出低电平
count=(count+1); //次数始终保持为40 即保持周期为20ms
if(count>=160)//实测 20mm
{
count=0;
exte_time++;
if(exte_time>=50)//到1S
{
exte_time=0;
time1s_Flag=1;
}
}
if (Moto_Speed_Num<CAR_SPEED_MAX) //记数 一个周期的时间
{
Moto_Speed_Num++;
}
else
{
Moto_Speed_Num=0;
}
if (Moto_Speed_Num<Moto_Speed_R) //占空比 高电平持续时间
{
PWM_R=1;
}
else
{
PWM_R=0;
}
if (Moto_Speed_Num<Moto_Speed_L) //占空比 高电平持续时间
{
PWM_L=1;
}
else
{
PWM_L=0;
}
if (Recv_Delay)//接收超时
{
Recv_Delay--;
}
}
/***********************************
*函数名称:void Car_Run(unsigned char dire)
*函数功能:行进方向控制
*参数说明:dire 方向 0:停止 1:前 2:后 3:左 4:右
*返回说明:无
*其它说明:左右方向为原地转弯 【若想前进中和后退中转弯 需要与调速函数配合 使两个车轮转速不同】
***********************************/
void Car_Run(unsigned char dire)
{
unsigned int i=1500;
switch (dire)
{
case 0://停止
{
Moto_RA=0;
Moto_RB=0;
Moto_LA=0;
Moto_LB=0;
}break;
case 1://前
{
Moto_RA=1;
Moto_RB=0;
Moto_LA=1;
Moto_LB=0;
}break;
case 2://后
{
Moto_RA=0;
Moto_RB=1;
Moto_LA=0;
Moto_LB=1;
}break;
default:break;
}
if (Car_Sta!=dire) //转换方向时 一小段时间加速 为了低速可以启动
{
Car_Sta=dire;
while(i--);
}
}
/***********************************
*函数名称:void Sys_Init(void)
*函数功能:初始化
*参数说明:无
*返回说明:无
*其它说明:上电初始化
***********************************/
void Sys_Init(void)
{
//UartInit(); //9600bps@22.1184MHz
Timer0Init();//125微妙@22.1184MHz
}
void Extern1_Init(void)
{
IT1 = 1; //set INT1 int type (1:Falling only 0:Low level)
EX1 = 1;
}
void exint1() interrupt 2 //(location at 0013H)
{
exte_count++;
mil++;
}
/**轮子直径6.5CM 转一圈大概走20cm,码盘是20栅格,转一圈是20个脉冲,一个脉冲对应1cm**/
void Seepd_display(void)
{
L1602_char(1,10,exte_count/100+0X30);
L1602_char(1,11,exte_count%100/10+0X30);
L1602_char(1,12,exte_count%10+0X30);
exte_count=0;
L1602_char(2,9,mil/100000+0x30);
L1602_char(2,10,mil%100000/10000+0x30);
L1602_char(2,11,mil%100000%10000/1000+0x30);
L1602_char(2,12,mil%100000%10000%1000/100+0x30);
L1602_char(2,13,mil%100000%10000%1000%100/10+0x30);
L1602_char(2,14,mil%10+0x30);
//L1602_string(2,15,"cm");
}
/***********************************
*函数名称:void main(void)
*函数功能:主函数
*参数说明:无
*返回说明:无
*其它说明:程序入口
***********************************/
unsigned int i;
unsigned int j;
unsigned int x;
void Delay_xms( x)
{
for(i=0;i<x;i++)
for(j=0;j<100;j++);
}
void zhixin()
{
jd=12;
delay(5);
}
void zuozhuan1()
{
jd=7;
delay(5);
}
void zuozhuan2()
{
jd=7;
delay(5);
}
void youzhuan1()
{
jd=17;
delay(5);
}
void youzhuan2()
{
jd=17;
delay(5);
}
void main(void)
{
jd=12;//1.5mS//3001mS
count=0;
Sys_Init();
lcd_init();
L1602_string(1,1,table);
L1602_string(2,1,table1);
L1602_string(1,13,"cm/S");
L1602_string(2,15,"cm");
Car_Run(1);//
Extern1_Init();
Moto_Speed_R=5;
Moto_Speed_L=5;
while(1)
{
if((XJ_L1==1)&&(XJ_L2==0)) {jd=17; Delay_xms( 580) ; }
if((XJ_L1==0)&&(XJ_L2==1)) {jd=13; Delay_xms( 230) ; }
if((XJ_R1==0)&&(XJ_R2==1)) {jd=11; Delay_xms( 230) ; }
if((XJ_R1==1)&&(XJ_R2==0)) {jd=7; Delay_xms( 580) ; }
jd=12;
}
}
|