久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 7244|回復(fù): 8
收起左側(cè)

C51單片機(jī)WIFI智能臺(tái)燈程序,熱釋電紅外感應(yīng),光敏電阻比例調(diào)節(jié)亮度

  [復(fù)制鏈接]
ID:720305 發(fā)表于 2021-4-1 15:50 | 顯示全部樓層 |閱讀模式
電路原理圖如下:

下位機(jī)電路原理圖

下位機(jī)電路原理圖


單片機(jī)源程序如下:
  1. #include "reg52.h"
  2. #include "intrins.h"
  3. #include "wifi.h"
  4. #include "uart.h"
  5. #include "keyboard.h"

  6. #define FOSC    11059200L
  7. #define T50MS (65536-FOSC/12/20)   //1ms timer calculation method in 12T mode
  8. #define BAUD 9600           //UART baudrate
  9. #define pwm(m)          CCAP0H = CCAP0L = m;

  10. #define un "tang"
  11. #define password "88888888"
  12. #define dc "DEV-002"
  13. typedef unsigned char BYTE;
  14. typedef unsigned int WORD;

  15. WORD count;
  16. unsigned char falg_count;
  17. uchar xdata tt[200];                   //定義空數(shù)組用于AD0809取平均值
  18. uchar FlagStart;
  19. int scale;
  20. uchar rsd_sec;                //定義占空比比例,熱釋電計(jì)時(shí)秒變量
  21. uchar sec,flag_auto;
  22. uchar lum_mean;
  23. uchar appcmd=99;//單片機(jī)收到的APP信號(hào)
  24. bit bdata flag_rsd;          //位定義自動(dòng)切換的,閃爍標(biāo)志,報(bào)警位標(biāo)志,熱釋電動(dòng)作標(biāo)志,接近傳感器標(biāo)志
  25. bit flag_key;
  26. bit finish=0;
  27. sbit TEST_LED = P0^7;
  28. sbit LED_ALARM =  P0^0;

  29. sbit rsd = P2^6;
  30. /*Declare SFR associated with the ADC */
  31. sfr ADC_CONTR   =   0xBC;           //ADC control register
  32. sfr ADC_RES     =   0xBD;           //ADC high 8-bit result register
  33. sfr ADC_LOW2    =   0xBE;           //ADC low 2-bit result register
  34. sfr P1ASF       =   0x9D;           //P1 secondary function control register

  35. /*Define ADC operation const for ADC_CONTR*/
  36. #define ADC_POWER   0x80            //ADC power control bit
  37. #define ADC_FLAG    0x10            //ADC complete flag
  38. #define ADC_START   0x08            //ADC start control bit
  39. #define ADC_SPEEDLL 0x00            //420 clocks
  40. #define ADC_SPEEDL  0x20            //280 clocks
  41. #define ADC_SPEEDH  0x40            //140 clocks
  42. #define ADC_SPEEDHH 0x60            //70 clocks
  43. /*Declare SFR associated with the PCA */
  44. sfr CCON        =   0xD8;           //PCA control register
  45. sbit CCF0       =   CCON^0;         //PCA module-0 interrupt flag
  46. sbit CCF1       =   CCON^1;         //PCA module-1 interrupt flag
  47. sbit CR         =   CCON^6;         //PCA timer run control bit
  48. sbit CF         =   CCON^7;         //PCA timer overflow flag
  49. sfr CMOD        =   0xD9;           //PCA mode register
  50. sfr CL          =   0xE9;           //PCA base timer LOW
  51. sfr CH          =   0xF9;           //PCA base timer HIGH
  52. sfr CCAPM0      =   0xDA;           //PCA module-0 mode register
  53. sfr CCAP0L      =   0xEA;           //PCA module-0 capture register LOW
  54. sfr CCAP0H      =   0xFA;           //PCA module-0 capture register HIGH
  55. sfr CCAPM1      =   0xDB;           //PCA module-1 mode register
  56. sfr CCAP1L      =   0xEB;           //PCA module-1 capture register LOW
  57. sfr CCAP1H      =   0xFB;           //PCA module-1 capture register HIGH
  58. sfr PCAPWM0     =   0xf2;
  59. sfr PCAPWM1     =   0xf3;

  60. void InitADC()
  61. {
  62.     P1ASF = 0x04;                   //Open 8 channels ADC function
  63.     ADC_RES = 0;                    //Clear previous result
  64.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL;

  65. }

  66. BYTE GetADCResult(BYTE ch)
  67. {
  68.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
  69.     _nop_();                        //Must wait before inquiry
  70.     _nop_();
  71.     _nop_();
  72.     _nop_();
  73.     while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag
  74.     ADC_CONTR &= ~ADC_FLAG;         //Close ADC

  75.     return ADC_RES;                 //Return ADC result
  76. }
  77. void work()
  78. {
  79.         uint lum_all;
  80.         uchar b,c;
  81.     for(b=0;b<200;b++)                         //將空數(shù)組tt【】?jī)?nèi)數(shù)值整體左移一位
  82.         {
  83.                 tt[b]=tt[b+1];                        //將后一數(shù)值放到前一位置
  84.         }        
  85.         tt[199] =GetADCResult(2);  //將讀出的ad數(shù)值放入tt【49】

  86.         lum_all =0;
  87.         for(c=0;c<200;c++)                        //將tt【】?jī)?nèi)數(shù)值相加
  88.         {
  89.                 lum_all=lum_all+tt[c];
  90.         }

  91.         lum_mean=lum_all/200;                //將總數(shù)/50取出平均值


  92.         if(qiehuan==0)                                  //自動(dòng)切換按鍵按下
  93.         {
  94.                 delay(10);                                  //去抖
  95.                 if(qiehuan==0)                          //再次判斷按鍵按下
  96.                 {
  97.                         LED_ALARM =0;
  98.                         flag_auto=!flag_auto; //自動(dòng)模式標(biāo)志位取反
  99.                         if(flag_auto==1)          //當(dāng)切換到手動(dòng)模式時(shí)  首先將LED發(fā)光比例設(shè)置在50%
  100.                         scale=128;
  101.                 }
  102.                 while(!qiehuan); //按鍵釋放  松開(kāi)按鍵后關(guān)閉蜂鳴器
  103.                 LED_ALARM =1;
  104.         }
  105.         if(flag_auto==1)
  106.         {
  107.                 if(add==0)                                 //加鍵按下
  108.                 {
  109.                         delay(5);
  110.                         if(add==0)
  111.                         {
  112. //                              LED_ALARM =0;
  113.                                 if(scale<=254)
  114.                                 scale++;                  //燈光比例++
  115.                                 if(scale>=255)
  116.                                 scale=255;
  117. //                                if(add)
  118. //                                LED_ALARM =1;         
  119.                         }
  120.                 }
  121.                 if(dec==0)                                  //減鍵按下時(shí)
  122.                 {
  123.                         delay(5);
  124.                         if(dec==0)
  125.                         {
  126. //                            LED_ALARM =0;
  127.                                 if(scale>255) scale=128;
  128.                                 if(scale>=1)
  129.                                 scale--;                   //燈光比例--
  130.                                 if(scale<=0)
  131.                                 scale=0;
  132. //                                if(dec)
  133. //                                LED_ALARM =1;
  134.                         }
  135.                 }
  136.         }
  137.         else
  138.         {

  139.                 if(flag_rsd==1)                                        //有人在范圍內(nèi)時(shí)
  140.                 {         
  141.                
  142.                         if(lum_mean<=90) scale=0;                           //判斷取出平均值大小  小于30  發(fā)光強(qiáng)度0%
  143.                         else if(lum_mean>=190) scale=255;           //大于150  發(fā)光強(qiáng)度100%
  144.                         else scale=(lum_mean-90)*2.55;                   //其他值時(shí)將其計(jì)算得到發(fā)光強(qiáng)度 (計(jì)算目的是為了得到一個(gè)1-41之間的數(shù)值 控制燈光變化)        

  145.                 }
  146.                 else
  147.                 {
  148.                         scale=0;                                         //沒(méi)有人在范圍內(nèi)時(shí) 將燈光亮度調(diào)至0%
  149.                 }        
  150.         }
  151.          pwm(scale);


  152. }
  153. void main()
  154. {
  155.         unsigned char sendlum[3];
  156.         unsigned char sendlev[3];
  157.         CCON = 0;                       //Initial PCA control register
  158.         //PCA timer stop running
  159.         //Clear CF flag
  160.         //Clear all module interrupt flag
  161.         CL = 0;                         //Reset PCA base timer
  162.         CH = 0;
  163.         CMOD = 0x02;                    //Set PCA timer clock source as Fosc/2
  164.         //Disable PCA timer overflow interrupt
  165.         CCAP0H = CCAP0L = 0x00;         //PWM0 port output 50% duty cycle square wave
  166.         CCAPM0 = 0x42;                  //PCA module-0 work in 8-bit PWM mode and no PCA interrupt
  167.         CCAP1H = CCAP1L = 0xff;         //PWM1 port output 0% duty cycle square wave
  168.         PCAPWM1 = 0x03;
  169.         CCAPM1 = 0x42;                  //PCA module-1 work in 8-bit PWM mode and no PCA interrupt
  170.         CR = 1;                         //PCA timer start run
  171.         SCON = 0x50;            //8-bit variable UART
  172.         
  173.         TMOD = 0x21;            //Set Timer1 as 8-bit auto reload mode
  174.         TH1 = TL1 = -(FOSC/12/32/BAUD); //Set auto-reload vaule
  175.         TR1 = 1;                //Timer1 start run
  176.         ES = 1;                 //Enable UART interrupt
  177.         
  178.         TL0 = T50MS;                     //initial timer0 low byte
  179.         TH0 = T50MS >> 8;                //initial timer0 high byte
  180.         TR0 = 1;                        //timer0 start running
  181.         ET0 = 1;                        //enable timer0 interrupt
  182.         EA = 1;                 //Open master interrupt switch
  183.         
  184.         count=0;
  185.         
  186.         flag_auto=1;
  187.         scale=128;
  188.         InitADC();
  189.         LED_ALARM =0;
  190.         initwifi();
  191.         LED_ALARM =1;
  192.         SendString("{\"cmd\":\"DR\",\"un\":\"");
  193.         SendString(un);
  194.         SendString("\",\"pwd\":\"");
  195.         SendString(password);
  196.         SendString("\",\"dc\":\"");
  197.         SendString(dc);
  198.         SendString("\"}");
  199.         finish=1;
  200.         while(1)
  201.         {
  202.                 if(flag_auto==0)
  203.                 LED_ALARM = ~rsd;
  204.                 work();
  205.                 if(appcmd ==0)                //自動(dòng)
  206.                 {
  207.                         flag_auto =0;
  208.                         appcmd =99;
  209.                 }
  210.                 else if(appcmd==1)          //切換到手動(dòng)
  211.                 {
  212.                         flag_auto =1;
  213.                         scale =128;                 //50%
  214.                         appcmd =99;
  215.                 }  
  216.                 else if(appcmd>1&&appcmd!=99)  //1-7檔 對(duì)應(yīng)  2 3 4 5 6 7 8
  217.                 {
  218.                         scale = (appcmd-2)*36;
  219.                         if(appcmd==8)
  220.                         scale =255;
  221.                         appcmd =99;
  222.                 }
  223.                 if(FlagStart==1)
  224.                 {
  225.                         sendlum[0] =lum_mean%1000/100+0x30;
  226.                         sendlum[1] =lum_mean%100/10+0x30;
  227.                         sendlum[2] =lum_mean%10+0x30;
  228.                         sendlev[0] = scale%1000/100+0x30;
  229.                         sendlev[1] = scale%100/10+0x30;
  230.                         sendlev[2] = scale%10+0x30;
  231.                         FlagStart=2;
  232.                         
  233.                         SendString("{\"cmd\":\"DTP\",\"un\":\"");
  234.                         SendString(un);
  235.                         SendString("\",\"message\":{\"lum\":\"");
  236.                         SendASC(sendlum[0]);
  237.                         SendASC(sendlum[1]);
  238.                         SendASC(sendlum[2]);
  239.                         SendString("\",\"aut\":\"");
  240.                         SendASC(flag_auto+0x30);
  241.                         SendString("\",\"lev\":\"");
  242.                         SendASC(sendlev[0]);
  243.                         SendASC(sendlev[1]);
  244.                         SendASC(sendlev[2]);
  245.                         SendString("\"}}");
  246.                         falg_count=0;
  247.                 }
  248.                 if(FlagStart>=3)
  249.                 {
  250.                         FlagStart =0;
  251.                         SendString("{\"cmd\":\"DR\",\"un\":\"");
  252.                         SendString(un);
  253.                         SendString("\",\"pwd\":\"");
  254.                         SendString(password);
  255.                         SendString("\",\"dc\":\"");
  256.                         SendString(dc);
  257.                         SendString("\"}");
  258.                         delay(100);
  259.                 }
  260.         }
  261. }

  262. void tm0_isr() interrupt 1 using 1
  263. {
  264.     TL0 = T50MS;                     //reload timer0 low byte
  265.     TH0 = T50MS >> 8;                //reload timer0 high byte
  266.         count++;                         //50ms  m++
  267.         if(count>=20)                                                  //到達(dá)1s時(shí)
  268.         {
  269.         
  270.                 falg_count++;
  271.                 if(falg_count >= 2)
  272.                 {
  273.                     falg_count =0;
  274.                    FlagStart++;
  275.                 }        
  276.                 count=0;                                                  //m=0
  277.                 if(rsd==0)                                          //熱釋電無(wú)信號(hào)時(shí)
  278.                 rsd_sec++;                                          //熱釋電計(jì)時(shí)秒++
  279.                 if(rsd_sec<=15&&rsd==1)                  //熱釋電計(jì)時(shí)秒小于等于30 并且 熱釋電有信號(hào)時(shí)
  280.                 {
  281.                         rsd_sec=0;                                  //將熱釋電秒清零
  282.                         flag_rsd=1;                                  //標(biāo)志位置1 控制AD采集數(shù)值 調(diào)節(jié)燈光亮度
  283.                 }
  284.                 else if(rsd_sec>15&&rsd==0)          //熱釋電計(jì)時(shí)秒大于30 并且 熱釋電無(wú)信號(hào)時(shí)
  285.                 {
  286.                         flag_rsd=0;                                  //標(biāo)志位置0 停止ad轉(zhuǎn)換 關(guān)閉燈光
  287.                         rsd_sec=0;                                  //熱釋電計(jì)時(shí)秒清零
  288.                 }
  289.         }
  290. }
  291. void Uart_Isr() interrupt 4 using 1
  292. {
  293.         unsigned char dat;
  294.         
  295.         if (RI)
  296.         {
  297.                 RI = 0;             //Clear receive interrupt flag
  298.                 dat = SBUF;
  299.                 if(SBUF == '\r' ||SBUF == '\n')
  300.                 {
  301.                         RsPoint =0;
  302.                 }
  303.                 if(SBUF !='\r' && SBUF !='\n' &&  SBUF !=' ')
  304.                 {
  305.                         RsBuf[RsPoint]=SBUF;
  306.                         RsPoint++;
  307.                 }
  308.                 if(RsPoint>=60)
  309.                 RsPoint = 0;
  310.                 if(finish==1)
  311.                 {
  312.                         if(Flag_rec==1)
  313.                         {
  314.                                 switch (Key_num)
  315.                                 {
  316.                                         case 'W': appcmd = dat-0x30;         LED_ALARM =~LED_ALARM;FlagStart=1; break;
  317.                                         case 'T': appcmd = dat-0x30+2  ;LED_ALARM =~LED_ALARM;FlagStart=1;  break;
  318.                                 }
  319.                                 Flag_rec=0;
  320.                         }  
  321.                         if(dat=='W'||dat=='T')
  322.                         {
  323.                                 LED_ALARM =~LED_ALARM;
  324.                                 Flag_rec=1;
  325.                                 Key_num=dat;
  326.                         }
  327.                 }
  328.         }
  329. }
