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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于51單片機的智能臺燈帶坐姿矯正Proteus仿真設(shè)計(包含仿真和源程序)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:331717 發(fā)表于 2023-2-19 15:14 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
功能描述:
1、系統(tǒng)分為自動和手動模式,上電之后,綠色的LED燈點亮,代表當(dāng)前是自動模式。
2、通過按鍵1,可以在手動模式(綠燈滅)和自動模式(綠燈亮)之間來回切換。
3、在手動模式下,可以通過按鍵2降低亮度,按鍵3增加亮度。
4、在自動模式下,首先要檢測到有人,才進行亮度的自動控制,否則臺燈熄滅。調(diào)整光敏電阻,模擬光照的變化,從而就可以看到臺燈的亮度會隨著環(huán)境中的光照強度的改變而改變,效果是光照越弱,臺燈越亮。如果人體傳感器 1 分鐘檢測不到有人,臺燈就會自動熄滅。
5、無論是自動模式還是手動模式,都是把亮度分為 10 個等級的。
6、注意,人體感應(yīng)檢測功能只在自動模式下有效。
7、帶坐姿矯正功能,使用超聲波模塊測量距離,距離過近發(fā)出告警,提醒擺正坐姿。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include "ultrasonic_wave.h"//超聲波頭函數(shù)

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


  6. sbit LED     = P1^0;                                        // 模式指示燈,亮是自動模式,滅是手動模式
  7. sbit Lamp    = P1^4;                                         // 臺燈控制引腳
  8. sbit Key1    = P1^1;                                        // 按鍵1,模式切換按鍵
  9. sbit Key2    = P1^2;                                         // 按鍵2,亮度減少按鍵      
  10. sbit Key3    = P1^3;                                        // 按鍵3,亮度增加按鍵
  11. sbit ADC_CS  = P2^3;                                         // ADC0832的CS引腳
  12. sbit ADC_CLK = P2^0;                                         // ADC0832的CLK引腳
  13. sbit ADC_DAT = P2^1;                                         // ADC0832的DI/DO引腳
  14. sbit Module  = P2^2;                                        // 人體紅外檢測模塊
  15. sbit Beep    = P1^5;                            // 蜂鳴器引腳定義

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



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



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



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

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



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



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



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



  150. /*********************************************************/
  151. // 主函數(shù)
  152. /*********************************************************/
  153. void main()
  154. {
  155.         uchar ret;
  156.         
  157.         TimerInit();                                         // 定時器初始化
  158.         Init_ultrasonic_wave();          //超聲波定時器初始化
  159.         LED=0;                                                // 指示燈點亮(自動模式指示燈)
  160.         ret=Get_ADC0832();                // 獲取AD采集結(jié)果(環(huán)境光照強度)
  161.         AutoControl(ret);                        // 上電先進行一次自動亮度控制        
  162.         AutoControl(ret+7);
  163.         
  164.         while(1)
  165.         {

  166.             StartModule();//啟動超聲波
  167.                 while(!RX)          //當(dāng)RX為零時等待
  168.                 TR1=1;                  //開啟計數(shù)
  169.                 while(RX);          //當(dāng)RX為1計數(shù)并等待
  170.                 TR1=0;                  //關(guān)閉計數(shù)
  171.                 DelayMs(20);
  172.                                 
  173.                 Conut(); //計算距離
  174.                    //距離小于30
  175.                 if(L_ < 30)
  176.                 {                                                                 
  177. //                     Beep=~Beep;
  178. //                         DelayMs(1);        
  179. //                         Beep=~Beep;
  180. //                         DelayMs(1);
  181.                          Beep=0;
  182.                          DelayMs(200);
  183.        Beep=1;
  184.        DelayMs(200);                        
  185.                 }
  186.                 else
  187.                 Beep=1;


  188.                 /* 模式切換控制 */
  189.                 if(Key1==0)                                        // 如果按鍵1被按下去
  190.                 {
  191.                         LED=~LED;                                        // 切換LED燈狀態(tài)
  192.                         DelayMs(10);                        // 延時消除按鍵按下的抖動
  193.                         while(!Key1);                        // 等待按鍵釋放
  194.                         DelayMs(10);                        // 延時消除按鍵松開的抖動
  195.                 }
  196.                         
  197.                 /* 亮度控制 */
  198.                 if(LED==1)                                                        // 如果LED是滅的
  199.                 {
  200.                         ManualControl();                        // 則進行手動控制
  201.                         DelayMs(200);
  202.                 }
  203.                 else                                                                                // 如果LED是亮的
  204.                 {
  205.                         if(gTime<60000)
  206.                         {
  207.                                 ret=Get_ADC0832();                // 獲取AD采集結(jié)果(環(huán)境光照強度)
  208.                                 AutoControl(ret);                        // 進行自動控制        
  209.                                 DelayMs(200);
  210.                         }
  211.                 }
  212.                
  213.                 /*檢測是否有人*/
  214.                 if(Module==1)
  215.                 {
  216.                         gTime=0;                                                                                // 檢測到有人,則把60秒計時清零
  217.                 }
  218.                 if(gTime>60000)                                                                // 如果gTime的值超過了60000
  219.                 {
  220.                         gTime=60000;                                                                // 則把gTime的值重新賦值為60000,避免過大溢出
  221.                         gIndex=0;                                                                                // 如果1分鐘檢測不到有人,則把臺燈熄滅
  222.                 }
  223.         }
  224. }


  225. /*********************************************************/
  226. // 定時器0服務(wù)程序,1毫秒
  227. /*********************************************************/
  228. void Timer0(void) interrupt 1
  229. {
  230.         TH0  = 252;                                                // 給定時器0的TH0裝初值
  231.         TL0  = 24;                                                // 給定時器0的TL0裝初值        
  232.         
  233.         gTime++;                                                        // 每1毫秒,gTime變量加1
  234.         gCount++;                                                        // 每1毫秒,gCount變量加1
  235.         
  236.         if(gCount==10)                                // 如果gCount加到10了
  237.         {
  238.                 gCount=0;                                                // 則將gCount清零,進入新一輪的計數(shù)
  239.                 if(gIndex!=0)                                // 如果說臺燈不是最暗的(熄滅)
  240.                 {
  241.                         Lamp=0;                                                // 則把臺燈點亮
  242.                 }
  243.         }
  244.         if(gCount==gIndex)                // 如果gCount計數(shù)到和gIndex一樣了
  245.         {
  246.                 if(gIndex!=9)                                // 如果說臺燈不是最亮的
  247.                 {
  248.                         Lamp=1;                                                // 則把臺燈熄滅
  249.                 }
  250.         }
  251. }


  252. void time1() interrupt 3                  //T1中斷用來計數(shù)器溢出,超過測距范圍
  253. {
  254.         TH1=0;
  255.         TL1=0;
  256. }  
