#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
/***С³µ¿ØÖƶ¨Òå**/
#define DIR P1
#define QIAN 0xaa
#define HOU 0x55
#define ZUO 0xa50
#define YOU 0x5a
#define STOP 0x00
void uart_init();
void Time0_init();
void uart_timer();
void uart_tx_string(uchar *str);
void uart_tx_byte(uchar str);
void Delayms(unsigned int n);
void Delayus(unsigned int n);
sbit SEV_PWM = P0^0;
sbit SEH_PWM = P0^1;
uchar count = 0;
uchar SEV_count = 15;
uchar SEH_count = 15;
uchar rec;//½ÓÊÕµ½µÄ×Ö½Ú
uchar buff[9]="00000000";//½ÓÊÕµ½µÄÊý¾Ý°ü
uchar flag;//Êý¾Ý°ü¿ªÊ¼½ÓÊÕ±êÖ¾
uchar num; //Êý×éϱê
uchar buf_ready;//½ÓÊÕµ½Êý¾Ý°üÖÃ1
/*********************************************************
º¯ÊýÃû£ºÖ÷º¯Êý
*********************************************************/
void main()
{
uart_init();
Time0_init();
uart_timer();
DIR = STOP;
Delayms(1);
buff[1] = 0x80;
buff[2] = 0x80;
buff[3] = 0x80;
buff[4] = 0x80;
uart_tx_string("hello car!\n");
while(1)
{
if(buf_ready == 1)//½ÓÊÕÒ»×éÊý¾ÝÍê³É±êÖ¾
{
buf_ready = 0;
}
if(buff[1]>0x80)
{
SEV_count++;
if(SEV_count >= 25)
{
SEV_count = 25;
}
count = 0;
}
else if(buff[1]<0x80)
{
SEV_count--;
if(SEV_count <= 5)
{
SEV_count = 5;
}
count = 0;
}
else if (buff[2]>0x80)
{
SEH_count++;
if(SEH_count >= 25)
{
SEH_count = 25;
}
count = 0;
}
else if(buff[2]<0x80)
{
SEH_count--;
if(SEH_count <= 5)
{
SEH_count = 5;
}
count = 0;
}
else
SEH_count = 15;
SEV_count = 15;
count = 0;
if(buff[3]>0xb0){DIR = QIAN;Delayus(buff[3]-0xa0);DIR = STOP;Delayus(0x20);}//buff[3]¿ØÖÆÇ°ºó
else if(buff[3]<0x40){DIR = HOU;Delayus(0x60-buff[3]);DIR = STOP;Delayus(0x20);}//ͨ¹ýÑÓʱ¿ØÖÆËÙ¶È
else if(buff[4]>0xd0){DIR = YOU;Delayus(20);DIR = STOP;Delayus(5);}//buff[4]¿ØÖÆ×óÓÒ
else if(buff[4]<0x20){DIR = ZUO;Delayus(20);DIR = STOP;Delayus(5);}
else DIR = STOP;
}
}
/*********************************************************
º¯ÊýÃû£º´®¿ÚÖжÏ
*********************************************************/
void uart_timer() interrupt 4
{
if(RI == 0)
{
return;
}
{
ES = 0;
RI = 0;
rec=SBUF;
if(rec==0x66 && flag==0)//Êý¾ÝÍ·
{
flag = 1;
num=0;
buff[0] = rec;
}
else if(flag == 1)//¿ªÊ¼½ÓÊÕÊý¾Ý°übuff[8]
{
num++;
buff[num] = rec;
if(num==7 && buff[7]==0x99)//½ÓÊÕµ½Êý¾Ýβ
{
buf_ready = 1;
flag = 0;
num = 0;
}
else if(num == 7)//½ÓÊÕ´íÎó
{
flag = 0;
num = 0;
}
}
}
ES = 1;
}
/*********************************************************
º¯ÊýÃû£º´®¿Ú³õʼ»¯
²¨ÌØÂÊ£º9600
¾§Õñ£º11.059M
*********************************************************/
void uart_init()
{
IP = 0x08;
TMOD &= 0x00;
PCON &= 0x7F;
TMOD |= 0x21;
TH1=0xfd; //9600
TL1=0xfd;
PCON |= 0x80 ;//9600
SCON=0x50;
ET1=0;
TR1=1; //start Timer1
EA=1;
ES=1;
TH0 = 0xff;
TL0 = 0xa4;
ET0 = 1;
TR0 = 1;
}
void Time0_init() interrupt 1
{
TR0 = 0;
TH0 = 0xff;
TL0 = 0xa4;
if(count <= SEH_count)
{
SEH_PWM = 1;
}
else
{
SEH_PWM = 0;
}
if(count <= SEV_count)
{
SEV_PWM = 1;
}
else
{
SEV_PWM = 0;
}
count++;
if (count >= 200)
{
count = 0;
}
TR0 = 1;
}
/*********************************************************
º¯ÊýÃû£º´®¿Ú·¢ËÍÒ»¸ö×Ö½Ú
*********************************************************/
void uart_tx_byte(uchar str)
{
SBUF=str;
while(!TI);
Delayms(2);
}
/*********************************************************
º¯ÊýÃû£º´®¿Ú·¢ËÍÒ»¸ö×Ö·û´®
*********************************************************/
void uart_tx_string(uchar *str)
{
while(*str!='\0')
{
uart_tx_byte(*str++);
Delayms(2);
}
}
/*********************************************************
º¯ÊýÃû£ºÑÓʱº¯Êý
*********************************************************/
void Delayms(unsigned int n)
{
unsigned int i,j;
for(j=n;j>0;j--)
for(i=112;i>0;i--);
}
void Delayus(unsigned int n)
{
while(n--);
}