基于51的小车制作 pwm+蓝牙+lcd+ds1302+外部中断
#include<reg51.h>
#include<intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
#define lcd P0
sbit IN1=P1^1;
sbit IN2=P1^2;
sbit IN3=P1^3;
sbit IN4=P1^4;
sbit beep=P1^5;
sbit en1=P2^0;
sbit en2=P2^1;
sbit xunji1=P2^2;
sbit xunji2=P2^3;
sbit rw=P2^5;
sbit rs=P2^6;
sbit e=P2^7;
sbit key3=P3^2;
sbit key4=P3^3;
sbit io=P3^4;
sbit ce=P3^5;
sbit sclk=P3^6;
u8 code read[3]={0x81,0x83,0x85};
u8 code write[3]={0x80,0x82,0x84};
u8 time[3]={0,0,0};
u8 qingling[3]={0,0,0};
u8 x=0,y=0,b,receive,c;
void yvchuli();
void zhixing();
void zuozhuan();
void youzhuan();
void houtui();
void tingzhi();
void lanya();
void Ds1302Init();
void Ds1302Write(u8 address, u8 date);
u8 Ds1302Read(u8 address);
void Ds1302ReadTime();
void lcdstart();
void busy();
void lcdwrite_command(u8 command);
void lcdwrite_date(u8 date);
void lcddisplay(u8 x,u8 y,u8 date);
void DS1302_LCD();
void delay(u16 t)
{u8 a=120;
while (t--)
while(a--);
}
void Ds1302Write(u8 address,u8 date)
{
u8 n;
ce=0;
sclk=0;
ce=1;
for(n=0;n<8;n++)
{
io=address & 0x01 ;
address>>=1;
sclk=1;
sclk=0;
}
for (n=0; n<8; n++)
{
io=date & 0x01;
date>>=1;
sclk=1;
sclk=0;
}
ce=0;
}
u8 Ds1302Read(u8 address)
{
u8 n,date,date1;
ce=0;
sclk=0;
ce=1;
for(n=0;n<8;n++)
{
io=address & 0x01;
address>>= 1;
sclk= 1;
sclk= 0;
}
for(n=0;n<8;n++)
{
date1=io;
date=(date>>1)|(date1<<7);
sclk=1;
sclk=0;
}
ce=0;
sclk=1;
io=0;
io=1;
return date;
}
void Ds1302ReadTime()
{
u8 n;
for(n=0;n<3;n++)
{
time[n]=Ds1302Read(read[n]);
}
}
void Ds1302Init()
{
u8 n;
Ds1302Write(0x8E,0x00);
for(n=0;n<3;n++)
{
Ds1302Write(write[n],time[n]);
}
Ds1302Write(0x8E,0x80);
}
void busy()
{ u8 a;
lcd=0xff;
do
{
rs=0;
rw=1;
e=1;
a=lcd;
a&=0x80;
}
while(a);
e=0;
}
void lcdwrite_command(u8 command)
{
lcd=command;
rs=0;
rw=0;
e=1;
_nop_();
e=0;
busy();
}
void lcdstart()
{
lcdwrite_command(0x38);
lcdwrite_command(0x38);
lcdwrite_command(0x0c);
lcdwrite_command(0x06);
lcdwrite_command(0x01);
busy();
}
void lcdwrite_date(u8 date)
{
lcd=date;
rs=1;
rw=0;
e=1;
_nop_();
e=0;
busy();
}
void lcddisplay(u8 x,u8 y,u8 date)
{
u8 address;
if(y==1)
address=0x80+x;
if(y==2)
address=0xc0+x;
lcdwrite_command(address);
lcdwrite_date(date);
}
void DS1302_LCD()
{
Ds1302ReadTime();
lcdwrite_command(0x80);
lcdwrite_date((time[2]>>4)|0x30);
lcdwrite_date((time[2]&0x0f)|0x30);
lcdwrite_date('-');
lcdwrite_date((time[1]>>4)|0x30);
lcdwrite_date((time[1]&0x0f)|0x30);
lcdwrite_date('-');
lcdwrite_date((time[0]>>4)|0x30);
lcdwrite_date((time[0]&0x0f)|0x30);
}
void zhixing()
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
}
void zuozhuan()
{
IN1=0;
IN2=0;
IN3=1;
IN4=0;
}
void youzhuan()
{
IN1=1;
IN2=0;
IN3=0;
IN4=0;
}
void houtui()
{
IN1=0;
IN2=1;
IN3=0;
IN4=1;
}
void tingzhi()
{
IN1=0;
IN2=0;
IN3=0;
IN4=0;
}
void yvchuli()
{
TMOD|=0x01;
TH0=0xfc;
TL0=0x18;
ET0=1;
TR0=1;
IP=0x05;
TMOD|=0x20;
TL1=0xf3;
TH1=0xf3;
PCON=0x80;
TR1=1;
SCON=0x50;
ES=1;
IT1=1;
EX1=1;
IT0=1;
EX0=1;
EA=1;
}
void lanya()
{
switch(receive)
{
case(0x01):zhixing();break;
case(0x02):houtui();break;
case(0x03):zuozhuan();break;
case(0x04):youzhuan();break;
case(0x05):tingzhi();break;
case(0x06):DS1302_LCD();break;
case(0x07):Ds1302Init();break;
case(0x08):time[0]=0;time[1]=0;time[2]=0;Ds1302Init();DS1302_LCD();break;
case(0x09):x++;if(x==20)x=1;break;
case(0x0a):y++;if(y==20)x=1;break;
default:tingzhi();break;
}
}
void xunji()
{
if(xunji1==0)
zhixing();
if(xunji2==0)
zhixing();
if(xunji2==1)
youzhuan();
if(xunji1==1)
zuozhuan();
}
void main()
{
Ds1302Init();
lcdstart();
yvchuli();
while(1)
{
if(c==1)
{
lanya();
}
if(c==2)
{
xunji();
}
}
}
void chuankou()interrupt 4
{
receive=SBUF;
RI=0;
SBUF=receive;
while(TI==0);
TI=0;
}
void time0() interrupt 1
{
b++;
if(b<20)
{
if(b>=x)
{en1=0;}
if(b<x)
{en1=1;}
}
if(b<20)
{
if(b>=y)
{en2=0;}
if(b<y)
{en2=1;}
}
else
{b=0;}
TH0=0xfc;
TL0=0x18;
}
void waiduan0() interrupt 0
{ u8 a=100;
delay(10);
if(key3==0)
{ c=1;
while(a--)
{
beep=~beep;
delay(1);
}
}
while(key3==0);
}
void waiduan1()interrupt 2
{ u8 a=100;
delay(10);
if(key4==0)
{ c=2;
while(a--)
{
beep=~beep;
delay(1);
}
}
while(key4==0);
}