资源描述
智能小车在PROTEUS下的仿真设计
#include<reg52.h> //头文件
#define uchar unsigned char //宏定义
#define uint unsigned int //宏定义
sbit IN1=P2^0;
sbit IN2=P2^1 ;
sbit IN3=P2^6; //定义驱动
sbit IN4=P2^7;
sbit EN1=P2^2 ;
sbit EN2=P2^5;
sbit C0=P0^0; //右1传感器
sbit C1=P0^1; //右2传感器
sbit C2=P0^2;//左2传感器
sbit C3=P0^3; //左2传感器
sbit STOP=P2^3;//障碍物传感器
sbit QQ=P2^4;//扬声器
uchar code table[]={0xbf,0x86,0x5b,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//定义表格
uchar si,fen,miao,shi,ge; //定义 时:分:秒;和十位个位。
uchar i,aa,bb, tt=0,ss=0;
void delay( uint z)//延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=50;y>0;y--);
}
void init( )//对函数初始化
{
TMOD=0x11;
TH0=(65536-20000)/256; //TH0装初值
TL0=(65536-20000)%256; //TL0装初值
TH1=(65536-2000)/256; //TH1装初值
TL1=(65536-2000)%256; //TL1装初值
EA=1;
ET0=1;
ET1=1; //开中断
TR0=1;
TR1=1;
P3=0x00;
P1=0x00;
}
void timer0() interrupt 1 //T0中断函数
{
TH0=(65536-20000)/256; //TH0装初值
TL0=(65536-20000)%256; //TL0装初值
tt++,ss=1;
if(tt==50)
{
tt=0;
miao++;
if(miao==60)
{
fen++;miao=0;
}
if(fen==24)
{
fen=0,si++;
}
}
}
void timer1() interrupt 3 //T1中断函数
{
TH1=(65536-2000)/256; //TH1装初值
TL1=(65536-2000)%256; //TL1装初值
if(aa==i)
{
EN1=1;
}
if(bb==9) //产生PWM波
{
EN1=0,aa=0,bb=0;
}
aa++,bb++;
}
void keyscan()//键盘扫描
{
if(C0&&C1&&C2&&C3==1)
{
delay(6);
if(C0&&C1&&C2&&C3==1)
{
P3=0x00;
P1=0xbf;
EN2=1,EN1=1,IN1=1,IN2=1;ET1=0;
miao=0, fen=0, si=0;
while(C0&&C1&&C2&&C3==1);
}
}
}
void main ( )//主函数
{
IN1=1,IN2=0;EN2=1;
init( );//调用初始化函数
while(1)
{
P0=0XFF;
if(STOP==0) //有障碍物
{
EN2=1,EN1=1,IN1=1,IN2=1; ET1=0;QQ=0;
}
if(STOP==1)//无障碍物
{ QQ=1;
ET1=1;IN1=1,IN2=0;EN2=1;
if(C0|C1|C2|C3==0) //没有脱轨
{
i=2;
}
P0=0XFF;
if(C0|C1|C2|C3==1)//有脱轨
{
i=5;
if(C0==1) //右1传感器检测到黑线
{
IN3=1, IN4=0;
delay(5);
IN3=0, IN4=0;
}
if(C1==1)//右2传感器检测到黑线
{
IN3=1, IN4=0;
delay(15);
IN3=0, IN4=0;
}
if(C3==1)//左1传感器检测到黑线
{
IN3=0, IN4=1;
delay(5);
IN3=0, IN4=0;
}
if(C2==1)//左2传感器检测到黑线
{
IN3=0, IN4=1;
delay(15);
IN3=0, IN4=0;
}
}
}
if(ss==1)
{
ss=0;
shi=miao/10;//分离秒的十位
ge=miao%10;//分离秒的个位
P3=0xdf;
P1=table[ge];//显示秒的个位
delay(5);
P3=0xef;
P1=table[shi];//显示秒的十位
delay(5);
shi=fen/10;//分离分的十位
ge=fen%10;//分离分的个位
P3=0xf7;
P1=table[ge];//显示分的个位
delay(5);
P3=0xfb;
P1=table[shi];//显示分的十位
delay(5);
shi=si/10;//分离时的十位
ge=si%10;//分离时的个位
P3=0xfd;
P1=table[ge];//显示时的个位
delay(5);
P3=0xfe;
P1=table[shi];//显示时的十位
delay(5);
}
keyscan ( );//调用键盘扫描函数
}
}
仿真电路图
展开阅读全文