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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4430|回復: 5
打印 上一主題 下一主題
收起左側

51單片機四相雙軸光源追蹤裝置源程序

  [復制鏈接]
跳轉到指定樓層
樓主
ID:314935 發表于 2019-5-3 17:42 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
實現功能;
光源追蹤
裝置圖:

單片機源代碼如下:
  1. //*************************************************
  2. //模塊類型:包含外部文件
  3. //功能描述:
  4. //說        明:
  5. //*************************************************
  6. #include "stc15f2kxx.h"
  7. #include "intrins.h"
  8. #include "string.h"
  9. #include "math.h"
  10. //*************************************************
  11. //模塊類型:自定義
  12. //功能描述:
  13. //說        明:
  14. //************************************************
  15. typedef unsigned char u8;
  16. typedef unsigned int u16;
  17. typedef unsigned long int u32;

  18. #define CCP_S0                         0x10                         //P_SW1.4
  19. #define CCP_S1                         0x20                         //P_SW1.5
  20. #define ADC_POWER                 0x80                         //ADC電源控制位
  21. #define ADC_FLAG                 0x10                         //ADC完成標志
  22. #define ADC_START                 0x08                         //ADC起始控制位
  23. #define ADC_SPEEDLL         0x00                         //540個時鐘
  24. #define ADC_SPEEDL                 0x20                         //360個時鐘
  25. #define ADC_SPEEDH                 0x40                         //180個時鐘
  26. #define ADC_SPEEDHH         0x60                         //90個時鐘

  27. //光敏電阻AD比較靈敏度
  28. #define                                SunValue                                1200   //更改數值,可調節靈敏度,以適應強弱光

  29. #define                                Step                                        1           //調節步數 舵機轉動的精度

  30. #define                                DelayTime                                8           //等待時間 舵機轉動的速度


  31. u32 data Result_ADC[5] = {0};
  32. u8 PWM_DATA_X = 240;                                
  33. u8 PWM_DATA_Y = 240;
  34. u8 CheckStep = 0;

  35. //*************************************************
  36. //模塊類型:內部函數聲明
  37. //功能描述:
  38. //說        明:
  39. //************************************************
  40. void UartInit();
  41. void InitADC();
  42. void SendData(u8 dat);
  43. u32 GetADCResult(u8 ch);
  44. void Delay(u16 n);
  45. void ShowResult(u8 ch);

  46. //*************************************************
  47. //函 數 名:u32 GetADCResult(u8 ch)
  48. //輸        入:AD通道號
  49. //輸    出:無
  50. //功能描述: 讀取光敏電阻阻值
  51. //*************************************************
  52. u32 GetADCResult(u8 ch)
  53. {
  54.         u16 buf;
  55.         float ADC_Voltage;
  56.         u32 ResValue;
  57.         ADC_CONTR = ADC_POWER | ADC_SPEEDL | ch | ADC_START;
  58.         _nop_();                                                                                                 //等待4個NOP
  59.         _nop_();
  60.         _nop_();
  61.         _nop_();
  62.         while (!(ADC_CONTR & ADC_FLAG));                                                 //等待ADC轉換完成
  63.         ADC_CONTR &= ~ADC_FLAG;                                                                 //Close ADC
  64.         buf = ADC_RES;
  65.         buf = (buf << 8) | ADC_RESL;
  66.         

  67.         ADC_Voltage = (buf * 5.0) / 1024.0;                                                //ADC轉換結果計算
  68.         if((5.0 - ADC_Voltage) > 0)
  69.         {
  70.                 ResValue = (ADC_Voltage * 10000) / (5.0 - ADC_Voltage);        //計算光敏電阻阻值
  71.         }
  72.         return ResValue;                                                                                 //返回光敏電阻阻值
  73. }

  74. //*************************************************
  75. //函 數 名:void InitADC(void)
  76. //輸        入:無
  77. //輸    出:無
  78. //功能描述: ADC初始化
  79. //*************************************************
  80. void InitADC(void)
  81. {
  82.         P1ASF = 0xf0;                                                                 //設置P1口為AD口
  83.         CLK_DIV |= 0x20;
  84.         ADC_RES = 0;                                                                 //清除結果寄存器
  85.         ADC_CONTR = ADC_POWER | ADC_SPEEDHH;
  86.         Delay(2);                                                                        //ADC上電并延時
  87. }
  88. //*************************************************

  89. //*************************************************
  90. //函 數 名:void Write_ADC_Buf(void)
  91. //輸        入:無
  92. //輸    出:無
  93. //功能描述: ADC結果存儲
  94. //*************************************************
  95. void Write_ADC_Buf(void)
  96. {
  97.         Result_ADC[1] = GetADCResult(4);                                                 //讀取四個光敏電阻阻值
  98.         Result_ADC[2] = GetADCResult(5);
  99.         Result_ADC[3] = GetADCResult(6);
  100.         Result_ADC[4] = GetADCResult(7);               
  101. }

  102. //*************************************************
  103. //*************************************************
  104. void UartInit(void)                //9600bps@11.0592MHz
  105. {
  106.         SCON = 0x50;                //8位數據,可變波特率
  107.         AUXR |= 0x40;                //定時器1時鐘為Fosc,即1T
  108.         AUXR &= 0xFE;                //串口1選擇定時器1為波特率發生器
  109.         TMOD &= 0x0F;                //設定定時器1為16位自動重裝方式
  110.         TL1 = 0xE0;                        //設定定時初值
  111.         TH1 = 0xFE;                        //設定定時初值
  112.         ET1 = 0;                        //禁止定時器1中斷
  113.         TR1 = 1;                        //啟動定時器1
  114. }

  115. //*************************************************
  116. //*************************************************
  117. //函 數 名:void Delay(u16 n)
  118. //輸        入:延時值
  119. //輸    出:無
  120. //功能描述: 延時函數
  121. //*************************************************
  122. void Delay(u16 n)
  123. {
  124.         u16 x;
  125.         while (n--)
  126.         {
  127.                 x = 5000;
  128.                 while (x--);
  129.         }
  130. }

  131. //*************************************************
  132. //函 數 名:void TIM0_Init(void)
  133. //輸        入:無
  134. //輸    出:無
  135. //功能描述: 定時器0初始化 作為PWM基準
  136. //*************************************************
  137. void TIM0_Init(void)                //78微秒的周期隌11.0592MHz
  138. {
  139.         AUXR |= 0x80;                        //定時器時鐘1T模式,傳統8051的12倍,1T就是指不分頻,傳統8051的始終是1T/12
  140.         TMOD &= 0xF0;                        //設置定時器模式,16位重載模式
  141.         TL0 = 0xA1;                                //設置定時初值
  142.         TH0 = 0xFC;                                //設置定時初值  差值64673
  143.         TF0 = 0;                                //清除TF0標志
  144.         TR0 = 1;                                //定時器0開始計時
  145. }
  146. //*************************************************
  147. //函 數 名:void PWM_Init(void)
  148. //輸        入:無
  149. //輸    出:無
  150. //功能描述: PWM初始化
  151. //*************************************************
  152. void PWM_Init(void)
  153. {        
  154.         ACC = P_SW1;//即AUXR1
  155.         ACC &= ~(CCP_S0 | CCP_S1);                 //CCP_S0=0 CCP_S1=0//設置輸出引腳
  156.         P_SW1 = ACC;
  157.         CCON = 0;                                                 //初始化PCA控制寄存器
  158.         CL = 0;                                                 //復位PCA16位寄存器
  159.         CH = 0;//高8位
  160.         CMOD = 0x04;                                         //設置PCA時鐘源為定時器0的溢出脈沖并且禁止PCA定時器cf位溢出中斷
  161.                                                                         
  162.         PCA_PWM0 = 0x00;                                 //PCA模塊0工作于8位PWM,PCA_PWM0是一個pwm寄存器
  163.         CCAP0H = CCAP0L = 245;                         //PWM0的占空比,0模塊的比較的計數值
  164.         CCAPM0 = 0x42;                                         //PCA模塊0為8位PWM模式,允許比較并允許輸出p1.1
  165.         
  166.         PCA_PWM1 = 0x00;                                 //PCA模塊1工作于8位PWM
  167.         CCAP1H = CCAP1L = 245;                         //PWM1的占空比
  168.         CCAPM1 = 0x42;                                         //PCA模塊1為8位PWM模式        ,允許比較,允許輸出p1.0
  169.         CR = 1;                                                        //PCA定時器開始工作,位于CCON寄存器,控制pca工作與否
  170. }

  171. //*************************************************
  172. //函 數 名:void SG90_Control(void)
  173. //輸        入:無
  174. //輸    出:無
  175. //功能描述: SG90舵機控制
  176. //*************************************************

  177. void SG90_Control(void)
  178. {                                                         
  179.         Write_ADC_Buf();                                                                                                //讀光敏電阻并做相應計算
  180.         switch(CheckStep)
  181.         {
  182.                 //上下右旋轉
  183.                 case 0:
  184.                         if((Result_ADC[1] > Result_ADC[3])&&PWM_DATA_Y !=249)
  185.                         {
  186.                                 if((Result_ADC[1] - Result_ADC[3]) > SunValue)
  187.                                 {
  188.                                         CheckStep = 7;//上 左右轉動
  189.                                 }
  190.                                 else
  191.                                 {
  192.                                        
  193.                                         CheckStep = 1;//
  194.                                 }
  195.                         }
  196.                         else
  197.                         {
  198.                                 CheckStep = 1;
  199.                         }
  200.                         break;
  201.                 case 1:
  202.                         if((Result_ADC[3] > Result_ADC[1])&&PWM_DATA_Y !=224)
  203.                         {
  204.                                 if((Result_ADC[3] - Result_ADC[1]) > SunValue)
  205.                                 {
  206.                                         CheckStep = 6;//Y--
  207.                                 }
  208.                                 else
  209.                                 {
  210.                                         CheckStep = 2;
  211.                                 }
  212.                         }
  213.                         else
  214.                         {
  215.                                 CheckStep = 2;
  216.                         }
  217.                         break;
  218.                 case 2://左右旋轉
  219.                         if((Result_ADC[2] > Result_ADC[4])&&PWM_DATA_X !=224)
  220.                         {
  221.                                 if((Result_ADC[2] - Result_ADC[4]) > SunValue)
  222.                                 {
  223.                                         CheckStep = 4;//X--
  224.                                 }
  225.                                 else
  226.                                 {
  227.                                         CheckStep = 3;
  228.                                 }
  229.                         }
  230.                         else
  231.                         {
  232.                                 CheckStep = 3;
  233.                         }
  234.                         break;
  235.                 case 3:
  236.                         if((Result_ADC[4] > Result_ADC[2])&&PWM_DATA_X !=249)
  237.                         {
  238.                                 if((Result_ADC[4] - Result_ADC[2]) > SunValue)
  239.                                 {
  240.                                         CheckStep = 5;//X++
  241.                                 }
  242.                                 else
  243.                                 {
  244.                                         CheckStep = 0;
  245.                                 }
  246.                         }
  247.                         else
  248.                         {
  249.                                 CheckStep = 0;
  250.                         }
  251.                         break;
  252.                 case 4:
  253.                         if(Result_ADC[1]-Result_ADC[3]>SunValue)
  254.                         {
  255.                         Delay(DelayTime);
  256.                         PWM_DATA_Y += Step;
  257.                         PWM_DATA_X -= Step;
  258.                         if(PWM_DATA_X < 224)
  259.                         {
  260.                                 PWM_DATA_X = 224;
  261.                         }
  262.                         if(PWM_DATA_Y > 249)
  263.                         {
  264.                                 PWM_DATA_Y = 249;
  265.                         }
  266.                         CCAP1H = CCAP1L = PWM_DATA_Y;
  267.                         CCAP0H = CCAP0L = PWM_DATA_X;

  268.                         }
  269.                         //**************
  270.                         if(Result_ADC[3]-Result_ADC[1]>SunValue)
  271.                         {
  272.                         Delay(DelayTime);
  273.                         PWM_DATA_Y -= Step;
  274.                         PWM_DATA_X -= Step;
  275.                         if(PWM_DATA_X < 224)
  276.                         {
  277.                                 PWM_DATA_X = 224;
  278.                         }
  279.                         
  280.                         if(PWM_DATA_Y < 224)
  281.                         {
  282.                                 PWM_DATA_Y = 224;
  283.                         }
  284.                         CCAP1H = CCAP1L = PWM_DATA_Y;
  285.                         CCAP0H = CCAP0L = PWM_DATA_X;
  286.                         }
  287.                         if((labs(Result_ADC[1]-Result_ADC[3]))<=SunValue)
  288.                         {
  289.                         Delay(DelayTime);
  290.                         PWM_DATA_X -= Step;
  291.                         if(PWM_DATA_X < 224)
  292.                         {
  293.                                 PWM_DATA_X = 224;
  294.                         }
  295.                         CCAP0H = CCAP0L = PWM_DATA_X;
  296.                 }
  297.                         CheckStep = 2;
  298.                         break;
  299.                 case 5:
  300.                         if(Result_ADC[1]-Result_ADC[3]>SunValue)
  301.                         {
  302.                         Delay(DelayTime);
  303.                         PWM_DATA_Y += Step;
  304.                         PWM_DATA_X += Step;
  305.                         if(PWM_DATA_X > 249)
  306.                         {
  307.                                 PWM_DATA_X = 249;
  308.                         }
  309.                         if(PWM_DATA_Y > 249)
  310.                         {
  311.                                 PWM_DATA_Y = 249;
  312.                         }
  313.                         CCAP1H = CCAP1L = PWM_DATA_Y;
  314.                         CCAP0H = CCAP0L = PWM_DATA_X;

  315.                         }
  316.                         //**************
  317.                         if(Result_ADC[3]-Result_ADC[1]>SunValue)
  318.                         {
  319.                         Delay(DelayTime);
  320.                         PWM_DATA_Y -= Step;
  321.                         PWM_DATA_X += Step;
  322.                         if(PWM_DATA_X > 249)
  323.                         {
  324.                                 PWM_DATA_X = 249;
  325.                         }
  326.                         
  327.                         if(PWM_DATA_Y < 224)
  328.                         {
  329.                                 PWM_DATA_Y = 224;
  330.                         }
  331.                         CCAP1H = CCAP1L = PWM_DATA_Y;
  332.                         CCAP0H = CCAP0L = PWM_DATA_X;
  333.                         }//******************
  334.                         if((labs(Result_ADC[1]-Result_ADC[3]))<=SunValue)
  335.                         {
  336.                         Delay(DelayTime);
  337.                         PWM_DATA_X += Step;
  338.                         if(PWM_DATA_X > 249)
  339.                         {
  340.                                 PWM_DATA_X = 249;
  341.                         }
  342.                         CCAP0H = CCAP0L = PWM_DATA_X;
  343.                 }
  344.                         CheckStep = 3;
  345.                         break;
  346.                 case 6:
  347.                         if(Result_ADC[2]>Result_ADC[4]>SunValue)
  348.                         {
  349.                         Delay(DelayTime);
  350.                         PWM_DATA_Y -= Step;
  351.                         PWM_DATA_X -= Step;
  352.                         if(PWM_DATA_Y < 224)
  353.                         {
  354.                                 PWM_DATA_Y = 224;
  355.                         }
  356.                         if(PWM_DATA_X < 224)
  357.                         {
  358.                                 PWM_DATA_X = 224;
  359.                         }
  360.                         CCAP0H = CCAP0L = PWM_DATA_X;
  361.                         CCAP1H = CCAP1L = PWM_DATA_Y;
  362.                   }
  363.                         //*************************
  364.                         if(Result_ADC[4]-Result_ADC[2]>SunValue)
  365.                         {
  366.                         Delay(DelayTime);
  367.                         PWM_DATA_Y -= Step;
  368.                         PWM_DATA_X += Step;
  369.                         if(PWM_DATA_X > 249)
  370.                         {
  371.                                 PWM_DATA_X = 249;
  372.                         }
  373.                         
  374.                         if(PWM_DATA_Y < 224)
  375.                         {
  376.                                 PWM_DATA_Y = 224;
  377.                         }
  378.                         CCAP1H = CCAP1L = PWM_DATA_Y;
  379.                         CCAP0H = CCAP0L = PWM_DATA_X;
  380.                         }
  381.                         //******************
  382.                         if((labs(Result_ADC[2]-Result_ADC[4]))<=SunValue)
  383.                         {
  384.                         Delay(DelayTime);
  385.                         PWM_DATA_Y -= Step;
  386.                         if(PWM_DATA_Y < 224)
  387.                         {
  388.                                 PWM_DATA_Y = 224;
  389.                         }
  390.                         CCAP1H = CCAP1L = PWM_DATA_Y;
  391.                 }
  392.                 //*****************************
  393.                         CheckStep = 1;
  394.                         break;
  395.                 case 7:
  396.                         if(Result_ADC[2]-Result_ADC[4]>SunValue)
  397.                         {
  398.                         Delay(DelayTime);
  399.                         PWM_DATA_Y += Step;
  400.                         PWM_DATA_X -= Step;
  401.                         if(PWM_DATA_Y >= 249)
  402.                         {
  403.                                 PWM_DATA_Y = 249;
  404.                         }
  405.                         if(PWM_DATA_X <= 224)
  406.                         {
  407.                                 PWM_DATA_X = 224;
  408.                         }
  409.                         
  410.                         
  411.                         CCAP0H = CCAP0L = PWM_DATA_X;
  412.                         CCAP1H = CCAP1L = PWM_DATA_Y;

  413.                         }
  414.                         //**************
  415.                         if(Result_ADC[4]-Result_ADC[2]>SunValue)
  416.                         {
  417.                         Delay(DelayTime);
  418.                         PWM_DATA_Y += Step;
  419.                         PWM_DATA_X += Step;
  420.                         if(PWM_DATA_X > 249)
  421.                         {
  422.                                 PWM_DATA_X = 249;
  423.                         }
  424.                         
  425.                         if(PWM_DATA_Y > 249)
  426.                         {
  427.                                 PWM_DATA_Y = 249;
  428.                         }
  429.                         CCAP1H = CCAP1L = PWM_DATA_Y;
  430.                         CCAP0H = CCAP0L = PWM_DATA_X;
  431.                         }
  432.                         
  433.                         //$
  434.                         if((labs(Result_ADC[2]-Result_ADC[4]))<=SunValue)
  435.                         {
  436.                         Delay(DelayTime);
  437.                         PWM_DATA_Y += Step;
  438.                         if(PWM_DATA_Y > 249)
  439.                         {
  440.                                 PWM_DATA_Y = 249;
  441.                         }
  442.                         CCAP1H = CCAP1L = PWM_DATA_Y;
  443.                 }
  444.                 //***************
  445.                         CheckStep = 0;
  446.                         break;
  447.                 default:
  448.                         break;               
  449.         }
  450. }


  451. //*************************************************
  452. //函 數 名:void main(void)
  453. //輸        入:無
  454. //輸    出:無
  455. //功能描述: 主函數
  456. //*************************************************
  457. void main(void)
  458. {
  459.         UartInit();                                                 //初始化串口  用于測試,可刪除
  460.         InitADC();                                                         //初始化ADC
  461.         TIM0_Init();                                                //初始化定時器0
  462.         PWM_Init();                                                        //初始化PWM
  463.         while(1)
  464.         {        
  465.                 SG90_Control();                                        //舵機控制
  466.         }
  467. }
  468. ***************************************************************************************
