找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2309|回复: 0
收起左侧

单片机设计的免超载长途车自动控制系统源程序+Proteus仿真

[复制链接]
ID:506901 发表于 2020-6-10 13:05 | 显示全部楼层 |阅读模式
性能指标:
     自动检测车门外是否有人,有人就自动打开车门,延时10s;
     记录从前门上车和后门下车的人数,自动判断是否超重,超载人数可自行设置;
     乘客可通过独立按键来发出下车指示,从而司机打开后门记录人数减一;
     当车内人员未满绿色显示灯亮,如果有超载情况出现时,车内报警器自动报警,同时车门红色灯亮;
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.png

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

  20. /*****延时子程序*****/
  21. void delay(uint num)
  22. {
  23. while( --num );
  24. }

  25. /*****外部中断0*****/
  26. void int0() interrupt 0
  27. {
  28.   count++; //上车人数记录
  29.   if (count>99)
  30.                 count=0;
  31. }

  32. /*****外部中断1*****/
  33. void int1() interrupt 2
  34. {
  35.   count--; //下车人数记录
  36.   if (count<0)
  37.                 count=0;
  38. }

  39. /*****设置超载人数*****/
  40. void set()
  41. {
  42. if(SET==0)
  43.   {
  44.    delay(200);
  45.          TR1 = 1;             //打开定时器1
  46.          set_st=1;
  47.   }
  48.         else if(SET==1)
  49.                 set_st=0;        
  50. }

  51. /*****显示人数子程序*****/
  52. void Disp_num()
  53. {               
  54.            count2=count/10;                            //十位
  55.                 count1=count%10;                                        //个位
  56.                
  57.     P1=tab[count1];                                                //个位显示
  58.     P36=1;
  59.     delay(50);                  
  60.     P36=0;
  61.                
  62.     P1=tab[count2];                                                //十位显示
  63.     P37=1;
  64.     delay(50);
  65.     P37=0;
  66.         
  67. }

  68. /*****显示超载人数子程序*****/
  69. void Disp_alarm()
  70. {
  71.           n2=max/10;                            //十位
  72.                 n1=max%10;                                        //个位
  73.                
  74.     P1=tab[n1];                                                //个位显示
  75.     P36=1;
  76.     delay(50);                  
  77.     P36=0;
  78.                
  79.     P1=tab[n2];                                                //十位显示
  80.     P37=1;
  81.     delay(50);
  82.     P37=0;
  83. }        

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

  86. {
  87.         uchar i;
  88.         TH0=(65536-50000)/256;
  89.         TL0=(65536-50000)%256;//定时50ms
  90.         i++;
  91.         if(i==200)  //延时10s
  92.         {
  93.                 P0=0x03; //电机反转,关闭车门
  94.                 i=0;
  95.         }
  96. }

  97. /*****定时器1*****/
  98. void timer1isr(void) interrupt 3
  99. {
  100.         max++;
  101.   if (max>99)
  102.                 max=0;
  103. }        
  104.         
  105. void main(void)
  106. {
  107.         
  108.         IT0=1;           
  109.   IT1=1;                      //设置边沿触发方式
  110.   EX0=1;                      //打开 INT0 的中断允许。
  111.   EX1=1;                      //打开 INT1 的中断允许。
  112.   EA=1;                       //打开总中断
  113.         
  114.         TMOD = 0x61;    //设定T/C0工作在计数器
  115.         TH1 = 256-1;
  116.         TL1 = 256-1;         //装载计数初值
  117.         ET1 = 1;             //开T/C0中断
  118.         TH0=(65536-50000)/256;
  119.         TL0=(65536-50000)%256;//定时50ms
  120.         ET0 = 1;             //开T/C0中断

  121.         buz=0;
  122.         relay=0;
  123.         LED1=1;
  124.         LED2=1;
  125.         LED3=1;
  126.   P0=0x03;             //初始化
  127.         
  128.         while(1)
  129.   {
  130.         
  131.                 if(geton==0)//乘客上车检测
  132.                 {
  133.                         P0=0x06; //电机正转,打开车门
  134.                   TR0=1;//打开定时器0
  135.           }
  136.                
  137.                 if(count>max)//超载
  138.                   {
  139.         relay=1;//超载时关闭客车发动机
  140.                           LED1=0;//超载时红灯警报
  141.                           LED2=1;//超载时关闭绿灯
  142.                                 
  143.                                 
  144.                                 buz=~buz;//超载蜂鸣器报警
  145.                                 delay(50);
  146.                           
  147.                         }
  148.                
  149.                 else if(count<=max)//人数正常
  150.                   {
  151.                           buz=0;//正常人数时关闭蜂鸣器
  152.                           relay=0;//正常人数时打开客车发动机
  153.                           LED1=1;//正常人数时关闭红灯
  154.                           LED2=0;//正常人数时绿灯指示
  155.                         }
  156.                                        
  157.                 if(getoff==0)//乘客下车检测
  158.                   LED3=0;        //有人要下车时黄灯指示
  159.                                        
  160.                 else if(!INT1)//检测乘客是否已经下车
  161.                         LED3=1;//乘客下车后关闭黄灯
  162.                
  163.            set();//设置超载人数
  164.          
  165.                 if(set_st==0) //显示车内人数
  166.                 {
  167.                   Disp_num();
  168.                 }
  169.                
  170.                 if(set_st==1) //显示超载人数上限值
  171.      {
  172.                    Disp_alarm();
  173.      }
  174.    }
  175. }
复制代码

所有资料51hei提供下载:
51hei设计.zip (164.87 KB, 下载次数: 49)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表