仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
2.png (102.17 KB, 下載次數: 49)
下載附件
2022-4-19 15:22 上傳
51hei.gif (53.36 KB, 下載次數: 42)
下載附件
2022-4-19 17:38 上傳
有如下按鈕:
增加人數
減少人數
自動模式
手動模式
增加燈的個數
減少燈的個數
增加亮度
減少亮度
單片機源程序如下:
- #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)
2022-4-19 17:39 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|