性能指标: 自动检测车门外是否有人,有人就自动打开车门,延时10s; 记录从前门上车和后门下车的人数,自动判断是否超重,超载人数可自行设置; 乘客可通过独立按键来发出下车指示,从而司机打开后门记录人数减一; 当车内人员未满绿色显示灯亮,如果有超载情况出现时,车内报警器自动报警,同时车门红色灯亮; 仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #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;//乘客下车后关闭黄灯
-
- set();//设置超载人数
-
- if(set_st==0) //显示车内人数
- {
- Disp_num();
- }
-
- if(set_st==1) //显示超载人数上限值
- {
- Disp_alarm();
- }
- }
- }
复制代码
所有资料51hei提供下载:
51hei设计.zip
(164.87 KB, 下载次数: 49)
|