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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機自動追光控制程序與Proteus仿真圖

[復制鏈接]
跳轉到指定樓層
樓主
單片機自動追光仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
#include<reg52.h>
#include"AD0832.h"
sbit a=P0^0;
sbit b=P0^1;
sbit c=P0^2;
sbit d=P0^3;
sbit _74HC573_U2=P1^0;
sbit _74HC573_U5=P1^1;
#define   Li P0
#define  uint unsigned int
#define  uchar unsigned char
uchar code turn[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};
/*返回角度數,角度數的范圍(角度數)*/
/*0°-360°
uint control_angle(int angle)
{
if (angle>360){angle=0;}
else if (angle<0)  {angle=360;}
return angle;
}*/
/*返回值第幾拍數 控制轉動(角度數)*/
/*直接轉化度數取整(略微有誤差)不精確算法,*/  
/*采用四舍五入的不精確算法*/
uint rsa_angle(uint angle)/*角度算法*/
{
uint x;
x=angle*10%9;//取余
angle=angle*10/9;//取整
if(x>=5) {angle+=1;}
return angle;
}
/*控制左右步進電機*/
uint left_right_control_turn(int a,int angle,uint ZhengFanZhuan)//a=此時的拍數,angle角度,ZhengFanZhuan正反轉控制碼
{
angle=rsa_angle(angle);/*角度算法*/  
switch(ZhengFanZhuan)
{
  case 1://表示順時針轉動
          while(angle--)
          {
           a++;
           if(a>7){a=0;}        
           Li=turn[a];
           delay(50);
          }
          break;
  case 2://表示逆時針轉動
         while(angle--)
          {
           a--;
           if(a<0){a=7;}        
           Li=turn[a];
           delay(50);
          }
         break;
}
return a; //返回此時的拍數
}
/*控制上下步進電機*/
uint up_down_control_turn(int a,int angle,uint ZhengFanZhuan)//a=此時的拍數,angle角度,ZhengFanZhuan正反轉控制碼
{
uchar L;
angle=rsa_angle(angle);/*角度算法*/  
switch(ZhengFanZhuan)
{
  case 1://表示順時針轉動 //上
          while(angle--)
          {
           a++;
           if(a>7){a=0;}                  
           L=turn[a];
                   Li=L<<4;
           delay(50);
          }
          break;
  case 2://表示逆時針轉動 //下
         while(angle--)
          {
           a--;
           if(a<0){a=7;}        
           L=turn[a];
                   Li=L<<4;
           delay(50);
          }
         break;
}
return a; //返回此時的拍數
}

void main()        
{
uint x=1,a,b;
uint left_right,up_down;
_74HC573_U5=1;//控制上下
_74HC573_U2=1; //控制左右                       
a=left_right_control_turn(0,4,1); //返回角度數,控制轉動(角度數)/*初始化,將步進電機歸零*/
b=up_down_control_turn(0,4,1); //返回角度數,控制轉動(角度數)/*初始化,將步進電機歸零*/
_74HC573_U5=0;        //控制上下
_74HC573_U2=0;//控制左右
while(1)
{
  while(1) //控制左右
         {
           left_right=left_right_V_compare(2);//范圍正負40mv
           /*返回光線強代號(在40mv范圍內),比較左邊右邊電壓(光敏電阻光線越強阻值越小)*/
           switch(left_right)
           {
                        case 1:
                        {
                          _74HC573_U5=0;//開放
                          _74HC573_U2=1;//關閉
                          a=left_right_control_turn(a,3,1);        //左//angle角度//角度數的范圍(角度數);
                          break;
                        }
                        case 2:
                        {
                          _74HC573_U5=0;//開放
                          _74HC573_U2=1;//關閉
                          a=left_right_control_turn(a,3,2);        //右
                          break;        
                        }
                        case 3:         
                        {
                          break;
                        }  
           }
           if(left_right==3)
           {
                   _74HC573_U5=0;
                _74HC573_U2=0;//關閉
           break;}                  
         }
  while(1)//控制上下
         {
           up_down=up_down_V_compare(2);//范圍正負40mv
           /*返回光線強代號(在50mv范圍內),比較上下電壓(光敏電阻光線越強阻值越小)*/
           switch(up_down)
           {
                        case 1:
                        {
              _74HC573_U5=1; //開放
                          b=up_down_control_turn(b,1,1);//上        //angle角度//角度數的范圍(角度數);
                          break;
                        }
                        case 2:
                        {
              _74HC573_U5=1;//開放                        
                          b=up_down_control_turn(b,1,2);//下
                          break;        
                        }
                        case 3:         
                        {
                          break;
                    }  
           }
           if(up_down==3)
           {
             _74HC573_U5=0;//關閉
         _74HC573_U2=0;//關閉
                break;
          }                  
         }

}
}


