找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3208|回复: 7
收起左侧

12单片机的PWM智能照明灯程序设计+APPE4A源码

[复制链接]
ID:229772 发表于 2020-5-17 14:03 | 显示全部楼层 |阅读模式
为什么使用STC12C5A60S2是因为它自带了PCA和ADC,PCA可以配置为8位PWM。材料清单:

材料
数量
IC锁紧座活动插座
1
STC12C5A60S2
1
IR2104
1
TPS7333
1
B1205S-2W
1
1N5819
3
1N4729
1
74LVC245
1
IR7843
2
HC-05
1
HC-SR1
1
DHT11
1
电容电阻排针
若干
以上是材料清单,其中还需要一个COB灯和12v2a以上电源。COB灯需要是12V供电的,或者也有能力的自己改。
之前我有发过简单的半成品,现在快工作了,我这个设计已经做好了,也马上答辩了。
先介绍介绍功能吧:
    1.设计具备日期时间显示功能,应用程序上显示日期/时间/光线强度等级等内容。
2.光线强度有0~10共10个等级,等级越高表示照明灯越亮。
3.系统具有自动/手动模式,可通过遥控器随时切换:
1)自动模式:人体红外模块用于检测是否有人。当有人时,照明灯根据照明情况自动调节亮度。灯光越强,亮度越暗,灯光越弱,照明灯的亮度就越强。当检测没有人的时候,延迟30秒后,照明灯自动关闭;
2)手动模式:通过按键调节灯光亮度。
其中遥控是APP遥控,显示温湿度也是APP显示(此处APP是由E4A编写).
APP功能介绍:注册登录功能(我不是计算机专业,不是用数据库,是自己想出来的一个很简单的方法)。检测更新功能,找回密码功能,绑定设备功能(绑定设备不完善,一个账号目前智能绑定一个设备,这个功能很可能有bug,但是这些不属于我设计的要求功能,所以我也就没有特别去完善),其他就是控制电路和显示温湿度亮度等级了,源码中我会删除我的服务器信息使用******代替,这个服务器就是一个FTP空间和一个域名就可以了,网上有很多免费的。
一下是部分代码(中文注释乱码了,不过工程里没有):
  1. #include "STC12C5A.h"
  2. #include "string.h"
  3. #include "stdio.h"
  4. #include "DELAY.H"
  5. #include "adc.h"
  6. #include "intrins.h"
  7. #define uint unsigned int         //对数据类型进行声明定义
  8. #define uchar unsigned char
  9. /************************************************************
  10. 因为12单片机的AD不支持位寻址,所以用|定义寄存器执行位。
  11. **************************************************************/

  12. sbit RT = P2^0;   //温湿度数据引脚
  13. sbit ren = P2^1;  //人体传感器引脚
  14. sbit led = P3^7;

  15. uchar TH_temp,TL_temp,RH_temp,RL_temp,KEY_temp;//温湿度高低位以及验证密钥
  16. uchar count,temp,flag,time_ren,flag_ren;      //蓝牙数据发送的计数缓存和温湿度读取标志位等
  17. uchar comdata;                                 //DHT11返回的数据
  18. uchar ADC_DATA;                                //模数转换后亮度数据
  19. outdata[5];                                    //蓝牙发送数组
  20. uchar str[6]="012345";                         //要发送数据的缓存之地
  21. uchar model;
  22. uchar AUTO,PWM_DATA;
  23. char CMD[10];                                  //接收指令数据的缓存之地
  24. int CMD_COUNT=0,DATA_MAX;                      //接收数据的计数和数据最长位数限制

  25. SendData(uchar *a)
  26. {
  27.         outdata[0] = a[0];
  28.         outdata[1] = a[1];
  29.         outdata[2] = a[2];
  30.         outdata[3] = a[3];
  31.         outdata[4] = a[4];
  32.         outdata[5] = a[5];
  33.         count = 1;
  34.         SBUF=outdata[0];
  35. }

  36. void init_pwm()
  37. {
  38.         CMOD = 0x02; //用定时器0溢出做PCA脉冲
  39.         CL = 0x00; //PCA定时器低8位 地址:E9H
  40.         CH = 0x00; //PCA高8位 地址 F9H
  41.         CCON=0x00;
  42.         CCAP0H = CCAP0L = 255; //PWM模式时他俩用来控制占空比   128=50%   0=100%  256=0%
  43.         CCAPM0 = 0x42;
  44. //0100,0010 Setup PCA module 0 in PWM mode
  45. // ECOM0=1使能比较 PWM0=1 使能CEX0脚用作脉宽调节输出
  46. /******************************************************************
  47. PCA 模块工作模式设置 (CCAPMn 寄存器 n= 0-3四种)
  48. 7     6        5        4       3       2     1      0
  49. -   ECOMn   CAPPn     CAPNn   MATn     TOGn   PWMn   ECCFn
  50. 选项: 0x00 无此操作
  51.        0x20 16位捕捉模式,由 CEXn上升沿触发
  52.        0x10 16位捕捉模式,由CEXn下降沿触发
  53.        0x30 16位捕捉模式,由CEXn的跳变触发
  54.        0x48 16位软件定时器
  55.        0x4c 16位高速输出
  56.        0x42  8位PWM输出
  57. 每个PCA模块另外还对应两个寄存器:CCAPnH和CCAPnL 。  捕获或者比较时,它们用来
  58. 保存16位计数值,当工作于PWM模式时,用来控制占空比
  59. **************************************************************************************/      
  60.         CR=1; //Start PCA Timer.

  61. }
  62. void UsartInit()
  63. {     
  64.         TMOD=0X20;                        //设置计数器工作方式2
  65.         TH1=253;                                //计数器初始值设置,注意波特率是9600的,晶振11.0592
  66.         TL1=253;
  67.         SCON=0X50;                        //设置为工作方式1
  68.         TR1=1;
  69.         ES=1;                                                //打开接收中断
  70.         EA=1;                                                //打开总中断                                             //打开计数器   
  71.         
  72. }
  73. /**********************************************************************
  74. 功能;设置占空比
  75. ***********************************************************************/
  76. void set_pwm(uchar ZKB)
  77. {
  78.         CCAP0H = CCAP0L = ZKB;
  79. }
  80. void  COM(void)
  81. {
  82.         uchar i;               
  83.         for(i=0;i<8;i++)           
  84.         {
  85.         
  86.                 flag=2;        
  87.                 while((!RT)&&flag++);
  88.                 Delay10u();
  89.                         Delay10u();
  90.                 Delay10u();
  91.                         temp=0;
  92.                  if(RT)temp=1;
  93.                         flag=2;
  94.          while((RT)&&flag++);
  95.                 //超时则跳出for循环                  
  96.                  if(flag==1)break;
  97.                 //判断数据位是0还是1         
  98.                         
  99.         // 如果高电平高过预定0高电平值则数据位为 1
  100.                  
  101.                  comdata<<=1;
  102.                          comdata|=temp;        //0
  103.         }//rof
  104.          
  105. }

  106.         //--------------------------------
  107.         //-----湿度读取子程序 ------------
  108.         //--------------------------------
  109.         //----以下变量均为全局变量--------
  110.         //----温度高8位== TH------
  111.         //----温度低8位== TL------
  112.         //----湿度高8位== RH-----
  113.         //----湿度低8位== RL-----
  114.         //----校验 8位 == KEY-----
  115.         //----调用相关子程序如下----------
  116.         //---- Delay();, Delay_10us();,COM();
  117.         //--------------------------------

  118.         void Readdata(void)
  119.         {
  120.           //主机拉低18ms
  121.        RT=0;
  122.            Delay18ms();
  123.            RT=1;
  124.          //总线由上拉电阻拉高 主机延时20us
  125.            Delay10u();
  126.            Delay10u();
  127.            Delay10u();
  128.            Delay10u();
  129.          //主机设为输入 判断从机响应信号
  130.            RT=1;
  131.          //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行         
  132.            if(!RT)                 
  133.            {
  134.            flag=2;
  135.          //判断从机是否发出 80us 的低电平响应信号是否结束         
  136.            while((!RT)&&flag++);
  137.            flag=2;
  138.          //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
  139.            while((RT)&&flag++);
  140.          //数据接收状态                 
  141.            COM();
  142.            RH_temp=comdata;
  143.            COM();
  144.            RL_temp=comdata;
  145.            COM();
  146.            TH_temp=comdata;
  147.            COM();
  148.            TL_temp=comdata;
  149.            COM();
  150.            KEY_temp=comdata;
  151.            RT=1;
  152.          //数据校验
  153.          
  154.            temp=(TH_temp+TL_temp+RH_temp+RL_temp);
  155.            if(temp==KEY_temp)
  156.            {
  157.                      str[0]=RH_temp;
  158.                      str[1]=RL_temp;
  159.                     str[2]=TH_temp;
  160.                      str[3]=TL_temp;
  161.                      str[4]=KEY_temp;
  162.            }//fi
  163.            }//fi

  164. }
  165. void main()
  166. {
  167.         uint ge,shi,bai;
  168.         UsartInit();//串口初始化
  169.         ADC_Init(0x01);
  170.         init_pwm();//PWM初始化
  171.         DATA_MAX=3;
  172.         model=0;
  173.         CMD[0]='2';CMD[1]='5';CMD[2]='2';
  174.         while(1)
  175.         {
  176.                 if(CMD[0]=='S'&&CMD[1]=='D')model=0;
  177.                 if(CMD[0]=='Z'&&CMD[1]=='D')model=1;
  178.                 if(model==0)
  179.                 {
  180.                         if(CMD[0]=='0')       bai=0;
  181.                         else if(CMD[0]=='1')  bai=1;        
  182.                         else if(CMD[0]=='2')  bai=2;
  183.                         else if(CMD[0]=='3')  bai=3;
  184.                         else if(CMD[0]=='4')  bai=4;
  185.                         else if(CMD[0]=='5')  bai=5;
  186.                         else if(CMD[0]=='6')  bai=6;
  187.                         else if(CMD[0]=='7')  bai=7;
  188.                         else if(CMD[0]=='8')  bai=8;
  189.                         else if(CMD[0]=='9')  bai=9;
  190.                         else bai=-1;
  191.                         if(CMD[1]=='0')       shi=0;
  192.                         else if(CMD[1]=='1')  shi=1;
  193.                         else if(CMD[1]=='2')  shi=2;
  194.                         else if(CMD[1]=='3')  shi=3;
  195.                         else if(CMD[1]=='4')  shi=4;
  196.                         else if(CMD[1]=='5')  shi=5;
  197.                         else if(CMD[1]=='6')  shi=6;
  198.                         else if(CMD[1]=='7')  shi=7;
  199.                         else if(CMD[1]=='8')  shi=8;
  200.                         else if(CMD[1]=='9')  shi=9;
  201.                         else shi=-1;
  202.                         if(CMD[2]=='0')       ge=0;
  203.                         else if(CMD[2]=='1')  ge=1;
  204.                         else if(CMD[2]=='2')  ge=2;
  205.                         else if(CMD[2]=='3')  ge=3;
  206.                         else if(CMD[2]=='4')  ge=4;
  207.                         else if(CMD[2]=='5')  ge=5;
  208.                         else if(CMD[2]=='6')  ge=6;
  209.                         else if(CMD[2]=='7')  ge=7;
  210.                         else if(CMD[2]=='8')  ge=8;
  211.                         else if(CMD[2]=='9')  ge=9;
  212.                         else ge=-1;
  213.                         set_pwm(bai*100+shi*10+ge);
  214.                         ADC_DATA=bai*100+shi*10+ge;
  215.          }
  216.          if(model==1)
  217.          {
  218.                  if(ren==0){time_ren=time_ren+1;}
  219.                  if(time_ren>=15){flag_ren=1;time_ren=0;}
  220.                  if(ren==1){flag_ren=0;time_ren=0;}
  221.                  if(time_ren<=15&&flag_ren==0)
  222.                  {
  223.                          ADC_DATA=(Get_Adc_Average(0,5)*5*11.9/256);
  224.                          set_pwm(255-ADC_DATA);
  225.                  }
  226.                  if(flag_ren==1){ADC_DATA=0xff;set_pwm(255);}
  227.          }
  228.                 str[5]=ADC_DATA;
  229.                 Readdata();
  230.                
  231.                 //str[0]=AUTO;str[1]=ADC_DATA;str[2]=PWM_DATA;str[3]=str[0]*10+str[1];str[4]=((CMD[0]-0X30)*100+(CMD[1]-0X30)*10+(CMD[2]-0X30));
  232.                 SendData(str);
  233.                 Delay1000ms();Delay1000ms();
  234.           CMD_COUNT=0;
  235.         }
  236. }
  237. void Usart() interrupt 4
  238. {
  239.           if(RI==1)
  240.                 {
  241.                         if(CMD_COUNT>=DATA_MAX){CMD_COUNT=0;}   //大于该指令长度清零
  242.                         CMD[CMD_COUNT]=SBUF;
  243.                         CMD_COUNT++;
  244.                         RI = 0;
  245.                 }
  246.                 if(TI==1) //发送中断         
  247.                 {
  248.                         TI=0;
  249.                         if(count!=6) //发送完5位数据         
  250.                         {
  251.                                 SBUF= outdata[count];
  252.                                 count++;
  253.                         }
  254.                 }
  255. }
