1. #include <reg51.h>  
  2. #include <intrins.h>    
  3. #include <absacc.h>    
  4.  
  5.  
  6. #define uchar unsigned char  
  7. #define uint unsigned int  
  8. #define ysfs  600                      //宏定义 预设风速  
  9. #define shuiping 1500                  //宏定义 水平位置AD转换结果  
  10. #define fuyang   1500                  //宏定义 俯仰位置AD转换结果  
  11. #define PA XBYTE [0x7CFF]              //8255芯片端口4个基地址宏定义  
  12. #define PB XBYTE [0x7FFD]  
  13. #define PC XBYTE [0x7FFE]  
  14. #define CONTROL XBYTE [0x7FFF]  
  15.  
  16.  
  17. sbit OE=P1^0;             //以下为关于AD0808与单片机的八个接口定义  
  18. sbit EOC=P1^1;  
  19. sbit START=P1^2;  
  20. sbit CLK=P1^3;   
  21. sbit ALE=P1^4;   
  22. sbit C0=P1^5;  
  23. sbit C1=P1^6;  
  24. sbit C2=P1^7;  
  25. sbit gdkg=P2^3;           //用于复位光电开关端口定义  
  26. sbit clock=P2^0;          //定义水平俯仰步进电机的速度端口,频率越快,速度越快,不给频率电机不转  
  27. sbit cw1=P2^1;            //定义水平步进电机的转向端口,1正转,0反转  
  28. sbit enable1=P2^2;        //定义水平步进电机的使能端口,1转,0不转  
  29. sbit cw2=P2^4;            //定义俯仰步进电机的转向端口,1正转,0反转  
  30. sbit enable2=P2^5;        //定义俯仰步进电机的使能端口,1转,0不转  
  31.  
  32.  
  33. uint ad_result_fenshu,ad_result_shuiping,ad_result_fuyang;  
  34.  
  35.  
  36. void timer_init()  
  37. {   
  38.      TMOD=0x11;                 //定时器模式设置  
  39.      TH0=(65536-5000)/256;  
  40.      TL0=(65536-5000)%6;                  
  41.      TH1=0xFF;  
  42.      TL1=0x9C;  
  43.      ET0=1;                     //允许定时器0中断  
  44.      TR0=1;                     //启动定时器0  
  45.      ET1=1;                     //允许定时器1中断  
  46.      TR1=1;                     //启动定时器1  
  47.      EA=1;                      //允许总中断  
  48. }  
  49.  
  50.  
  51. void AD_chane(int x)  
  52. {    
  53.      if(x==0)  
  54.      {  
  55.          C0=0;  
  56. C1=0;  
  57. C2=0;  
  58.      }  
  59.      else if(x==1)  
  60.      {  
  61.          C0=1;  
  62. C1=0;  
  63. C2=0;  
  64.      }  
  65.      else if(x==2)  
  66.      {  
  67.          C0=0;  
  68. C1=1;  
  69. C2=0;  
  70.      }  
  71.      ALE=1;  
  72. }  
  73.  
  74.  
  75. int Get_AD_Sd()  
  76. {    
  77.    int Sd;  
  78.    START=0;START=1;START=0;  
  79.    while(EOC==0);  
  80.    OE=1;  
  81.    Sd=P3;     
  82.    OE=0;  
  83.    return Sd;  
  84. }  
  85.  
  86.  
  87. void reset()  
  88. {  
  89.     while(gdkg!=1)  
  90.     {  
  91.    cw2=0;    
  92.    enable2=1;  
  93.     }  
  94.     enable2=0;  
  95. }  
  96.  
  97.  
  98. void shuiping_tiaozheng(int date)  
  99. {  
  100.      if(date>shuiping)  
  101.      {  
  102.          do 
  103.          {  
  104.      cw1=1;  
  105.      enable1=1;  
  106.          }   
  107.          while(date==shuiping);  
  108.          enable1=0;  
  109.      }  
  110.      else if(date<shuiping)  
  111.      {  
  112.          do 
  113.          {  
  114.      cw1=0;  
  115.      enable1=1;  
  116.          }   
  117.          while(date==shuiping);  
  118.          enable1=0;  
  119.      }  
  120. }  
  121.  
  122.  
  123. void fuyang_tiaozheng(int date)  
  124. {  
  125.      if(date>fuyang)  
  126.      {  
  127.          do 
  128.          {  
  129.      cw2=1;  
  130.      enable2=1;  
  131.          }   
  132.          while(date==fuyang);  
  133.          enable2=0;  
  134.      }  
  135.      else if(date<fuyang)  
  136.      {  
  137.          do 
  138.          {  
  139.      cw2=0;  
  140.      enable2=1;  
  141.          }   
  142.          while(date==fuyang);  
  143.          enable2=0;  
  144.      }  
  145. }  
  146.  
  147.  
  148. void main()  
  149. {  
  150.         CONTROL = 0x80;  
  151. ALE=0;  
  152.         timer_init();  
  153. enable1=0;  
  154. enable2=0;  
  155. while(1)                                    //进入循环  
  156. {  
  157.   AD_chane(0);  
  158.                    ad_result_fenshu=Get_AD_Sd();  
  159.   ALE=0;  
  160.   AD_chane(1);  
  161.                    ad_result_shuiping=Get_AD_Sd();  
  162.   ALE=0;  
  163.   AD_chane(2);  
  164.                    ad_result_fuyang=Get_AD_Sd();  
  165.   ALE=0;  
  166.                    if(ad_result_fenshu>ysfs)        //如果风速大于预设风速,则复位  
  167.   {  
  168.   reset();  
  169.   }  
  170.                    shuiping_tiaozheng(ad_result_shuiping);  
  171.   fuyang_tiaozheng(ad_result_fuyang);  
  172. }    
  173. }  
  174.  
  175.  
  176. void timer0() interrupt 1  
  177. {  
  178.     TH0=(65536-5000)/256;  
  179.     TL0=(65536-5000)%6;  
  180.     CLK=~CLK;  
  181. }  
  182.  
  183.  
  184.  
  185.  
  186. void timer1() interrupt 3  
  187. {  
  188.      static uchar i=0;  
  189.      TH1=0xFF;  
  190.      TL1=0x9C;  
  191.      ++i;  
  192.      if (i>10) i=0;  
  193.      if (i<=6)          
  194.         clock=0;  
  195.      else 
  196.         clock=1;      
  197. }