/*----------------------------------------AD0832.c----------------------------------------*/
#include<reg52.h>
#include"AD0832.h"
/*
sbit up_down_cs=P2^0;
sbit up_down_Dl=P2^1;
sbit up_down_DO=P2^2;
sbit up_down_clk=P2^3;
                                                                                                
sbit left_right_cs=P2^4;
sbit left_right_Dl=P2^5;
sbit left_right_DO=P2^6;
sbit left_right_clk=P2^7;*/

/*結合實際 AD0832有兩個
  處理left_right代號為1;
  處理up_down   代號為2;
  void AD0832_Init(uint Code )*/
void delay(uint a)
{
uint b;
for(a;a>0;a--)
{
  for(b=0;b<=110;b++)
   {
  ;
   }
}        
}
/*初始化
  處理left_right代號為1;
  處理up_down   代號為2;
  */
void AD0832_Init()
{
up_down_cs=1;//關閉
left_right_cs=1;//關閉
delay(2);
}
/*返回處理left/up、right/down-AD數值, a為AD0832代號,b=1為處理left/up,b=2為處理right/down*/
/*AD數據處理,
  結合實際AD0832有兩個  
  處理left_right代號為1;
  處理up_down   代號為2;
  uint AD_process(uint a) )        */
uchar AD_process(uint a,uint b)
{
   uint i;
   uchar AD;
   AD0832_Init();
   up_down_cs=1;//片選關閉
   left_right_cs=1;//片選關閉
         switch(a)//選擇left_right、up_down
         {
          case 1: //使用left_right
            {
                 left_right_cs=0;//開放
                 left_right_Dl=1;//在第一個時鐘脈沖的下沉之前DI端必須是高電平,表示啟始信號
                 up_down_left_right_clk=0;//關閉 第一周期開始         
                 up_down_left_right_clk=1;//第一個周期結束
                 delay(2);
                 left_right_Dl=1;//開始選擇通道功能
                 up_down_left_right_clk=0;//第二個周期開始
                 break;
                }
          case 2: //使用up_down
            {
                 up_down_cs=0;//開放
                 up_down_Dl=1;//在第一個時鐘脈沖的下沉之前DI端必須是高電平,表示啟始信號
                 up_down_left_right_clk=0;//關閉 第一周期開始         
                 up_down_left_right_clk=1;//第一個周期結束                 
                 up_down_Dl=1;//開始選擇通道功能
                 up_down_left_right_clk=0;//第二個周期開始
                 break;
                }         
          }
        switch(b)//選擇處理left/up、right/down-AD數值
         {
           case 1: //處理left/up_AD數據,根據left_right、up_down的電路圖可知left_right_left、up_down_up和CH0相連接
                  left_right_Dl=1;         //配置位 1
                  up_down_Dl=1;             //配置位 1
                  up_down_left_right_clk=1;//第二個周期結束
                  left_right_Dl=0;        //配置位 0
                  up_down_Dl=0;             //配置位 0
                  up_down_left_right_clk=0;//第三個周期開始
                  up_down_left_right_clk=1;//第三個周期結束
                  break;
           case 2://處理right/down_AD數據,根據left_right、up_down的電路圖可知left_right_right、up_down_down和CH1相連接
                  left_right_Dl=1;         //配置位 1
                  up_down_Dl=1;             //配置位 1
                  up_down_left_right_clk=1;//第二個周期結束
                  left_right_Dl=1;        //配置位 1
                  up_down_Dl=1;             //配置位 1
                  up_down_left_right_clk=0;//第三個周期開始
                  up_down_left_right_clk=1;//第三個周期結束
                  break;              
         }
     /*數據接收開始*/
         for(i=0;i<8;i++)  //高位在前
        {
          up_down_left_right_clk=1;         //脈沖開始
          up_down_left_right_clk=0;                  //脈沖結束
          switch(a)
          {
           case 1:
                 AD|=(uchar)left_right_DO;  //將下面儲存的低位數據向右移
                 AD<<=1;                                         //將輸出數據DIO通過或運算儲存在dat最低位
                 break;
           case 2:
                 AD|=(uchar)up_down_DO;                  //將下面儲存的低位數據向右移
                 AD<<=1;                                                  //將輸出數據DIO通過或運算儲存在dat最低位
                 break;
          }                 
        }
        up_down_cs=1;//片選關閉
    left_right_cs=1;//片選關閉
        return AD;         //將讀出的數據返回
}

