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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8129|回復: 9
收起左側

51單片機光敏電阻+步進電機雙軸自動追光系統程序原理圖設計

  [復制鏈接]
ID:975909 發表于 2022-5-16 08:31 | 顯示全部樓層 |閱讀模式
制作出來的單片機雙軸自動追光系統實物圖如下:
51hei.png

51單片機雙軸自動追光系統主要由STC89C52RC + 5516光敏電阻 + ADC0832+ ULN2803 + 步進電機 + LCD1602顯示屏組成。
1.通過子電路板的上、下、左、右四個光敏電阻來感受四個方向的光強,自動尋找光強最強的方向。四個光敏電阻的分壓電路將測得的光強轉換為電信號,再通過兩個ADC0832 轉換為數字量,單片機對數據進行比較處理之后進行顯示并輸出控制信號通過ULN2803芯片驅動步進電機轉動。
2.系統共設置有兩個模式,自動模式與手動模式,可通過按鍵切換。
3.自動模式下分為尋光與避光模式,尋光模式下系統會自動尋找光照最強的地方,避光模式下系統會避開光照強烈的地方,可通過按鍵切換。
4.手動模式下可通過上下左右四個按鍵(只在手動模式有效)來控制電機的轉動。
5.LCD1602 液晶屏實時顯示ADC芯片轉換的光敏數值
注意:由于系統功率有限,無法同時有效驅動顯示屏和兩個電機的運轉,當所有器件均由電源線一個口供電時電機運轉緩慢, 同時電機運轉時會拉低整個系統的電壓,顯示屏會變暗,所以需要外接電池盒對兩個步進電機進行單獨供電,經過測試,接四節5 號南孚電池電機能正常運轉,接三節5號南孚電池電機雖能運轉但力矩過小(電機轉動的力太小) ,稍微有障礙物或者控制線的阻擋就轉不動了。 (電池盒電源線的夾子夾在左下角的P6 上,紅夾子夾 + 號一端,黑夾子夾 - 號端)

電路原理圖如下:
51hei.png 51hei.png

還有原理圖及實物圖和Altium Designer-原理圖及PCB工程因為文件太大沒法上傳

  • 將上下兩部分連接的排線接好,兩個電路板插口處上有文字標識,要對應插好,不要接反了
上 - 上
下  - 下
左  - 左
右  - 右
GND  - GND
VCC  - VCC
  •            將上下用螺絲連接起來
這根長螺絲插到底座上,如右圖



3.
將小螺絲刀插入底座上的黑色小螺絲,擰緊,上下主體連接完畢
            
4.連接電機排線
上面這個電機的線插到最左邊帶有‘Y方向’標識的接口,紅線朝右
下面這個電機的線插到中間帶有‘X方向’標識的接口,紅線朝右

5.檢查線,屏幕是否插好,檢查無誤后接上電源線,打開電池盒背部的開關,打開板子上的電源開關,屏幕點亮,自動顯示A/D轉換的值,開機默認自動尋光模式。(用安卓線供電無需電池盒)


