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

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

QQ登錄

只需一步,快速開始

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

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

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:314935 發(fā)表于 2019-5-3 17:42 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
實(shí)現(xiàn)功能;
光源追蹤
裝置圖:

單片機(jī)源代碼如下:
  1. //*************************************************
  2. //模塊類型:包含外部文件
  3. //功能描述:
  4. //說(shuō)        明:
  5. //*************************************************
  6. #include "stc15f2kxx.h"
  7. #include "intrins.h"
  8. #include "string.h"
  9. #include "math.h"
  10. //*************************************************
  11. //模塊類型:自定義
  12. //功能描述:
  13. //說(shuō)        明:
  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完成標(biāo)志
  22. #define ADC_START                 0x08                         //ADC起始控制位
  23. #define ADC_SPEEDLL         0x00                         //540個(gè)時(shí)鐘
  24. #define ADC_SPEEDL                 0x20                         //360個(gè)時(shí)鐘
  25. #define ADC_SPEEDH                 0x40                         //180個(gè)時(shí)鐘
  26. #define ADC_SPEEDHH         0x60                         //90個(gè)時(shí)鐘

  27. //光敏電阻AD比較靈敏度
  28. #define                                SunValue                                1200   //更改數(shù)值,可調(diào)節(jié)靈敏度,以適應(yīng)強(qiáng)弱光

  29. #define                                Step                                        1           //調(diào)節(jié)步數(shù) 舵機(jī)轉(zhuǎn)動(dòng)的精度

  30. #define                                DelayTime                                8           //等待時(shí)間 舵機(jī)轉(zhuǎn)動(dòng)的速度


  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. //模塊類型:內(nèi)部函數(shù)聲明
  37. //功能描述:
  38. //說(shuō)        明:
  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. //函 數(shù) 名:u32 GetADCResult(u8 ch)
  48. //輸        入:AD通道號(hào)
  49. //輸    出:無(wú)
  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個(gè)NOP
  59.         _nop_();
  60.         _nop_();
  61.         _nop_();
  62.         while (!(ADC_CONTR & ADC_FLAG));                                                 //等待ADC轉(zhuǎn)換完成
  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轉(zhuǎn)換結(jié)果計(jì)算
  68.         if((5.0 - ADC_Voltage) > 0)
  69.         {
  70.                 ResValue = (ADC_Voltage * 10000) / (5.0 - ADC_Voltage);        //計(jì)算光敏電阻阻值
  71.         }
  72.         return ResValue;                                                                                 //返回光敏電阻阻值
  73. }

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

  89. //*************************************************
  90. //函 數(shù) 名:void Write_ADC_Buf(void)
  91. //輸        入:無(wú)
  92. //輸    出:無(wú)
  93. //功能描述: ADC結(jié)果存儲(chǔ)
  94. //*************************************************
  95. void Write_ADC_Buf(void)
  96. {
  97.         Result_ADC[1] = GetADCResult(4);                                                 //讀取四個(gè)光敏電阻阻值
  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位數(shù)據(jù),可變波特率
  107.         AUXR |= 0x40;                //定時(shí)器1時(shí)鐘為Fosc,即1T
  108.         AUXR &= 0xFE;                //串口1選擇定時(shí)器1為波特率發(fā)生器
  109.         TMOD &= 0x0F;                //設(shè)定定時(shí)器1為16位自動(dòng)重裝方式
  110.         TL1 = 0xE0;                        //設(shè)定定時(shí)初值
  111.         TH1 = 0xFE;                        //設(shè)定定時(shí)初值
  112.         ET1 = 0;                        //禁止定時(shí)器1中斷
  113.         TR1 = 1;                        //啟動(dòng)定時(shí)器1
  114. }

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

  131. //*************************************************
  132. //函 數(shù) 名:void TIM0_Init(void)
  133. //輸        入:無(wú)
  134. //輸    出:無(wú)
  135. //功能描述: 定時(shí)器0初始化 作為PWM基準(zhǔn)
  136. //*************************************************
  137. void TIM0_Init(void)                //78微秒的周期隌11.0592MHz
  138. {
  139.         AUXR |= 0x80;                        //定時(shí)器時(shí)鐘1T模式,傳統(tǒng)8051的12倍,1T就是指不分頻,傳統(tǒng)8051的始終是1T/12
  140.         TMOD &= 0xF0;                        //設(shè)置定時(shí)器模式,16位重載模式
  141.         TL0 = 0xA1;                                //設(shè)置定時(shí)初值
  142.         TH0 = 0xFC;                                //設(shè)置定時(shí)初值  差值64673
  143.         TF0 = 0;                                //清除TF0標(biāo)志
  144.         TR0 = 1;                                //定時(shí)器0開始計(jì)時(shí)
  145. }
  146. //*************************************************
  147. //函 數(shù) 名:void PWM_Init(void)
  148. //輸        入:無(wú)
  149. //輸    出:無(wú)
  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//設(shè)置輸出引腳
  156.         P_SW1 = ACC;
  157.         CCON = 0;                                                 //初始化PCA控制寄存器
  158.         CL = 0;                                                 //復(fù)位PCA16位寄存器
  159.         CH = 0;//高8位
  160.         CMOD = 0x04;                                         //設(shè)置PCA時(shí)鐘源為定時(shí)器0的溢出脈沖并且禁止PCA定時(shí)器cf位溢出中斷
  161.                                                                         
  162.         PCA_PWM0 = 0x00;                                 //PCA模塊0工作于8位PWM,PCA_PWM0是一個(gè)pwm寄存器
  163.         CCAP0H = CCAP0L = 245;                         //PWM0的占空比,0模塊的比較的計(jì)數(shù)值
  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定時(shí)器開始工作,位于CCON寄存器,控制pca工作與否
  170. }

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

  177. void SG90_Control(void)
  178. {                                                         
  179.         Write_ADC_Buf();                                                                                                //讀光敏電阻并做相應(yīng)計(jì)算
  180.         switch(CheckStep)
  181.         {
  182.                 //上下右旋轉(zhuǎn)
  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;//上 左右轉(zhuǎn)動(dòng)
  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://左右旋轉(zhuǎn)
  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. //函 數(shù) 名:void main(void)
  453. //輸        入:無(wú)
  454. //輸    出:無(wú)
  455. //功能描述: 主函數(shù)
  456. //*************************************************
  457. void main(void)
  458. {
  459.         UartInit();                                                 //初始化串口  用于測(cè)試,可刪除
  460.         InitADC();                                                         //初始化ADC
  461.         TIM0_Init();                                                //初始化定時(shí)器0
  462.         PWM_Init();                                                        //初始化PWM
  463.         while(1)
  464.         {        
  465.                 SG90_Control();                                        //舵機(jī)控制
  466.         }
  467. }
  468. ***************************************************************************************
復(fù)制代碼

評(píng)分

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

查看全部評(píng)分

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

板凳
ID:646835 發(fā)表于 2020-5-13 19:16 | 只看該作者
有沒(méi)有仿真圖
回復(fù)

使用道具 舉報(bào)

地板
ID:65237 發(fā)表于 2020-5-13 20:40 | 只看該作者
謝謝分享 很好的創(chuàng)意
回復(fù)

使用道具 舉報(bào)

5#
ID:616559 發(fā)表于 2021-2-22 10:14 | 只看該作者
請(qǐng)問(wèn)下,這個(gè)有沒(méi)有原理圖啊
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久久久久久av | 国产视频久久久 | 欧洲精品码一区二区三区免费看 | 亚洲精品视频在线播放 | 欧美午夜剧场 | 欧美日韩免费一区二区三区 | 亚洲一区久久 | 国产精品久久久久aaaa九色 | 久久精品国产一区 | 日韩aⅴ在线观看 | 国户精品久久久久久久久久久不卡 | 国产成人精品视频在线观看 | 精品福利一区二区三区 | 美女中文字幕视频 | 精品国产第一区二区三区 | 国产第二页 | 午夜精品在线 | 美女人人操 | 欧美色成人 | 日日干日日操 | 亚洲国产欧美国产综合一区 | 韩国精品在线 | 欧美久久久久久久久 | 国产免费又黄又爽又刺激蜜月al | 久久精品亚洲精品国产欧美 | 成人性视频免费网站 | 91精品国产高清久久久久久久久 | 综合国产第二页 | 国产91在线播放 | 亚洲一区二区三区在线 | 欧美日韩亚洲系列 | 久久久精彩视频 | 黄色网址免费在线观看 | 999热精品 | 最新黄色在线观看 | julia中文字幕久久一区二区 | 日韩免费中文字幕 | 国产精品毛片av一区 | 六月成人网 | 中文字幕在线观看 | 国产三级 |