/*返回光線強代號(在f范圍內相等(正常范圍)),比較左邊右邊電壓(光敏電阻光線越強阻值越小)*/
/*代號1表示左邊強,代號2表示右邊強,代號3表示在左邊右邊在相等(正常范圍)*/
uint left_right_V_compare(uint f)//500
{
         uchar V_left,V_right;
         uint a;
         V_left=AD_process(1,1);
         V_right=AD_process(1,2);
         if      ((V_left>V_right+f)&&(V_left-f>V_right)){a=1;}//左
         else if ((V_left+f<V_right)&&(V_left<V_right-f)){a=2;}//右邊
         else    {a=3;}//符合范圍
         return a;

}
/*返回光線強代號,比較上下電壓(光敏電阻光線越強阻值越小)*/
uint up_down_V_compare(uint f)
{
         uchar V_up,V_down;
         uint a;
         V_up=AD_process(2,1);
         V_down=AD_process(2,2);
         if      ((V_up>V_down+f)&&(V_up-f>V_down)){a=1;} //上
         else if ((V_up+f<V_down)&&(V_up<V_down-f)){a=2;}//下
         else                                      {a=3;}//符合范圍
         return a;
}

仿真與代碼51hei附件下載: 自動.zip (138.28 KB, 下載次數: 44)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎勵!

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人欧美 | 亚洲国产中文字幕 | 99re热这里只有精品视频 | 欧美精品成人一区二区三区四区 | 久久免费精彩视频 | 国产精品99免费视频 | 国产欧美精品区一区二区三区 | 日韩视频福利 | 午夜91| 日本在线免费看最新的电影 | 嫩草视频在线免费观看 | 一区二区久久 | 精品国产乱码久久久久久闺蜜 | 国产高清视频 | 欧美13videosex性极品 | 国产欧美一区二区三区免费 | 久久久免费在线观看 | 国产激情网 | 日韩a在线观看 | 亚洲成人一区二区 | 国产精品美女久久久久aⅴ国产馆 | 欧美性tv| 日韩在线观看一区二区三区 | 欧美亚洲高清 | 亚洲精品女优 | www.婷婷| 久久精品亚洲欧美日韩久久 | 美女精品一区 | 91亚洲精品国偷拍自产在线观看 | 成人精品国产免费网站 | 久久国产精品久久久久久 | 久久久国产精品入口麻豆 | 国产精品福利一区二区三区 | 亚洲一区二区三区四区五区午夜 | 日韩国产精品一区二区三区 | 亚洲精品视频一区 | 亚洲精品视频导航 | 亚洲精品资源 | 国产成年人小视频 | 18av在线播放 | 日韩www |