找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机地铁模拟Proteus仿真图与源程序

[复制链接]
ID:1019714 发表于 2022-4-19 13:34 | 显示全部楼层 |阅读模式
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
2.png
51hei.gif
有如下按钮:
增加人数
减少人数
自动模式
手动模式
增加灯的个数
减少灯的个数
增加亮度
减少亮度

单片机源程序如下:
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #include "beep.h"
  4. #include "delay.h"
  5. #include "adc0832.h"
  6. #include "key.h"
  7. #include "led.h"
  8. #include "val.h"
  9. #include "LCD.h"

  10. //增加人数
  11. sbit add_human_key=P3^0;
  12. //减少人数
  13. sbit dec_human_key=P3^1;
  14. int maxLight = 80;    //最大光照强度
  15. int tempHuman = 100;
  16. int sec = 0;
  17. unsigned char code myNum[] =
  18. {
  19.      0x00, 0x01, 0x03, 0x07,
  20.      0x0F, 0x1F, 0x3F, 0x7F,
  21.      0xFF
  22. };
  23. unsigned char int_time;        //记录中断次数
  24. void timerInit();
  25. void myFunction(void);
  26. int human_num = 50;     //人数
  27. int lignt_num = 0;     //光照强度


  28. int main()
  29. {
  30.         //系统初始化
  31.         init_beep();   //蜂鸣器初始化
  32.         pin_init();    //引脚初始化
  33.         init_led();
  34.         timerInit();   //定时器初始化函数
  35.         int_time=0;    //中断次数初始化
  36.         init_led();
  37.         while(1)
  38.         {
  39.                 if(add_human_key == 0)    //增加人数
  40.                 {
  41.                         delay(100);   //延时10ms
  42.                         if(add_human_key == 0)
  43.                         {
  44.                                 human_num++;
  45.                                 if(human_num>=200) human_num = 200;
  46.                         }
  47.                 }
  48.             if(dec_human_key == 0)    //减少人数
  49.                 {
  50.                         delay(100);   //延时10ms
  51.                         if(dec_human_key == 0)
  52.                         {
  53.                                 human_num--;
  54.                                 if(human_num<=0) human_num = 0;
  55.                         }
  56.                 }
  57.                 my_key();
  58.                 myFunction();
  59.                 //获取光照强度
  60.                 lignt_num = Adc0832(1) / 51.00 * 20.00;  //0-100%  的光照强度
  61.                 Display(MyPwm, led_num, human_num);
  62.         }               
  63. }
  64. //定时器初始化
  65. void timerInit()
  66. {
  67.         TMOD=0x11;                //方式1 16位计数器
  68.         TH0=(65536-10)/256;
  69.         TL0=(65536-10)%256;
  70.         EA=1;               //开总中断
  71.         ET0=1;                     //开定时器0中断
  72. //        ET1 = 1;                        //开定时器1中断
  73.         TR0=1;                     //启动定时器0
  74. //        ET1=1;              //启动定时器1
  75. //        EX1 = 1;         //开启外部中断0
  76. }
  77. //外部中断函数1
  78. void time1() interrupt 1
  79. {  
  80.          TH0=(65536-50000)/256;
  81.          TL0=(65536-50000)%256;     //0.01ms
  82.          TR0=1;                     //启动定时器0
  83.          int_time ++;        //每来一次中断,中断次数int_time自加1
  84.          
  85.          if(int_time>=100)   //够20次中断,即1秒钟进行一次检测结果采样
  86.          {
  87.                 int_time=0;    //中断次数清0
  88.          }
  89.         if(int_time <= MyPwm)   //
  90.          {
  91. //                myFunction();
  92.          }                 
  93. }
  94. //控制逻辑程序
  95. void myFunction(void)
  96. {
  97.         if(setFlag == 0)   //自动逻辑
  98.         {
  99.                 if(lignt_num >= maxLight)
  100.                 {
  101.                         led_num = 0; //全灭
  102.                         MyPwm = 0;
  103.                 }
  104.                 else
  105.                 {
  106.                         
  107.                         if(human_num > tempHuman)
  108.                         {  
  109.                                 led_num = 8;  //全亮
  110.                                 MyPwm = 100;
  111.                         }
  112.                         else if(human_num < tempHuman && human_num > 0)
  113.                         {
  114.                                 led_num = 4; //一半
  115.                                 MyPwm = 50;
  116.                         }
  117.                         else if(human_num == 0)
  118.                         {
  119.                                 led_num = 0; //人为零,则亮度,灯都为零
  120.                                 MyPwm = 0;
  121.                                 beep_work();
  122.                         }
  123.                 }
  124.                 P1 = myNum[led_num];
  125.         }
  126.         else     //手动逻辑
  127.         {
  128.                 P1 = myNum[led_num];
  129.                
  130.         }
  131.                
  132.         
  133. }
复制代码
Keil代码与Proteus仿真下载:
本人初学,仅供参考,存在错误和不足之处,请大家回帖多多指教,切勿照搬,文件下载:
地铁.7z (116.79 KB, 下载次数: 12)

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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