仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
有如下按钮:
增加人数
减少人数
自动模式
手动模式
增加灯的个数
减少灯的个数
增加亮度
减少亮度
单片机源程序如下:
- #include <reg51.h>
- #include <intrins.h>
- #include "beep.h"
- #include "delay.h"
- #include "adc0832.h"
- #include "key.h"
- #include "led.h"
- #include "val.h"
- #include "LCD.h"
- //增加人数
- sbit add_human_key=P3^0;
- //减少人数
- sbit dec_human_key=P3^1;
- int maxLight = 80; //最大光照强度
- int tempHuman = 100;
- int sec = 0;
- unsigned char code myNum[] =
- {
- 0x00, 0x01, 0x03, 0x07,
- 0x0F, 0x1F, 0x3F, 0x7F,
- 0xFF
- };
- unsigned char int_time; //记录中断次数
- void timerInit();
- void myFunction(void);
- int human_num = 50; //人数
- int lignt_num = 0; //光照强度
- int main()
- {
- //系统初始化
- init_beep(); //蜂鸣器初始化
- pin_init(); //引脚初始化
- init_led();
- timerInit(); //定时器初始化函数
- int_time=0; //中断次数初始化
- init_led();
- while(1)
- {
- if(add_human_key == 0) //增加人数
- {
- delay(100); //延时10ms
- if(add_human_key == 0)
- {
- human_num++;
- if(human_num>=200) human_num = 200;
- }
- }
- if(dec_human_key == 0) //减少人数
- {
- delay(100); //延时10ms
- if(dec_human_key == 0)
- {
- human_num--;
- if(human_num<=0) human_num = 0;
- }
- }
- my_key();
- myFunction();
- //获取光照强度
- lignt_num = Adc0832(1) / 51.00 * 20.00; //0-100% 的光照强度
- Display(MyPwm, led_num, human_num);
- }
- }
- //定时器初始化
- void timerInit()
- {
- TMOD=0x11; //方式1 16位计数器
- TH0=(65536-10)/256;
- TL0=(65536-10)%256;
- EA=1; //开总中断
- ET0=1; //开定时器0中断
- // ET1 = 1; //开定时器1中断
- TR0=1; //启动定时器0
- // ET1=1; //启动定时器1
- // EX1 = 1; //开启外部中断0
- }
- //外部中断函数1
- void time1() interrupt 1
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256; //0.01ms
- TR0=1; //启动定时器0
- int_time ++; //每来一次中断,中断次数int_time自加1
-
- if(int_time>=100) //够20次中断,即1秒钟进行一次检测结果采样
- {
- int_time=0; //中断次数清0
- }
- if(int_time <= MyPwm) //
- {
- // myFunction();
- }
- }
- //控制逻辑程序
- void myFunction(void)
- {
- if(setFlag == 0) //自动逻辑
- {
- if(lignt_num >= maxLight)
- {
- led_num = 0; //全灭
- MyPwm = 0;
- }
- else
- {
-
- if(human_num > tempHuman)
- {
- led_num = 8; //全亮
- MyPwm = 100;
- }
- else if(human_num < tempHuman && human_num > 0)
- {
- led_num = 4; //一半
- MyPwm = 50;
- }
- else if(human_num == 0)
- {
- led_num = 0; //人为零,则亮度,灯都为零
- MyPwm = 0;
- beep_work();
- }
- }
- P1 = myNum[led_num];
- }
- else //手动逻辑
- {
- P1 = myNum[led_num];
-
- }
-
-
- }
复制代码 Keil代码与Proteus仿真下载:
本人初学,仅供参考,存在错误和不足之处,请大家回帖多多指教,切勿照搬,文件下载:
地铁.7z
(116.79 KB, 下载次数: 12)
|