为什么使用STC12C5A60S2是因为它自带了PCA和ADC,PCA可以配置为8位PWM。材料清单:
以上是材料清单,其中还需要一个COB灯和12v2a以上电源。COB灯需要是12V供电的,或者也有能力的自己改。
之前我有发过简单的半成品,现在快工作了,我这个设计已经做好了,也马上答辩了。
先介绍介绍功能吧:
1.设计具备日期时间显示功能,应用程序上显示日期/时间/光线强度等级等内容。
2.光线强度有0~10共10个等级,等级越高表示照明灯越亮。 3.系统具有自动/手动模式,可通过遥控器随时切换: (1)自动模式:人体红外模块用于检测是否有人。当有人时,照明灯根据照明情况自动调节亮度。灯光越强,亮度越暗,灯光越弱,照明灯的亮度就越强。当检测没有人的时候,延迟30秒后,照明灯自动关闭; (2)手动模式:通过按键调节灯光亮度。 其中遥控是APP遥控,显示温湿度也是APP显示(此处APP是由E4A编写). APP功能介绍:注册登录功能(我不是计算机专业,不是用数据库,是自己想出来的一个很简单的方法)。检测更新功能,找回密码功能,绑定设备功能(绑定设备不完善,一个账号目前智能绑定一个设备,这个功能很可能有bug,但是这些不属于我设计的要求功能,所以我也就没有特别去完善),其他就是控制电路和显示温湿度亮度等级了,源码中我会删除我的服务器信息使用******代替,这个服务器就是一个FTP空间和一个域名就可以了,网上有很多免费的。 一下是部分代码(中文注释乱码了,不过工程里没有): - #include "STC12C5A.h"
- #include "string.h"
- #include "stdio.h"
- #include "DELAY.H"
- #include "adc.h"
- #include "intrins.h"
- #define uint unsigned int //对数据类型进行声明定义
- #define uchar unsigned char
- /************************************************************
- 因为12单片机的AD不支持位寻址,所以用|定义寄存器执行位。
- **************************************************************/
- sbit RT = P2^0; //温湿度数据引脚
- sbit ren = P2^1; //人体传感器引脚
- sbit led = P3^7;
- uchar TH_temp,TL_temp,RH_temp,RL_temp,KEY_temp;//温湿度高低位以及验证密钥
- uchar count,temp,flag,time_ren,flag_ren; //蓝牙数据发送的计数缓存和温湿度读取标志位等
- uchar comdata; //DHT11返回的数据
- uchar ADC_DATA; //模数转换后亮度数据
- outdata[5]; //蓝牙发送数组
- uchar str[6]="012345"; //要发送数据的缓存之地
- uchar model;
- uchar AUTO,PWM_DATA;
- char CMD[10]; //接收指令数据的缓存之地
- int CMD_COUNT=0,DATA_MAX; //接收数据的计数和数据最长位数限制
- SendData(uchar *a)
- {
- outdata[0] = a[0];
- outdata[1] = a[1];
- outdata[2] = a[2];
- outdata[3] = a[3];
- outdata[4] = a[4];
- outdata[5] = a[5];
- count = 1;
- SBUF=outdata[0];
- }
- void init_pwm()
- {
- CMOD = 0x02; //用定时器0溢出做PCA脉冲
- CL = 0x00; //PCA定时器低8位 地址:E9H
- CH = 0x00; //PCA高8位 地址 F9H
- CCON=0x00;
- CCAP0H = CCAP0L = 255; //PWM模式时他俩用来控制占空比 128=50% 0=100% 256=0%
- CCAPM0 = 0x42;
- //0100,0010 Setup PCA module 0 in PWM mode
- // ECOM0=1使能比较 PWM0=1 使能CEX0脚用作脉宽调节输出
- /******************************************************************
- PCA 模块工作模式设置 (CCAPMn 寄存器 n= 0-3四种)
- 7 6 5 4 3 2 1 0
- - ECOMn CAPPn CAPNn MATn TOGn PWMn ECCFn
- 选项: 0x00 无此操作
- 0x20 16位捕捉模式,由 CEXn上升沿触发
- 0x10 16位捕捉模式,由CEXn下降沿触发
- 0x30 16位捕捉模式,由CEXn的跳变触发
- 0x48 16位软件定时器
- 0x4c 16位高速输出
- 0x42 8位PWM输出
- 每个PCA模块另外还对应两个寄存器:CCAPnH和CCAPnL 。 捕获或者比较时,它们用来
- 保存16位计数值,当工作于PWM模式时,用来控制占空比
- **************************************************************************************/
- CR=1; //Start PCA Timer.
- }
- void UsartInit()
- {
- TMOD=0X20; //设置计数器工作方式2
- TH1=253; //计数器初始值设置,注意波特率是9600的,晶振11.0592
- TL1=253;
- SCON=0X50; //设置为工作方式1
- TR1=1;
- ES=1; //打开接收中断
- EA=1; //打开总中断 //打开计数器
-
- }
- /**********************************************************************
- 功能;设置占空比
- ***********************************************************************/
- void set_pwm(uchar ZKB)
- {
- CCAP0H = CCAP0L = ZKB;
- }
- void COM(void)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
-
- flag=2;
- while((!RT)&&flag++);
- Delay10u();
- Delay10u();
- Delay10u();
- temp=0;
- if(RT)temp=1;
- flag=2;
- while((RT)&&flag++);
- //超时则跳出for循环
- if(flag==1)break;
- //判断数据位是0还是1
-
- // 如果高电平高过预定0高电平值则数据位为 1
-
- comdata<<=1;
- comdata|=temp; //0
- }//rof
-
- }
- //--------------------------------
- //-----湿度读取子程序 ------------
- //--------------------------------
- //----以下变量均为全局变量--------
- //----温度高8位== TH------
- //----温度低8位== TL------
- //----湿度高8位== RH-----
- //----湿度低8位== RL-----
- //----校验 8位 == KEY-----
- //----调用相关子程序如下----------
- //---- Delay();, Delay_10us();,COM();
- //--------------------------------
- void Readdata(void)
- {
- //主机拉低18ms
- RT=0;
- Delay18ms();
- RT=1;
- //总线由上拉电阻拉高 主机延时20us
- Delay10u();
- Delay10u();
- Delay10u();
- Delay10u();
- //主机设为输入 判断从机响应信号
- RT=1;
- //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
- if(!RT)
- {
- flag=2;
- //判断从机是否发出 80us 的低电平响应信号是否结束
- while((!RT)&&flag++);
- flag=2;
- //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
- while((RT)&&flag++);
- //数据接收状态
- COM();
- RH_temp=comdata;
- COM();
- RL_temp=comdata;
- COM();
- TH_temp=comdata;
- COM();
- TL_temp=comdata;
- COM();
- KEY_temp=comdata;
- RT=1;
- //数据校验
-
- temp=(TH_temp+TL_temp+RH_temp+RL_temp);
- if(temp==KEY_temp)
- {
- str[0]=RH_temp;
- str[1]=RL_temp;
- str[2]=TH_temp;
- str[3]=TL_temp;
- str[4]=KEY_temp;
- }//fi
- }//fi
- }
- void main()
- {
- uint ge,shi,bai;
- UsartInit();//串口初始化
- ADC_Init(0x01);
- init_pwm();//PWM初始化
- DATA_MAX=3;
- model=0;
- CMD[0]='2';CMD[1]='5';CMD[2]='2';
- while(1)
- {
- if(CMD[0]=='S'&&CMD[1]=='D')model=0;
- if(CMD[0]=='Z'&&CMD[1]=='D')model=1;
- if(model==0)
- {
- if(CMD[0]=='0') bai=0;
- else if(CMD[0]=='1') bai=1;
- else if(CMD[0]=='2') bai=2;
- else if(CMD[0]=='3') bai=3;
- else if(CMD[0]=='4') bai=4;
- else if(CMD[0]=='5') bai=5;
- else if(CMD[0]=='6') bai=6;
- else if(CMD[0]=='7') bai=7;
- else if(CMD[0]=='8') bai=8;
- else if(CMD[0]=='9') bai=9;
- else bai=-1;
- if(CMD[1]=='0') shi=0;
- else if(CMD[1]=='1') shi=1;
- else if(CMD[1]=='2') shi=2;
- else if(CMD[1]=='3') shi=3;
- else if(CMD[1]=='4') shi=4;
- else if(CMD[1]=='5') shi=5;
- else if(CMD[1]=='6') shi=6;
- else if(CMD[1]=='7') shi=7;
- else if(CMD[1]=='8') shi=8;
- else if(CMD[1]=='9') shi=9;
- else shi=-1;
- if(CMD[2]=='0') ge=0;
- else if(CMD[2]=='1') ge=1;
- else if(CMD[2]=='2') ge=2;
- else if(CMD[2]=='3') ge=3;
- else if(CMD[2]=='4') ge=4;
- else if(CMD[2]=='5') ge=5;
- else if(CMD[2]=='6') ge=6;
- else if(CMD[2]=='7') ge=7;
- else if(CMD[2]=='8') ge=8;
- else if(CMD[2]=='9') ge=9;
- else ge=-1;
- set_pwm(bai*100+shi*10+ge);
- ADC_DATA=bai*100+shi*10+ge;
- }
- if(model==1)
- {
- if(ren==0){time_ren=time_ren+1;}
- if(time_ren>=15){flag_ren=1;time_ren=0;}
- if(ren==1){flag_ren=0;time_ren=0;}
- if(time_ren<=15&&flag_ren==0)
- {
- ADC_DATA=(Get_Adc_Average(0,5)*5*11.9/256);
- set_pwm(255-ADC_DATA);
- }
- if(flag_ren==1){ADC_DATA=0xff;set_pwm(255);}
- }
- str[5]=ADC_DATA;
- Readdata();
-
- //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));
- SendData(str);
- Delay1000ms();Delay1000ms();
- CMD_COUNT=0;
- }
- }
- void Usart() interrupt 4
- {
- if(RI==1)
- {
- if(CMD_COUNT>=DATA_MAX){CMD_COUNT=0;} //大于该指令长度清零
- CMD[CMD_COUNT]=SBUF;
- CMD_COUNT++;
- RI = 0;
- }
- if(TI==1) //发送中断
- {
- TI=0;
- if(count!=6) //发送完5位数据
- {
- SBUF= outdata[count];
- count++;
- }
- }
- }
复制代码
以下是原理图截图(PCB我就不提供了,我怕到时候别人说我设计抄别人的,连PCB都一样就很麻烦。): app的话就不截图了。。。,没有server就用我编译好的来试目前server我一直续费。什么时候中断我也不知道,其中主页是我自己的网址,希望大家不要攻击,因为真的没有任何防御。。。。手下留情。。。。
全部资料51hei下载地址:
|