單片機源程序如下:
  1. #include <reg52.h>
  2. #include "Delay.h"
  3. #include "ADC0832.h"
  4. #include "LCD1602.h"
  5. #include "StepMotor.h"

  6. #define uchar unsigned char        //宏定義
  7. #define uint  unsigned int        //宏定義

  8. #define Light_Sensty  3                 //感光靈敏度

  9. sbit Key_Pattern = P3^4;        //模式切換
  10. sbit Key_Blk_or_Lgt = P3^5;        //自動尋/避光
  11. sbit Key_Up           =        P3^0;         //上按鍵
  12. sbit Key_Down         =         P3^1;         //下按鍵
  13. sbit Key_Left         =         P3^2;         //左按鍵
  14. sbit Key_Right        =         P3^3;         //右按鍵

  15. uchar Up_data,Down_data,Right_data,Left_data;//X,Y方向的光照數值
  16. bit flag_Blk_or_Lgt;        //用于切換尋黑、尋光
  17. bit flag_Auto_or_Hand;        //用于切換自動、手動


  18. uchar code *DIS1=" Welcome to use ";
  19. uchar code *DIS2=" Wait a jiff    ";
  20. uchar code *DIS3="                ";
  21. uchar code table[]={0,1,2,3,4,5,6,7,8,9};//顯示數字碼表

  22. /********************************************************************
  23. * 名稱 : void DataDisplay(void)
  24. * 功能 : 獲取光照數值的個、十、百位的數
  25. * 輸入 : 無
  26. * 輸出 : 無
  27. ***********************************************************************/
  28. typedef struct LIGHT         
  29. {
  30.         uchar bai1,shi1,ge1; //上下
  31.         uchar bai2,shi2,ge2; //左右
  32. }LIGHT1;
  33. LIGHT1 AD1,AD2;

  34. void DisplayInit(void)
  35. {
  36.         L1602_string(1,1,DIS1);//開機顯示
  37.            L1602_string(2,1,DIS2);   
  38.            DelayMs(200);
  39.            L1602_char(2,13,'.');
  40.            DelayMs(200);
  41.            L1602_char(2,14,'.');
  42.            DelayMs(200);
  43.            L1602_char(2,15,'.');
  44.            DelayMs(300);  
  45.            L1602_string(1,1,"U:000 D:000 Auto");        //開機顯示
  46.            L1602_string(2,1,"L:000 R:000 Sun ");
  47. }

  48. /********************************************************************
  49. * 名稱 : void DataDisplay(void)
  50. * 功能 : 光照數值顯示
  51. * 輸入 : 無
  52. * 輸出 : 無
  53. ***********************************************************************/
  54. void DataDisplay(void)
  55. {
  56.         uchar i;
  57.         for(i=0;i<5;i++)
  58.         {Up_data = Adc0832_Read_1(0);}Delayus(100);         //獲取上方電壓值                           

  59.         for(i=0;i<5;i++)
  60.         {Down_data = Adc0832_Read_1(1);}Delayus(100);         //獲取下方電壓值                           

  61.         for(i=0;i<5;i++)
  62.         {Right_data = Adc0832_Read_2(0);}Delayus(100);        //獲取右方電壓值                 

  63.         for(i=0;i<5;i++)
  64.         {Left_data = Adc0832_Read_2(1);}Delayus(100);        //獲取左方電壓值
  65.         
  66.         

  67.         AD1.bai1 = Up_data/100%10;                  //分離百位
  68.         AD1.shi1 = Up_data/10%10;                  //分離十位
  69.         AD1.ge1  = Up_data%10;                          //分離個位

  70.         AD1.bai2 = Down_data/100%10;
  71.         AD1.shi2 = Down_data/10%10;
  72.         AD1.ge2  = Down_data%10;

  73.         AD2.bai1 = Right_data/100%10;
  74.         AD2.shi1 = Right_data/10%10;
  75.         AD2.ge1  = Right_data%10;

  76.         AD2.bai2 = Left_data/100%10;
  77.         AD2.shi2 = Left_data/10%10;
  78.         AD2.ge2  = Left_data%10;

  79.         L1602_char(1,3,table[AD1.bai1]+0X30); //顯示百位
  80.         L1602_char(1,4,table[AD1.shi1]+0X30); //顯示十位
  81.         L1602_char(1,5,table[AD1.ge1]+0X30);  //顯示個位
  82.         DelayMs(5);                                                          //延時5毫秒
  83.         L1602_char(1,9,table[AD1.bai2]+0X30);
  84.         L1602_char(1,10,table[AD1.shi2]+0X30);
  85.         L1602_char(1,11,table[AD1.ge2]+0X30);
  86.         DelayMs(5);
  87.         L1602_char(2,3,table[AD2.bai1]+0X30);
  88.         L1602_char(2,4,table[AD2.shi1]+0X30);
  89.         L1602_char(2,5,table[AD2.ge1]+0X30);
  90.         DelayMs(5);
  91.         L1602_char(2,9,table[AD2.bai2]+0X30);
  92.         L1602_char(2,10,table[AD2.shi2]+0X30);
  93.         L1602_char(2,11,table[AD2.ge2]+0X30);
  94.         DelayMs(5);

  95.         if(flag_Auto_or_Hand)         //自動模式時顯示
  96.         {
  97.                 L1602_string(1,13,"Auto");
  98.                 if(flag_Blk_or_Lgt)
  99.                 {
  100.                         L1602_string(2,13,"Sun ");
  101.                 }
  102.                 else
  103.                 {
  104.                         L1602_string(2,13,"Dark");
  105.                 }
  106.         }
  107.         else                                    //手動模式時顯示
  108.         {
  109.                 L1602_string(1,13,"Hand");
  110.                 L1602_string(2,13,"    ");
  111.         }


  112. }

  113. /********************************************************************
  114. * 名稱 : void Auto_Mode(void)
  115. * 功能 : 自動模式
  116. * 輸入 : 無
  117. * 輸出 : 無
  118. ***********************************************************************/
  119. void Auto_Mode(void)
  120. {
  121.         int Value_Y,Value_X;
  122.         Value_Y=(int)Up_data-(int)Down_data;   //上下光照值差值
  123.         Value_X=(int)Right_data-(int)Left_data;//左右光照值差值
  124.         
  125.         if(flag_Blk_or_Lgt)//尋光
  126.         {
  127.                 if(Value_Y<(-Light_Sensty))        //上方光照值小于下方光照值
  128.                 {Motor_Down();}                //下轉
  129.                 else if(Value_Y>Light_Sensty)        //上方光照值大于下方光照值
  130.                 {Motor_Up();}                 //上轉
  131.                 else if((Value_Y>(-Light_Sensty))&&(Value_Y<Light_Sensty))//上  下光照值相差不大
  132.                 {Motor1_Stop();}        //停止

  133.                 if(Value_X<(-Light_Sensty))        //右方光照值小于左方光照值
  134.                 {Motor_Left();}                //左轉
  135.                 else if(Value_X>Light_Sensty)        //右方光照值大于左方光照值
  136.                 {Motor_Right();}        //右轉
  137.                 else if((Value_Y>(-Light_Sensty))&&(Value_Y<Light_Sensty))//左右光照值相差不大
  138.                 {Motor2_Stop();}        //停止
  139.         }
  140.         else                           //避光
  141.         {

  142.                 if(Value_Y<(-Light_Sensty))
  143.                 {Motor_Up();}                   //上轉
  144.                 else if(Value_Y>Light_Sensty)
  145.                 {Motor_Down();}                   //下轉
  146.                 else if((Value_Y>(-Light_Sensty))&&(Value_Y<Light_Sensty))
  147.                 {Motor1_Stop();}

  148.                 if(Value_X<(-Light_Sensty))
  149.                 {Motor_Right();}           //右轉
  150.                 else if(Value_X>Light_Sensty)
  151.                 {Motor_Left();}                //左轉
  152.                 else if((Value_Y>(-Light_Sensty))&&(Value_Y<Light_Sensty))
  153.                 {Motor2_Stop();}        //停止
  154.         }
  155. }

  156. /********************************************************************
  157. * 名稱 : void Hand_Mode(void)
  158. * 功能 : 手動模式
  159. * 輸入 : 無
  160. * 輸出 : 無
  161. ***********************************************************************/
  162. void Hand_Mode(void)
  163. {
  164.         if(Key_Up==0)
  165.         {
  166.                 DelayMs(10);
  167.                 if(Key_Up==0)
  168.                 {
  169.                         while(!Key_Up)
  170.                          Motor_Up();
  171.                 }
  172.                 while(!Key_Up);
  173.         }

  174.         if(Key_Down==0)
  175.         {
  176.                 DelayMs(10);
  177.                 if(Key_Down==0)
  178.                 {
  179.                         while(!Key_Down)
  180.                          Motor_Down();        
  181.                 }
  182.                 while(!Key_Down);
  183.         }

  184.         if(Key_Left==0)
  185.         {
  186.                 DelayMs(10);
  187.                 if(Key_Left==0)
  188.                 {
  189.                         while(!Key_Left)
  190.                          Motor_Left();
  191.                 }
  192.                 while(!Key_Left);
  193.         }

  194.         if(Key_Right==0)
  195.         {
  196.                 DelayMs(10);
  197.                 if(Key_Right==0)
  198.                 {                        
  199.                         while(!Key_Right)                        
  200.                          Motor_Right();                                
  201.                 }
  202.                 while(!Key_Right);
  203.         }

  204.         Motor1_Stop();
  205.         Motor2_Stop();        
  206. }

  207. /********************************************************************
  208. * 名稱 : void Mode_Switch(void)
  209. * 功能 : 模式切換        切換自/手動        、尋/避光
  210. * 輸入 : 無
  211. * 輸出 : 無
  212. ***********************************************************************/
  213. void Mode_Switch(void)
  214. {
  215.         if(Key_Pattern==0)                 //模式切換按鍵按下
  216.         {
  217.                 DelayMs(10);                //延時消抖
  218.                 if(Key_Pattern==0)        //確實按下
  219.                 {
  220.                         flag_Auto_or_Hand=!flag_Auto_or_Hand;//自動/手動切換標志位反轉        
  221.                 }
  222.                 while(!Key_Pattern);//松手檢測
  223.         }

  224.         if(flag_Auto_or_Hand)         //如果工作在自動模式
  225.         {
  226.                 if(Key_Blk_or_Lgt==0)//尋/避光按鍵按下        
  227.                 {
  228.                         DelayMs(10);         //延時消抖
  229.                         if(Key_Blk_or_Lgt==0)//確實按下
  230.                         {
  231.                                 flag_Blk_or_Lgt=!flag_Blk_or_Lgt;// 尋光/避光標志位反轉               
  232.                         }
  233.                         while(!Key_Blk_or_Lgt);//松手檢測
  234.                 }
  235.         }
  236. }


  237. void main(void)
  238. {
  239.    L1602_init();//LCD1602初始化
  240.      
  241.    flag_Auto_or_Hand = 1;//自動模式
  242.    flag_Blk_or_Lgt   = 1;//尋光模式
  243.    DisplayInit();
  244.    while(1)
  245.    {
  246.             DataDisplay();//數值顯示
  247.          Mode_Switch();//模式切換

  248.          if(flag_Auto_or_Hand)//控制位為1時
  249.          {
  250.                  Auto_Mode();//自動模式
  251.          }                                          //控制位為0時
  252.          else
  253.          {
  254.                   Hand_Mode();//手動模式
  255.          }
  256.          
  257.    }
  258. }
