為什么使用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下載地址:
Sheet1.zip
(29.02 KB, 下載次數: 41)
2020-5-17 14:01 上傳
點擊文件名下載附件
stc12程序.zip
(70.16 KB, 下載次數: 47)
2020-5-17 14:01 上傳
點擊文件名下載附件
遙控器.zip
(747.35 KB, 下載次數: 61)
2020-5-17 14:01 上傳
點擊文件名下載附件
|