復(fù)制代碼
51hei.png

全部代碼51hei下載地址:
代碼.zip (94.22 KB, 下載次數(shù): 185)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:477512 發(fā)表于 2021-6-30 06:31 | 顯示全部樓層
用什么客戶端控制?機(jī)智云?
回復(fù)

使用道具 舉報(bào)

ID:945719 發(fā)表于 2021-6-30 12:50 | 顯示全部樓層
有硬件仿真程序嗎
回復(fù)

使用道具 舉報(bào)

ID:20345 發(fā)表于 2022-2-19 19:17 | 顯示全部樓層
ADC0809,原理圖里面沒(méi)有呀。
回復(fù)

使用道具 舉報(bào)

ID:796012 發(fā)表于 2022-9-3 11:55 | 顯示全部樓層
求樓主發(fā)布E4AAPP源碼
回復(fù)

使用道具 舉報(bào)

ID:1011444 發(fā)表于 2022-9-5 21:35 | 顯示全部樓層
對(duì)單片機(jī)資源利用率太低,IO口沒(méi)用幾個(gè),有點(diǎn)資源浪費(fèi)。
回復(fù)

使用道具 舉報(bào)

ID:1048601 發(fā)表于 2022-12-11 22:40 | 顯示全部樓層
可以用
回復(fù)

