電路原理圖如下:
671e78f17f875acbaf5d4585d5d2f11.png (104.88 KB, 下載次數(shù): 140)
下載附件
下位機電路原理圖
2021-4-1 15:50 上傳
單片機源程序如下:
- #include "reg52.h"
- #include "intrins.h"
- #include "wifi.h"
- #include "uart.h"
- #include "keyboard.h"
- #define FOSC 11059200L
- #define T50MS (65536-FOSC/12/20) //1ms timer calculation method in 12T mode
- #define BAUD 9600 //UART baudrate
- #define pwm(m) CCAP0H = CCAP0L = m;
- #define un "tang"
- #define password "88888888"
- #define dc "DEV-002"
- typedef unsigned char BYTE;
- typedef unsigned int WORD;
- WORD count;
- unsigned char falg_count;
- uchar xdata tt[200]; //定義空數(shù)組用于AD0809取平均值
- uchar FlagStart;
- int scale;
- uchar rsd_sec; //定義占空比比例,熱釋電計時秒變量
- uchar sec,flag_auto;
- uchar lum_mean;
- uchar appcmd=99;//單片機收到的APP信號
- bit bdata flag_rsd; //位定義自動切換的,閃爍標志,報警位標志,熱釋電動作標志,接近傳感器標志
- bit flag_key;
- bit finish=0;
- sbit TEST_LED = P0^7;
- sbit LED_ALARM = P0^0;
- sbit rsd = P2^6;
- /*Declare SFR associated with the ADC */
- sfr ADC_CONTR = 0xBC; //ADC control register
- sfr ADC_RES = 0xBD; //ADC high 8-bit result register
- sfr ADC_LOW2 = 0xBE; //ADC low 2-bit result register
- sfr P1ASF = 0x9D; //P1 secondary function control register
- /*Define ADC operation const for ADC_CONTR*/
- #define ADC_POWER 0x80 //ADC power control bit
- #define ADC_FLAG 0x10 //ADC complete flag
- #define ADC_START 0x08 //ADC start control bit
- #define ADC_SPEEDLL 0x00 //420 clocks
- #define ADC_SPEEDL 0x20 //280 clocks
- #define ADC_SPEEDH 0x40 //140 clocks
- #define ADC_SPEEDHH 0x60 //70 clocks
- /*Declare SFR associated with the PCA */
- sfr CCON = 0xD8; //PCA control register
- sbit CCF0 = CCON^0; //PCA module-0 interrupt flag
- sbit CCF1 = CCON^1; //PCA module-1 interrupt flag
- sbit CR = CCON^6; //PCA timer run control bit
- sbit CF = CCON^7; //PCA timer overflow flag
- sfr CMOD = 0xD9; //PCA mode register
- sfr CL = 0xE9; //PCA base timer LOW
- sfr CH = 0xF9; //PCA base timer HIGH
- sfr CCAPM0 = 0xDA; //PCA module-0 mode register
- sfr CCAP0L = 0xEA; //PCA module-0 capture register LOW
- sfr CCAP0H = 0xFA; //PCA module-0 capture register HIGH
- sfr CCAPM1 = 0xDB; //PCA module-1 mode register
- sfr CCAP1L = 0xEB; //PCA module-1 capture register LOW
- sfr CCAP1H = 0xFB; //PCA module-1 capture register HIGH
- sfr PCAPWM0 = 0xf2;
- sfr PCAPWM1 = 0xf3;
- void InitADC()
- {
- P1ASF = 0x04; //Open 8 channels ADC function
- ADC_RES = 0; //Clear previous result
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
- }
- BYTE GetADCResult(BYTE ch)
- {
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
- _nop_(); //Must wait before inquiry
- _nop_();
- _nop_();
- _nop_();
- while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag
- ADC_CONTR &= ~ADC_FLAG; //Close ADC
- return ADC_RES; //Return ADC result
- }
- void work()
- {
- uint lum_all;
- uchar b,c;
- for(b=0;b<200;b++) //將空數(shù)組tt【】內(nèi)數(shù)值整體左移一位
- {
- tt[b]=tt[b+1]; //將后一數(shù)值放到前一位置
- }
- tt[199] =GetADCResult(2); //將讀出的ad數(shù)值放入tt【49】
- lum_all =0;
- for(c=0;c<200;c++) //將tt【】內(nèi)數(shù)值相加
- {
- lum_all=lum_all+tt[c];
- }
- lum_mean=lum_all/200; //將總數(shù)/50取出平均值
- if(qiehuan==0) //自動切換按鍵按下
- {
- delay(10); //去抖
- if(qiehuan==0) //再次判斷按鍵按下
- {
- LED_ALARM =0;
- flag_auto=!flag_auto; //自動模式標志位取反
- if(flag_auto==1) //當切換到手動模式時 首先將LED發(fā)光比例設置在50%
- scale=128;
- }
- while(!qiehuan); //按鍵釋放 松開按鍵后關閉蜂鳴器
- LED_ALARM =1;
- }
- if(flag_auto==1)
- {
- if(add==0) //加鍵按下
- {
- delay(5);
- if(add==0)
- {
- // LED_ALARM =0;
- if(scale<=254)
- scale++; //燈光比例++
- if(scale>=255)
- scale=255;
- // if(add)
- // LED_ALARM =1;
- }
- }
- if(dec==0) //減鍵按下時
- {
- delay(5);
- if(dec==0)
- {
- // LED_ALARM =0;
- if(scale>255) scale=128;
- if(scale>=1)
- scale--; //燈光比例--
- if(scale<=0)
- scale=0;
- // if(dec)
- // LED_ALARM =1;
- }
- }
- }
- else
- {
- if(flag_rsd==1) //有人在范圍內(nèi)時
- {
-
- if(lum_mean<=90) scale=0; //判斷取出平均值大小 小于30 發(fā)光強度0%
- else if(lum_mean>=190) scale=255; //大于150 發(fā)光強度100%
- else scale=(lum_mean-90)*2.55; //其他值時將其計算得到發(fā)光強度 (計算目的是為了得到一個1-41之間的數(shù)值 控制燈光變化)
- }
- else
- {
- scale=0; //沒有人在范圍內(nèi)時 將燈光亮度調至0%
- }
- }
- pwm(scale);
- }
- void main()
- {
- unsigned char sendlum[3];
- unsigned char sendlev[3];
- CCON = 0; //Initial PCA control register
- //PCA timer stop running
- //Clear CF flag
- //Clear all module interrupt flag
- CL = 0; //Reset PCA base timer
- CH = 0;
- CMOD = 0x02; //Set PCA timer clock source as Fosc/2
- //Disable PCA timer overflow interrupt
- CCAP0H = CCAP0L = 0x00; //PWM0 port output 50% duty cycle square wave
- CCAPM0 = 0x42; //PCA module-0 work in 8-bit PWM mode and no PCA interrupt
- CCAP1H = CCAP1L = 0xff; //PWM1 port output 0% duty cycle square wave
- PCAPWM1 = 0x03;
- CCAPM1 = 0x42; //PCA module-1 work in 8-bit PWM mode and no PCA interrupt
- CR = 1; //PCA timer start run
- SCON = 0x50; //8-bit variable UART
-
- TMOD = 0x21; //Set Timer1 as 8-bit auto reload mode
- TH1 = TL1 = -(FOSC/12/32/BAUD); //Set auto-reload vaule
- TR1 = 1; //Timer1 start run
- ES = 1; //Enable UART interrupt
-
- TL0 = T50MS; //initial timer0 low byte
- TH0 = T50MS >> 8; //initial timer0 high byte
- TR0 = 1; //timer0 start running
- ET0 = 1; //enable timer0 interrupt
- EA = 1; //Open master interrupt switch
-
- count=0;
-
- flag_auto=1;
- scale=128;
- InitADC();
- LED_ALARM =0;
- initwifi();
- LED_ALARM =1;
- SendString("{\"cmd\":\"DR\",\"un\":\"");
- SendString(un);
- SendString("\",\"pwd\":\"");
- SendString(password);
- SendString("\",\"dc\":\"");
- SendString(dc);
- SendString("\"}");
- finish=1;
- while(1)
- {
- if(flag_auto==0)
- LED_ALARM = ~rsd;
- work();
- if(appcmd ==0) //自動
- {
- flag_auto =0;
- appcmd =99;
- }
- else if(appcmd==1) //切換到手動
- {
- flag_auto =1;
- scale =128; //50%
- appcmd =99;
- }
- else if(appcmd>1&&appcmd!=99) //1-7檔 對應 2 3 4 5 6 7 8
- {
- scale = (appcmd-2)*36;
- if(appcmd==8)
- scale =255;
- appcmd =99;
- }
- if(FlagStart==1)
- {
- sendlum[0] =lum_mean%1000/100+0x30;
- sendlum[1] =lum_mean%100/10+0x30;
- sendlum[2] =lum_mean%10+0x30;
- sendlev[0] = scale%1000/100+0x30;
- sendlev[1] = scale%100/10+0x30;
- sendlev[2] = scale%10+0x30;
- FlagStart=2;
-
- SendString("{\"cmd\":\"DTP\",\"un\":\"");
- SendString(un);
- SendString("\",\"message\":{\"lum\":\"");
- SendASC(sendlum[0]);
- SendASC(sendlum[1]);
- SendASC(sendlum[2]);
- SendString("\",\"aut\":\"");
- SendASC(flag_auto+0x30);
- SendString("\",\"lev\":\"");
- SendASC(sendlev[0]);
- SendASC(sendlev[1]);
- SendASC(sendlev[2]);
- SendString("\"}}");
- falg_count=0;
- }
- if(FlagStart>=3)
- {
- FlagStart =0;
- SendString("{\"cmd\":\"DR\",\"un\":\"");
- SendString(un);
- SendString("\",\"pwd\":\"");
- SendString(password);
- SendString("\",\"dc\":\"");
- SendString(dc);
- SendString("\"}");
- delay(100);
- }
- }
- }
- void tm0_isr() interrupt 1 using 1
- {
- TL0 = T50MS; //reload timer0 low byte
- TH0 = T50MS >> 8; //reload timer0 high byte
- count++; //50ms m++
- if(count>=20) //到達1s時
- {
-
- falg_count++;
- if(falg_count >= 2)
- {
- falg_count =0;
- FlagStart++;
- }
- count=0; //m=0
- if(rsd==0) //熱釋電無信號時
- rsd_sec++; //熱釋電計時秒++
- if(rsd_sec<=15&&rsd==1) //熱釋電計時秒小于等于30 并且 熱釋電有信號時
- {
- rsd_sec=0; //將熱釋電秒清零
- flag_rsd=1; //標志位置1 控制AD采集數(shù)值 調節(jié)燈光亮度
- }
- else if(rsd_sec>15&&rsd==0) //熱釋電計時秒大于30 并且 熱釋電無信號時
- {
- flag_rsd=0; //標志位置0 停止ad轉換 關閉燈光
- rsd_sec=0; //熱釋電計時秒清零
- }
- }
- }
- void Uart_Isr() interrupt 4 using 1
- {
- unsigned char dat;
-
- if (RI)
- {
- RI = 0; //Clear receive interrupt flag
- dat = SBUF;
- if(SBUF == '\r' ||SBUF == '\n')
- {
- RsPoint =0;
- }
- if(SBUF !='\r' && SBUF !='\n' && SBUF !=' ')
- {
- RsBuf[RsPoint]=SBUF;
- RsPoint++;
- }
- if(RsPoint>=60)
- RsPoint = 0;
- if(finish==1)
- {
- if(Flag_rec==1)
- {
- switch (Key_num)
- {
- case 'W': appcmd = dat-0x30; LED_ALARM =~LED_ALARM;FlagStart=1; break;
- case 'T': appcmd = dat-0x30+2 ;LED_ALARM =~LED_ALARM;FlagStart=1; break;
- }
- Flag_rec=0;
- }
- if(dat=='W'||dat=='T')
- {
- LED_ALARM =~LED_ALARM;
- Flag_rec=1;
- Key_num=dat;
- }
- }
- }
- }
復制代碼
51hei.png (8.37 KB, 下載次數(shù): 137)
下載附件
2021-4-1 15:58 上傳
全部代碼51hei下載地址:
代碼.zip
(94.22 KB, 下載次數(shù): 185)
2021-4-1 15:49 上傳
點擊文件名下載附件
下位機代碼 下載積分: 黑幣 -5
|