#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;
}
}
|