復(fù)制代碼

Keil代碼與Proteus8.13仿真下載:
仿真和源程序.7z (180.12 KB, 下載次數(shù): 204)

評分

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

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:1065040 發(fā)表于 2023-3-28 16:07 | 只看該作者
大佬,我參考了你的設(shè)計,把實物做出來了,但是取消了紅外熱釋電感應(yīng),大部分功能都能實現(xiàn),但是光敏電阻調(diào)光卻實現(xiàn)不了,這是為什么呢
回復(fù)

使用道具 舉報

板凳
ID:1065040 發(fā)表于 2023-3-30 00:29 | 只看該作者
補充,以上大佬程序和仿真是完全沒有問題的,如果想要實物做出來,我出現(xiàn)的狀況是無論自動還是手動模式的燈是否亮起,都只能采集通電瞬間的燈光,后面只能手動調(diào)節(jié)。解決辦法是我在按鈕KEY1翻轉(zhuǎn)那里設(shè)置了flag,把 if(LED==1) 這里的條件分成兩個while(flag==0)和while(flag==1),即不以LED為標(biāo)志,這樣是我遇到的問題以及解決辦法。有同樣情況的同學(xué)可以參考一下。
回復(fù)

使用道具 舉報

地板
ID:1102013 發(fā)表于 2023-12-1 13:19 | 只看該作者
為啥會宏文件嵌套過多呢?頭幾行
回復(fù)

使用道具 舉報

5#
ID:1101012 發(fā)表于 2023-12-4 11:59 | 只看該作者
寫的很好
回復(fù)

使用道具 舉報

6#
ID:1115937 發(fā)表于 2024-5-24 17:43 | 只看該作者
兩個反向器的作用分別是什么呀?
回復(fù)

使用道具 舉報

7#
ID:1141008 發(fā)表于 2024-12-23 16:36 | 只看該作者
我想問一下下載內(nèi)容和大佬展示的一樣嗎?
回復(fù)

使用道具 舉報

8#
ID:1137635 發(fā)表于 2025-3-19 09:32 來自手機 | 只看該作者
余tuo 發(fā)表于 2023-3-30 00:29
補充,以上大佬程序和仿真是完全沒有問題的,如果想要實物做出來,我出現(xiàn)的狀況是無論自動還是手動模式的燈 ...

你做出實物了嗎
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 黄色在线免费观看视频 | 日韩在线免费电影 | 久久精品色视频 | 免费观看毛片 | 欧美亚洲另类丝袜综合网动图 | 中文字幕精品视频在线观看 | 日本三级电影在线免费观看 | 欧洲精品视频一区 | 99热成人在线 | 在线视频中文字幕 | 色综合色综合色综合 | 亚洲精品一区二区另类图片 | 亚洲精品一区二区三区免 | 国精产品一区一区三区免费完 | 中文字幕 在线观看 | 欧美国产日韩精品 | 国产精品久久久久久久久久三级 | 免费午夜剧场 | 国产欧美日韩一区 | 成人在线视频免费观看 | 亚洲97 | 蜜臀av日日欢夜夜爽一区 | 一区二区三区国产 | 99久久久久久99国产精品免 | 一区二区三区在线观看视频 | 欧美一级二级三级视频 | 精品国产一区久久 | 久久久久久久综合 | 亚洲国产欧美国产综合一区 | 在线a视频网站 | 成人视屏在线观看 | 中文字幕av一区二区三区 | a级黄色毛片免费播放视频 国产精品视频在线观看 | 亚洲国产网| 久久一区二区免费视频 | 午夜三级在线观看 | 亚洲一区中文字幕在线观看 | 黄视频免费| 欧美一区二区三区在线观看 | 一区二区三区在线播放 | 中文字幕一二三区 |