基于51单片机的免超载长途车自动控制系统proteus仿真

(1)当检测到有人进车时能够自动开启车门,开启后延时10秒自动关闭。开门系统由电动机控制,开门时电动机正转,闭门时电动机反转。开门限度由限位开关确定;
(2)能够自动记录进入车内人的个数,当人数超过50时不在开启进车门;
(3)当车内人员有特殊情况需外出时,只能通过按下车内请求按钮,后门开启才能离开,离开之后记录人数自动减一;
(4)当车内人员未满绿色显示灯亮,正常满员时,车门上黄色显示灯亮;当有超载情况出现时,车内报警器自动报警,同时车门红色灯亮。

在这里插入图片描述

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit buz=P2^0;//超载时蜂鸣器报警
sbit relay=P2^1;//超载时关闭客车发动机
sbit LED1=P2^2;//超载时红灯警报
sbit LED2=P2^3;//正常人数时绿灯指示
sbit LED3=P2^4;//有人要下车时黄灯指示
sbit SET=P2^5;//设置超载人数
sbit getoff=P2^6;//乘客下车指示
sbit geton=P2^7;//乘客上车检测	
sbit up=P3^5;//增加超载人数上限
bit set_st;  //状态标志
sbit P36=P3^6;
sbit P37=P3^7;//定义数码管引脚
uchar max=5;//定义超载人数
char count;//定义车内人数
uchar count1,count2,n1,n2;
const uchar tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,}; //显示0~9

/*****延时子程序*****/
void delay(uint num)
{
 while( --num );
}

/*****外部中断0*****/
void int0() interrupt 0 
{ 
  count++; //上车人数记录
  if (count>99)
		count=0;
}

/*****外部中断1*****/
void int1() interrupt 2 
{
  count--; //下车人数记录
  if (count<0)
		count=0;
 }

/*****设置超载人数*****/
void set()
{
 if(SET==0)
  {
   delay(200);
	 TR1 = 1;	     //打开定时器1 
	 set_st=1;
  }
	else if(SET==1)
		set_st=0;	
}

/*****显示人数子程序*****/
void Disp_num()
{		
   	count2=count/10;			    //十位
		count1=count%10;					//个位
		
    P1=tab[count1];						//个位显示
    P36=1;
    delay(50);                  
    P36=0;
		
    P1=tab[count2];						//十位显示
    P37=1;
    delay(50);
    P37=0;
	
}

/*****显示超载人数子程序*****/
void Disp_alarm()
{
  	n2=max/10;			    //十位
		n1=max%10;					//个位
		
    P1=tab[n1];						//个位显示
    P36=1;
    delay(50);                  
    P36=0;
		
    P1=tab[n2];						//十位显示
    P37=1;
    delay(50);
    P37=0;
}	

/*****定时器0*****/
void timer0isr(void) interrupt 1

{
	uchar i;
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;//定时50ms
	i++;
	if(i==200)  //延时10s
	{
		P0=0x03; //电机反转,关闭车门
		i=0;
	}
}

/*****定时器1*****/
void timer1isr(void) interrupt 3
{
	max++; 
  if (max>99)
		max=0;
}	
	
void main(void)
{ 
	
	IT0=1;   	
  IT1=1;                      //设置边沿触发方式
  EX0=1;                      //打开 INT0 的中断允许。
  EX1=1;                      //打开 INT1 的中断允许。
  EA=1;                       //打开总中断
	
	TMOD = 0x61;    //设定T/C0工作在计数器
	TH1 = 256-1;
	TL1 = 256-1;	 //装载计数初值
	ET1 = 1;	     //开T/C0中断
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;//定时50ms
	ET0 = 1;	     //开T/C0中断

	buz=0;
	relay=0;
	LED1=1;
	LED2=1;
	LED3=1;
  P0=0x03;             //初始化
	
	while(1)
  { 
	
		if(geton==0)//乘客上车检测
		{
			P0=0x06; //电机正转,打开车门
		  TR0=1;//打开定时器0
  	}
		
		if(count>max)//超载
		  {
        relay=1;//超载时关闭客车发动机
			  LED1=0;//超载时红灯警报
			  LED2=1;//超载时关闭绿灯
				
				
				buz=~buz;//超载蜂鸣器报警
				delay(50);
			  
			}
		
		else if(count<=max)//人数正常
		  {
			  buz=0;//正常人数时关闭蜂鸣器
			  relay=0;//正常人数时打开客车发动机
			  LED1=1;//正常人数时关闭红灯
			  LED2=0;//正常人数时绿灯指示
			}
					
		if(getoff==0)//乘客下车检测
		  LED3=0;	//有人要下车时黄灯指示
					
		else if(!INT1)//检测乘客是否已经下车
			LED3=1;//乘客下车后关闭黄灯
		

链接:https://pan.baidu.com/s/1fh-3HXzxvSAF_hmm70ReDQ
提取码:g3ud

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值