找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 6082|回復(fù): 8
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)智能照明系統(tǒng)Proteus仿真圖與程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
光敏電阻+ADC0832智能分級(jí)調(diào)光,加入聲控和紅外人體檢測(cè)功能,當(dāng)環(huán)境光低于一定程度時(shí),感應(yīng)到有人和有聲音才打開燈。也可以切換成手動(dòng)模式,分級(jí)調(diào)節(jié)光的亮度。程序,原理圖仿真見附件。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)



單片機(jī)源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. #define uchar unsigned char                // 以后unsigned char就可以用uchar代替
  4. #define uint  unsigned int                // 以后unsigned int 就可以用uint 代替


  5. sbit LED     = P1^0;                                        // 模式指示燈,亮是自動(dòng)模式,滅是手動(dòng)模式
  6. sbit Lamp    = P1^4;                                         // 臺(tái)燈控制引腳
  7. sbit Key1    = P1^1;                                        // 按鍵1,模式切換按鍵
  8. sbit Key2    = P1^2;                                         // 按鍵2,亮度減少按鍵      
  9. sbit Key3    = P1^3;                                        // 按鍵3,亮度增加按鍵
  10. sbit ADC_CS  = P2^3;                                         // ADC0832的CS引腳
  11. sbit ADC_CLK = P2^0;                                         // ADC0832的CLK引腳
  12. sbit ADC_DAT = P2^1;                                         // ADC0832的DI/DO引腳
  13. sbit Module  = P2^2;                                        // 人體紅外檢測(cè)模塊
  14. sbit Sound   = P2^4;          // 聲敏傳感器模塊


  15. uchar gCount=0;                                                                // 全局計(jì)數(shù)變量
  16. uchar gIndex;                                                                        // 亮度變量,0是最暗,9是最亮,一共10檔
  17. uint  gTime=0;                                                                // 計(jì)時(shí)變量,用于計(jì)時(shí)多久沒檢測(cè)到有人



  18. /*********************************************************/
  19. // 毫秒級(jí)的延時(shí)函數(shù),time是要延時(shí)的毫秒數(shù)
  20. /*********************************************************/
  21. void DelayMs(uint time)
  22. {
  23.         uint i,j;
  24.         for(i=0;i<time;i++)
  25.                 for(j=0;j<112;j++);
  26. }



  27. /*********************************************************/
  28. // ADC0832的時(shí)鐘脈沖
  29. /*********************************************************/
  30. void WavePlus()
  31. {
  32.         _nop_();
  33.         ADC_CLK = 1;
  34.         _nop_();
  35.         ADC_CLK = 0;
  36. }



  37. /*********************************************************/
  38. // 獲取指定通道的A/D轉(zhuǎn)換結(jié)果
  39. /*********************************************************/
  40. uchar Get_ADC0832()
  41. {
  42.         uchar i;
  43.         uchar dat1=0;
  44.         uchar dat2=0;
  45.         
  46.         ADC_CLK = 0;                                // 電平初始化
  47.         ADC_DAT = 1;
  48.         _nop_();
  49.         ADC_CS = 0;
  50.         WavePlus();                                        // 起始信號(hào)
  51.         ADC_DAT = 1;
  52.         WavePlus();                                        // 通道選擇的第一位
  53.         ADC_DAT = 0;      
  54.         WavePlus();                                        // 通道選擇的第二位
  55.         ADC_DAT = 1;
  56.         
  57.         for(i=0;i<8;i++)                // 第一次讀取
  58.         {
  59.                 dat1<<=1;
  60.                 WavePlus();
  61.                 if(ADC_DAT)
  62.                         dat1=dat1|0x01;
  63.                 else
  64.                         dat1=dat1|0x00;
  65.         }
  66.         
  67.         for(i=0;i<8;i++)                // 第二次讀取
  68.         {
  69.                 dat2>>= 1;
  70.                 if(ADC_DAT)
  71.                         dat2=dat2|0x80;
  72.                 else
  73.                         dat2=dat2|0x00;
  74.                 WavePlus();
  75.         }
  76.         
  77.         _nop_();                                                // 結(jié)束此次傳輸
  78.         ADC_DAT = 1;
  79.         ADC_CLK = 1;
  80.         ADC_CS  = 1;   

  81.         if(dat1==dat2)                        // 返回采集結(jié)果
  82.                 return dat1;
  83.         else
  84.                 return 0;
  85. }



  86. /*********************************************************/
  87. // 定時(shí)器初始化
  88. /*********************************************************/
  89. void TimerInit()
  90. {
  91.         TMOD = 0x01;                                // 使用定時(shí)器0,工作方式1         
  92.         TH0  = 252;                                        // 給定時(shí)器0的TH0裝初值
  93.         TL0  = 24;                                        // 給定時(shí)器0的TL0裝初值        
  94.         ET0  = 1;                                                // 定時(shí)器0中斷使能
  95.         EA   = 1;                                                // 打開總中斷
  96.         TR0         = 1;                                                // 啟動(dòng)定時(shí)器0
  97. }



  98. /*********************************************************/
  99. // 手動(dòng)控制
  100. /*********************************************************/
  101. void ManualControl()
  102. {
  103.         // 亮度減少
  104.         if(Key2==0)                                        // 如果按鍵2被按下去
  105.         {
  106.                 if(gIndex>0)                        // 只要當(dāng)前亮度不為最低才能減少亮度
  107.                 {
  108.                         gIndex--;                                // 亮度降低一檔
  109.                         DelayMs(300);                // 延時(shí)0.3秒
  110.                 }
  111.         }
  112.         
  113.         // 亮度增加
  114.         if(Key3==0)                                        // 如果按鍵3被按下去
  115.         {
  116.                 if(gIndex<9)                        // 只要當(dāng)前亮度不為最高才能增加亮度
  117.                 {
  118.                         gIndex++;                                // 亮度增加一檔
  119.                         DelayMs(300);                // 延時(shí)0.3秒
  120.                 }
  121.         }
  122. }



  123. /*********************************************************/
  124. // 自動(dòng)控制
  125. /*********************************************************/
  126. void AutoControl(uchar num)
  127. {
  128.         if(num<59)                                                                                                                // 最亮
  129.                 gIndex=9;
  130.         else if((num>65)&&(num<81))                                                // 第二亮
  131.                 gIndex=8;
  132.         else if((num>87)&&(num<103))                                        // 第三亮
  133.                 gIndex=7;
  134.         else if((num>109)&&(num<125))
  135.                 gIndex=6;
  136.         else if((num>131)&&(num<147))
  137.                 gIndex=5;
  138.         else if((num>153)&&(num<169))
  139.                 gIndex=4;
  140.         else if((num>175)&&(num<191))
  141.                 gIndex=3;
  142.         else if((num>197)&&(num<213))
  143.                 gIndex=2;
  144.         else if((num>219)&&(num<235))
  145.                 gIndex=1;
  146.         else if(num>241)                                                                                 // 最暗
  147.                 gIndex=0;
  148. }



  149. /*********************************************************/
  150. // 主函數(shù)
  151. /*********************************************************/
  152. void main()
  153. {
  154.         uchar ret;
  155.         
  156.         TimerInit();                                         // 定時(shí)器初始化
  157.         LED=0;                                                                // 指示燈點(diǎn)亮(自動(dòng)模式指示燈)
  158.         ret=Get_ADC0832();                // 獲取AD采集結(jié)果(環(huán)境光照強(qiáng)度)
  159.         AutoControl(ret);                        // 上電先進(jìn)行一次自動(dòng)亮度控制        
  160.         AutoControl(ret+7);
  161.         
  162.         while(1)
  163.         {
  164.                 /* 模式切換控制 */
  165.                 if(Key1==0)                                        // 如果按鍵1被按下去
  166.                 {
  167.                         LED=~LED;                                        // 切換LED燈狀態(tài)
  168.                         DelayMs(10);                        // 延時(shí)消除按鍵按下的抖動(dòng)
  169.                         while(!Key1);                        // 等待按鍵釋放
  170.                         DelayMs(10);                        // 延時(shí)消除按鍵松開的抖動(dòng)
  171.                 }
  172.                         
  173.                 /* 亮度控制 */
  174.                 if(LED==1)                                                        // 如果LED是滅的
  175.                 {
  176.                         ManualControl();                        // 則進(jìn)行手動(dòng)控制
  177.                 }
  178.                 else                                                                                // 如果LED是亮的
  179.                 {
  180.                         if(gTime<60000)
  181.                         {
  182.                                 ret=Get_ADC0832();                // 獲取AD采集結(jié)果(環(huán)境光照強(qiáng)度)
  183.                                 AutoControl(ret);                        // 進(jìn)行自動(dòng)控制        
  184.                                 DelayMs(200);
  185.                         }
  186.                 }
  187.                
  188.                 /*檢測(cè)是否有人*/
  189.                 if(Module==1||Sound==1)
  190.                 {
  191.                         gTime=0;                                                                                // 檢測(cè)到有人,則把60秒計(jì)時(shí)清零
  192.                 }
  193.                 if(gTime>60000)                                                                // 如果gTime的值超過了60000
  194.                 {
  195.                         gTime=60000;                                                                // 則把gTime的值重新賦值為60000,避免過大溢出
  196.                         gIndex=0;                                                                                // 如果1分鐘檢測(cè)不到有人,則把臺(tái)燈熄滅
  197.                 }
  198.         }
  199. }


  200. /*********************************************************/
  201. // 定時(shí)器0服務(wù)程序,1毫秒
  202. /*********************************************************/
  203. void Timer0(void) interrupt 1
  204. {
  205.         TH0  = 252;                                                // 給定時(shí)器0的TH0裝初值
  206.         TL0  = 24;                                                // 給定時(shí)器0的TL0裝初值        
  207.         
  208.         gTime++;                                                        // 每1毫秒,gTime變量加1
  209.         gCount++;                                                        // 每1毫秒,gCount變量加1
  210.         
  211.         if(gCount==10)                                // 如果gCount加到10了
  212.         {
  213.                 gCount=0;                                                // 則將gCount清零,進(jìn)入新一輪的計(jì)數(shù)
  214.                 if(gIndex!=0)                                // 如果說臺(tái)燈不是最暗的(熄滅)
  215.                 {
  216.                         Lamp=0;                                                // 則把臺(tái)燈點(diǎn)亮
  217.                 }
  218.         }
  219.         if(gCount==gIndex)                // 如果gCount計(jì)數(shù)到和gIndex一樣了
  220.         {
  221.                 if(gIndex!=9)                                // 如果說臺(tái)燈不是最亮的
  222.                 {
  223.                         Lamp=1;                                                // 則把臺(tái)燈熄滅
  224.                 }
  225.         }
  226. }