復制代碼

元件清單
元件 值 數量/個
電容
104電容(0.01uf) 4
30pf瓷片電容 2
10uf電解電容 1
電阻
500Ω 1
10k 5
10k電位器 1
10k排阻 1
5516光敏電阻 4
晶振 11.0592Mhz 1
51單片機 STC89C52 1
IC芯片座
40p 1
18p 1
8p 2
排針
5p 2
6p 2
3p 2
4p 1
3p*2 1
輕觸按鍵 4腳 7
電源插座 DC005 1
電源開關 SS-12D07 3腳2擋 直插 1
LED燈 紅色 1
短接帽 兩腳 2
M3螺絲
圓頭3*5mm 4
圓頭3*25mm 2
聯軸器固定螺絲 6
M4螺絲 圓頭4*60mm 1
螺帽 M3 6
M4 1
聯軸器 內徑 4mm-5mm 2
XH2.54排線 6p 1
LCD顯示屏 LCD1602 1
電源線 DC005 1
步進電機 28byj-48 2
ADC0832 直插 2
ULN2803 直插 1


Keil代碼附件下載: 程序.7z (4.68 MB, 下載次數: 151)
手動模式.bmp
主程序.jpg
自動模式.bmp

評分

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

查看全部評分

回復

使用道具 舉報