复制代码

以下是原理图截图(PCB我就不提供了,我怕到时候别人说我设计抄别人的,连PCB都一样就很麻烦。):
1.png
app的话就不截图了。。。,没有server就用我编译好的来试目前server我一直续费。什么时候中断我也不知道,其中主页是我自己的网址,希望大家不要攻击,因为真的没有任何防御。。。。手下留情。。。。

全部资料51hei下载地址:

Sheet1.zip (29.02 KB, 下载次数: 39)

评分

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

查看全部评分

回复

使用道具 举报

ID:229772 发表于 2020-5-17 18:55 | 显示全部楼层
我觉得资源还行啊
咋没人
回复

使用道具 举报

ID:754287 发表于 2020-5-17 20:54 | 显示全部楼层
2695154202 发表于 2020-5-17 18:55
我觉得资源还行啊
咋没人

老哥,我的题目是51单片机的RGB灯,没有整体电路原理图
回复

使用道具 举报

ID:754287 发表于 2020-5-17 20:58 | 显示全部楼层
老哥啊在?
回复

使用道具 举报

ID:130231 发表于 2020-5-18 13:10 | 显示全部楼层
请教你在哪里做server?
回复

使用道具 举报

ID:229772 发表于 2020-5-21 20:29 | 显示全部楼层

在在在  我不知道为什么没有新消息提醒,RGB的话看你是那种RGB,一般情况下三极管驱动就够了
回复

使用道具 举报

ID:229772 发表于 2020-5-21 20:30 | 显示全部楼层

就是免费的空间FTP,APP里面填好地址账号密码端口默认21就可以了
回复

使用道具 举报

ID:992710 发表于 2022-10-11 15:36 来自手机 | 显示全部楼层
E4A源码打不开呀
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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