為什么使用STC12C5A60S2是因?yàn)樗詭Я薖CA和ADC,PCA可以配置為8位PWM。材料清單:
以上是材料清單,其中還需要一個(gè)COB燈和12v2a以上電源。COB燈需要是12V供電的,或者也有能力的自己改。
之前我有發(fā)過(guò)簡(jiǎn)單的半成品,現(xiàn)在快工作了,我這個(gè)設(shè)計(jì)已經(jīng)做好了,也馬上答辯了。
先介紹介紹功能吧:
1.設(shè)計(jì)具備日期時(shí)間顯示功能,應(yīng)用程序上顯示日期/時(shí)間/光線強(qiáng)度等級(jí)等內(nèi)容。
2.光線強(qiáng)度有0~10共10個(gè)等級(jí),等級(jí)越高表示照明燈越亮。 3.系統(tǒng)具有自動(dòng)/手動(dòng)模式,可通過(guò)遙控器隨時(shí)切換: (1)自動(dòng)模式:人體紅外模塊用于檢測(cè)是否有人。當(dāng)有人時(shí),照明燈根據(jù)照明情況自動(dòng)調(diào)節(jié)亮度。燈光越強(qiáng),亮度越暗,燈光越弱,照明燈的亮度就越強(qiáng)。當(dāng)檢測(cè)沒(méi)有人的時(shí)候,延遲30秒后,照明燈自動(dòng)關(guān)閉; (2)手動(dòng)模式:通過(guò)按鍵調(diào)節(jié)燈光亮度。 其中遙控是APP遙控,顯示溫濕度也是APP顯示(此處APP是由E4A編寫(xiě)). APP功能介紹:注冊(cè)登錄功能(我不是計(jì)算機(jī)專業(yè),不是用數(shù)據(jù)庫(kù),是自己想出來(lái)的一個(gè)很簡(jiǎn)單的方法)。檢測(cè)更新功能,找回密碼功能,綁定設(shè)備功能(綁定設(shè)備不完善,一個(gè)賬號(hào)目前智能綁定一個(gè)設(shè)備,這個(gè)功能很可能有bug,但是這些不屬于我設(shè)計(jì)的要求功能,所以我也就沒(méi)有特別去完善),其他就是控制電路和顯示溫濕度亮度等級(jí)了,源碼中我會(huì)刪除我的服務(wù)器信息使用******代替,這個(gè)服務(wù)器就是一個(gè)FTP空間和一個(gè)域名就可以了,網(wǎng)上有很多免費(fèi)的。 一下是部分代碼(中文注釋亂碼了,不過(guò)工程里沒(méi)有): - #include "STC12C5A.h"
- #include "string.h"
- #include "stdio.h"
- #include "DELAY.H"
- #include "adc.h"
- #include "intrins.h"
- #define uint unsigned int //對(duì)數(shù)據(jù)類型進(jìn)行聲明定義
- #define uchar unsigned char
- /************************************************************
- 因?yàn)?2單片機(jī)的AD不支持位尋址,所以用|定義寄存器執(zhí)行位。
- **************************************************************/
- sbit RT = P2^0; //溫濕度數(shù)據(jù)引腳
- sbit ren = P2^1; //人體傳感器引腳
- sbit led = P3^7;
- uchar TH_temp,TL_temp,RH_temp,RL_temp,KEY_temp;//溫濕度高低位以及驗(yàn)證密鑰
- uchar count,temp,flag,time_ren,flag_ren; //藍(lán)牙數(shù)據(jù)發(fā)送的計(jì)數(shù)緩存和溫濕度讀取標(biāo)志位等
- uchar comdata; //DHT11返回的數(shù)據(jù)
- uchar ADC_DATA; //模數(shù)轉(zhuǎn)換后亮度數(shù)據(jù)
- outdata[5]; //藍(lán)牙發(fā)送數(shù)組
- uchar str[6]="012345"; //要發(fā)送數(shù)據(jù)的緩存之地
- uchar model;
- uchar AUTO,PWM_DATA;
- char CMD[10]; //接收指令數(shù)據(jù)的緩存之地
- int CMD_COUNT=0,DATA_MAX; //接收數(shù)據(jù)的計(jì)數(shù)和數(shù)據(jù)最長(zhǎng)位數(shù)限制
- 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; //用定時(shí)器0溢出做PCA脈沖
- CL = 0x00; //PCA定時(shí)器低8位 地址:E9H
- CH = 0x00; //PCA高8位 地址 F9H
- CCON=0x00;
- CCAP0H = CCAP0L = 255; //PWM模式時(shí)他倆用來(lái)控制占空比 128=50% 0=100% 256=0%
- CCAPM0 = 0x42;
- //0100,0010 Setup PCA module 0 in PWM mode
- // ECOM0=1使能比較 PWM0=1 使能CEX0腳用作脈寬調(diào)節(jié)輸出
- /******************************************************************
- PCA 模塊工作模式設(shè)置 (CCAPMn 寄存器 n= 0-3四種)
- 7 6 5 4 3 2 1 0
- - ECOMn CAPPn CAPNn MATn TOGn PWMn ECCFn
- 選項(xiàng): 0x00 無(wú)此操作
- 0x20 16位捕捉模式,由 CEXn上升沿觸發(fā)
- 0x10 16位捕捉模式,由CEXn下降沿觸發(fā)
- 0x30 16位捕捉模式,由CEXn的跳變觸發(fā)
- 0x48 16位軟件定時(shí)器
- 0x4c 16位高速輸出
- 0x42 8位PWM輸出
- 每個(gè)PCA模塊另外還對(duì)應(yīng)兩個(gè)寄存器:CCAPnH和CCAPnL 。 捕獲或者比較時(shí),它們用來(lái)
- 保存16位計(jì)數(shù)值,當(dāng)工作于PWM模式時(shí),用來(lái)控制占空比
- **************************************************************************************/
- CR=1; //Start PCA Timer.
- }
- void UsartInit()
- {
- TMOD=0X20; //設(shè)置計(jì)數(shù)器工作方式2
- TH1=253; //計(jì)數(shù)器初始值設(shè)置,注意波特率是9600的,晶振11.0592
- TL1=253;
- SCON=0X50; //設(shè)置為工作方式1
- TR1=1;
- ES=1; //打開(kāi)接收中斷
- EA=1; //打開(kāi)總中斷 //打開(kāi)計(jì)數(shù)器
-
- }
- /**********************************************************************
- 功能;設(shè)置占空比
- ***********************************************************************/
- 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++);
- //超時(shí)則跳出for循環(huán)
- if(flag==1)break;
- //判斷數(shù)據(jù)位是0還是1
-
- // 如果高電平高過(guò)預(yù)定0高電平值則數(shù)據(jù)位為 1
-
- comdata<<=1;
- comdata|=temp; //0
- }//rof
-
- }
- //--------------------------------
- //-----濕度讀取子程序 ------------
- //--------------------------------
- //----以下變量均為全局變量--------
- //----溫度高8位== TH------
- //----溫度低8位== TL------
- //----濕度高8位== RH-----
- //----濕度低8位== RL-----
- //----校驗(yàn) 8位 == KEY-----
- //----調(diào)用相關(guān)子程序如下----------
- //---- Delay();, Delay_10us();,COM();
- //--------------------------------
- void Readdata(void)
- {
- //主機(jī)拉低18ms
- RT=0;
- Delay18ms();
- RT=1;
- //總線由上拉電阻拉高 主機(jī)延時(shí)20us
- Delay10u();
- Delay10u();
- Delay10u();
- Delay10u();
- //主機(jī)設(shè)為輸入 判斷從機(jī)響應(yīng)信號(hào)
- RT=1;
- //判斷從機(jī)是否有低電平響應(yīng)信號(hào) 如不響應(yīng)則跳出,響應(yīng)則向下運(yùn)行
- if(!RT)
- {
- flag=2;
- //判斷從機(jī)是否發(fā)出 80us 的低電平響應(yīng)信號(hào)是否結(jié)束
- while((!RT)&&flag++);
- flag=2;
- //判斷從機(jī)是否發(fā)出 80us 的高電平,如發(fā)出則進(jìn)入數(shù)據(jù)接收狀態(tài)
- while((RT)&&flag++);
- //數(shù)據(jù)接收狀態(tài)
- COM();
- RH_temp=comdata;
- COM();
- RL_temp=comdata;
- COM();
- TH_temp=comdata;
- COM();
- TL_temp=comdata;
- COM();
- KEY_temp=comdata;
- RT=1;
- //數(shù)據(jù)校驗(yàn)
-
- 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;} //大于該指令長(zhǎng)度清零
- CMD[CMD_COUNT]=SBUF;
- CMD_COUNT++;
- RI = 0;
- }
- if(TI==1) //發(fā)送中斷
- {
- TI=0;
- if(count!=6) //發(fā)送完5位數(shù)據(jù)
- {
- SBUF= outdata[count];
- count++;
- }
- }
- }
復(fù)制代碼
以下是原理圖截圖(PCB我就不提供了,我怕到時(shí)候別人說(shuō)我設(shè)計(jì)抄別人的,連PCB都一樣就很麻煩。):
1.png (54.24 KB, 下載次數(shù): 41)
下載附件
2020-5-17 13:53 上傳
app的話就不截圖了。。。,沒(méi)有server就用我編譯好的來(lái)試目前server我一直續(xù)費(fèi)。什么時(shí)候中斷我也不知道,其中主頁(yè)是我自己的網(wǎng)址,希望大家不要攻擊,因?yàn)檎娴臎](méi)有任何防御。。。。手下留情。。。。
全部資料51hei下載地址:
Sheet1.zip
(29.02 KB, 下載次數(shù): 41)
2020-5-17 14:01 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
stc12程序.zip
(70.16 KB, 下載次數(shù): 47)
2020-5-17 14:01 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
遙控器.zip
(747.35 KB, 下載次數(shù): 61)
2020-5-17 14:01 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|