ID:962396 發表于 2022-7-12 23:52 | 顯示全部樓層
感謝,學習中
回復

使用道具 舉報

ID:566128 發表于 2023-2-14 16:01 | 顯示全部樓層
請問一下,有仿真圖嗎
回復

使用道具 舉報

ID:505058 發表于 2023-3-25 00:33 來自手機 | 顯示全部樓層
小白鷺 發表于 2023-2-14 16:01
請問一下,有仿真圖嗎

這是我B站的資源
回復

使用道具 舉報

ID:505058 發表于 2023-3-25 00:33 來自手機 | 顯示全部樓層
我B站的東西都放這來了
回復

使用道具 舉報

ID:47634 發表于 2023-3-25 08:55 | 顯示全部樓層
不錯不錯,很好的制作資料
回復

使用道具 舉報

ID:1068108 發表于 2023-4-13 19:44 來自手機 | 顯示全部樓層
我想問一下,用stc15內部adc測光強,protues仿真數值可以隨光源距離改變 ,但是下載到板子一直沒有變化是什么原因
回復

使用道具 舉報

ID:1107443 發表于 2024-1-1 20:21 | 顯示全部樓層
158751hei0141 發表于 2023-3-25 00:33
我B站的東西都放這來了

你B站是啥啊,我去看看你的,我現在正學這個了
回復

使用道具 舉報

ID:289826 發表于 2024-3-6 22:38 | 顯示全部樓層
下載學習一下,謝謝分響
回復

使用道具 舉報

ID:505058 發表于 2024-3-17 07:36 來自手機 | 顯示全部樓層
此項目是本人于B站發布的項目,B站視頻地址:BV1qQ4y1r7MQ,望各位知悉!!!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 天天在线操 | 国产精品一区二区视频 | 国产999精品久久久影片官网 | 国产成人亚洲精品自产在线 | 丝袜 亚洲 另类 欧美 综合 | 国产精品www| 日韩在线免费 | 一区二区三区国产 | 久草在线 | 精品视频久久久 | 成年人在线观看 | 小h片免费观看久久久久 | 国产一区二| 亚洲欧美日本国产 | 国产视频中文字幕 | 伊人网站 | 秋霞av国产精品一区 | 97精品一区二区 | 日本精a在线观看 | 亚洲国产成人精品女人久久久 | 免费成人午夜 | 麻豆av一区二区三区久久 | 正在播放亚洲 | 日韩欧美在线观看视频网站 | 国产精品久久久久无码av | 亚洲在线一区二区三区 | 日本在线观看视频 | 国产综合久久久久久鬼色 | 男女羞羞视频免费看 | 精品国产久 | 色综合一区二区 | 欧美一区二区三区在线 | 日日摸夜夜添夜夜添精品视频 | 羞羞的视频网站 | 国产欧美一级 | 国产福利二区 | 色爱综合网 | 日韩一级黄色片 | 亚洲一一在线 | 97视频网站 | 欧美日本亚洲 |