使用道具 舉報(bào)

ID:433219 發(fā)表于 2022-12-12 14:08 | 顯示全部樓層

E4AAPP源碼 ,,是指缺少聯(lián)網(wǎng)部分的么???
回復(fù)

使用道具 舉報(bào)

ID:939672 發(fā)表于 2023-1-17 01:55 | 顯示全部樓層
不知道怎么用
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产精品一区二区精品 | 亚洲一区三区在线观看 | 91精品久久久久久久久 | 91久久综合亚洲鲁鲁五月天 | 超碰在线亚洲 | 好姑娘高清在线观看电影 | 欧美一级免费片 | 婷婷午夜天 | 黄色网址免费在线观看 | 欧美日韩精品中文字幕 | 国产精品久久久久久238 | 色综合久久久久 | 日韩一区二区在线视频 | 亚洲欧美日韩国产综合 | 国产精品视频网 | 99久久婷婷国产综合精品首页 | 欧美乱操 | 亚洲精品免费观看 | 免费影视在线观看 | 精品欧美久久 | 欧美在线精品一区 | 免费一区| 91麻豆精品国产91久久久久久 | 99久久精品国产一区二区三区 | www.夜夜骑 | 久久精品国产亚洲夜色av网站 | 国产精品一区二区久久 | 人人天天操 | 精品一区在线 | 久久中文字幕一区 | 国产欧美一区二区三区国产幕精品 | 午夜免费电影院 | 国产中文字幕在线 | 精品国产免费人成在线观看 | 欧美日韩精品在线免费观看 | aaa级片| 成人在线一区二区三区 | aaa精品 | 久久夜夜 | 欧美在线观看一区 | 日韩中文在线观看 |