久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4468|回復: 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, 下載次數: 41)
stc12程序.zip (70.16 KB, 下載次數: 47)
遙控器.zip (747.35 KB, 下載次數: 61)

評分

參與人數 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久久久久中文字 | 国产成人亚洲精品自产在线 | 国产自产c区 | 欧美日韩国产欧美 | 国产999精品久久久久久 | 午夜影院在线观看 | 麻豆久久久 | 国产欧美在线视频 | 久草视| 国产欧美日韩一区 | 亚洲精品视频播放 | 三级国产三级在线 | 中文字幕在线视频免费视频 | 日本精品裸体写真集在线观看 | 日韩中文字幕免费在线 | 久久久久国产视频 | 二区在线观看 | 亚洲美女网站 | 亚洲三区在线观看 | 成人免费小视频 | 91在线视频免费观看 | 中文字幕一区在线观看视频 | 四虎伊人| 国产毛片在线看 | 能免费看的av | 久久尤物免费一区二区三区 | 欧美爱爱视频网站 | 国产精品久久久久久高潮 | 亚洲九九色 | 日韩一区二区三区在线视频 | 天堂久久天堂综合色 | 亚洲黄色成人网 | 久久久精品国产 | 韩国主播午夜大尺度福利 | 人人叉| 日本高清精品 | av毛片免费| 国产精品一区二区无线 | 一区二区伦理电影 | 中文一区二区 | 久久51|