復制代碼

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:505153 發表于 2019-5-6 01:23 | 只看該作者
有視頻嗎,看一下效果
回復

使用道具 舉報

板凳
ID:646835 發表于 2020-5-13 19:16 | 只看該作者
有沒有仿真圖
回復

使用道具 舉報

地板
ID:65237 發表于 2020-5-13 20:40 | 只看該作者
謝謝分享 很好的創意
回復

使用道具 舉報

5#
ID:616559 發表于 2021-2-22 10:14 | 只看該作者
請問下,這個有沒有原理圖啊
回復

使用道具 舉報

6#
ID:706290 發表于 2022-9-21 15:33 | 只看該作者
提供一個原理圖吧
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品欧美一区二区三区 | 久久精品亚洲 | 天天综合网永久 | 日韩乱码av | 中文字幕 在线观看 | 国产成人在线播放 | 久久精品 | 久久久久91 | 日韩一区二区三区av | 久久久久久国产精品免费免费狐狸 | 午夜影视大全 | 在线免费黄色小视频 | 日韩精品在线一区 | 国产精品久久欧美久久一区 | 国产片侵犯亲女视频播放 | 久久精品国产一区二区电影 | 欧美激情一区二区 | 欧美视频二区 | 亚洲精品乱码久久久久久久久久 | 久久久国产精品一区 | 国产成人精品免高潮在线观看 | 久久久久国产一区二区三区不卡 | 日本三级日产三级国产三级 | 精品伦精品一区二区三区视频 | 国产精品久久国产精品久久 | 成人九色 | 国产激情91久久精品导航 | 精品粉嫩aⅴ一区二区三区四区 | 黄片毛片在线观看 | 日韩一级在线 | 欧美精品一级 | 一区二区三区视频 | 91网在线观看 | 亚洲精品久久久久久首妖 | 国产精品成人一区 | 成人夜晚看av | 欧美成年黄网站色视频 | 久国久产久精永久网页 | 四虎国产 | 国产精品自产av一区二区三区 | 九九九视频精品 |