找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6461|回复: 8
打印 上一主题 下一主题
收起左侧

C51单片机WIFI智能台灯程序,热释电红外感应,光敏电阻比例调节亮度

  [复制链接]
跳转到指定楼层
楼主
电路原理图如下:


单片机源程序如下:
  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];                   //定义空数组用于AD0809取平均值
  18. uchar FlagStart;
  19. int scale;
  20. uchar rsd_sec;                //定义占空比比例,热释电计时秒变量
  21. uchar sec,flag_auto;
  22. uchar lum_mean;
  23. uchar appcmd=99;//单片机收到的APP信号
  24. bit bdata flag_rsd;          //位定义自动切换的,闪烁标志,报警位标志,热释电动作标志,接近传感器标志
  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++)                         //将空数组tt【】内数值整体左移一位
  82.         {
  83.                 tt[b]=tt[b+1];                        //将后一数值放到前一位置
  84.         }        
  85.         tt[199] =GetADCResult(2);  //将读出的ad数值放入tt【49】

  86.         lum_all =0;
  87.         for(c=0;c<200;c++)                        //将tt【】内数值相加
  88.         {
  89.                 lum_all=lum_all+tt[c];
  90.         }

  91.         lum_mean=lum_all/200;                //将总数/50取出平均值


  92.         if(qiehuan==0)                                  //自动切换按键按下
  93.         {
  94.                 delay(10);                                  //去抖
  95.                 if(qiehuan==0)                          //再次判断按键按下
  96.                 {
  97.                         LED_ALARM =0;
  98.                         flag_auto=!flag_auto; //自动模式标志位取反
  99.                         if(flag_auto==1)          //当切换到手动模式时  首先将LED发光比例设置在50%
  100.                         scale=128;
  101.                 }
  102.                 while(!qiehuan); //按键释放  松开按键后关闭蜂鸣器
  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)                                  //减键按下时
  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)                                        //有人在范围内时
  140.                 {         
  141.                
  142.                         if(lum_mean<=90) scale=0;                           //判断取出平均值大小  小于30  发光强度0%
  143.                         else if(lum_mean>=190) scale=255;           //大于150  发光强度100%
  144.                         else scale=(lum_mean-90)*2.55;                   //其他值时将其计算得到发光强度 (计算目的是为了得到一个1-41之间的数值 控制灯光变化)        

  145.                 }
  146.                 else
  147.                 {
  148.                         scale=0;                                         //没有人在范围内时 将灯光亮度调至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)                //自动
  206.                 {
  207.                         flag_auto =0;
  208.                         appcmd =99;
  209.                 }
  210.                 else if(appcmd==1)          //切换到手动
  211.                 {
  212.                         flag_auto =1;
  213.                         scale =128;                 //50%
  214.                         appcmd =99;
  215.                 }  
  216.                 else if(appcmd>1&&appcmd!=99)  //1-7档 对应  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)                                                  //到达1s时
  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)                                          //热释电无信号时
  278.                 rsd_sec++;                                          //热释电计时秒++
  279.                 if(rsd_sec<=15&&rsd==1)                  //热释电计时秒小于等于30 并且 热释电有信号时
  280.                 {
  281.                         rsd_sec=0;                                  //将热释电秒清零
  282.                         flag_rsd=1;                                  //标志位置1 控制AD采集数值 调节灯光亮度
  283.                 }
  284.                 else if(rsd_sec>15&&rsd==0)          //热释电计时秒大于30 并且 热释电无信号时
  285.                 {
  286.                         flag_rsd=0;                                  //标志位置0 停止ad转换 关闭灯光
  287.                         rsd_sec=0;                                  //热释电计时秒清零
  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. }
复制代码


全部代码51hei下载地址:
代码.zip (94.22 KB, 下载次数: 185)

评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏11 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:477512 发表于 2021-6-30 06:31 | 只看该作者
用什么客户端控制?机智云?
回复

使用道具 举报

板凳
ID:945719 发表于 2021-6-30 12:50 | 只看该作者
有硬件仿真程序吗
回复

使用道具 举报

地板
ID:20345 发表于 2022-2-19 19:17 | 只看该作者
ADC0809,原理图里面没有呀。
回复

使用道具 举报

5#
ID:796012 发表于 2022-9-3 11:55 | 只看该作者
求楼主发布E4AAPP源码
回复

使用道具 举报

6#
ID:1011444 发表于 2022-9-5 21:35 | 只看该作者
对单片机资源利用率太低,IO口没用几个,有点资源浪费。
回复

使用道具 举报

7#
ID:1048601 发表于 2022-12-11 22:40 | 只看该作者
可以用
回复

使用道具 举报

8#
ID:433219 发表于 2022-12-12 14:08 | 只看该作者

E4AAPP源码 ,,是指缺少联网部分的么???
回复

使用道具 举报

9#
ID:939672 发表于 2023-1-17 01:55 | 只看该作者
不知道怎么用
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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