復(fù)制代碼
注意仿真工程要用Proteus7.5版本打開dsn文件或者用Proteus8.8
仿真dsn文件和代碼下載:
仿真程序.7z (109.1 KB, 下載次數(shù): 225)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏20 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:710692 發(fā)表于 2021-9-13 21:29 | 只看該作者
這個(gè)需要用Proteus7.5才可以
回復(fù)

使用道具 舉報(bào)

板凳
ID:1009693 發(fā)表于 2022-3-11 15:31 | 只看該作者
看不懂,如何調(diào)試啊,代表什么現(xiàn)象啊,只看到三個(gè)燈閃爍,啥意思啊
回復(fù)

使用道具 舉報(bào)

地板
ID:1010749 發(fā)表于 2022-3-16 10:50 | 只看該作者
能否再這設(shè)計(jì)上添加WIFI模塊呢?
回復(fù)

使用道具 舉報(bào)

5#
ID:951073 發(fā)表于 2022-4-25 16:28 | 只看該作者
為什么我的燈不亮
回復(fù)

使用道具 舉報(bào)

6#
ID:1074947 發(fā)表于 2023-5-2 10:48 | 只看該作者
請(qǐng)問,這個(gè)光的檔位的分出來的
回復(fù)

使用道具 舉報(bào)

7#
ID:641483 發(fā)表于 2023-5-13 11:33 | 只看該作者
這個(gè)好 謝謝樓主分享 先收藏了
回復(fù)

使用道具 舉報(bào)

8#
ID:1107727 發(fā)表于 2024-1-3 20:33 | 只看該作者
請(qǐng)問仿真應(yīng)該怎么操作。
回復(fù)

使用道具 舉報(bào)

9#
ID:1019544 發(fā)表于 2024-3-31 15:33 | 只看該作者
必須是Protues7.5嘛
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表