⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ledctrl.lst

📁 用于摄象机同步控制LED闪光灯的代码,LED闪光是已经倍频过的,不会引起人眼视觉上的闪烁感.
💻 LST
📖 第 1 页 / 共 4 页
字号:
C51 COMPILER V7.02a   LEDCTRL                                                              06/16/2007 13:26:02 PAGE 1   


C51 COMPILER V7.02a, COMPILATION OF MODULE LEDCTRL
OBJECT MODULE PLACED IN LedCtrl.OBJ
COMPILER INVOKED BY: D:\keil\C51\BIN\C51.EXE LedCtrl.c BROWSE DEBUG OBJECTEXTEND CODE

stmt level    source

   1          #include <reg51.h>
   2          #include <stdio.h>
   3          
   4           
   5          #define osc 12000000
   6          
   7          #define SET_MODE_MAP 0x01; //P1口     P1.0   0:固定模式  1:串口跟踪模式
   8          #define SET_MODE_PORT  P1 ;//
   9          
  10          #define SYS_MODE_MAP 0x02; //P1口     P1.1   0:PAL制式   1:NTSC制式
  11          #define SYS_MODE_PORT  P1 ;//
  12          
  13          #define T_NTSC   16667   //  NTSC制式视频信号的场同步周期:16667us
  14          #define T_PAL    20000   //  PAL制式视频信号的场同步周期:20000us
  15          
  16          
  17          #define WIDTH_MAP 0x3F ; //P2口   P2.0---P2.5
  18          #define WIDTH_PORT  P2 ;//
  19          
  20          #define PHASE_MAP_H 0xC0 ; //P2口   P2.6 P2.7
  21          #define PHASE_H_PORT  P2 ;//
  22          
  23          #define PHASE_MAP_L 0xFF ; //P0口   P0.7--P0.0
  24          #define PHASE_L_PORT  P0 ;//
  25          
  26          #define PHASE_MAP 0x03FF ; //
  27          
  28          
  29          #define PHASE_PORT  P0 ;//
  30          
  31          
  32          sbit CLEAR_SYNC=P1^2;
  33          sbit SET_LAMP=P1^3;
  34          sbit CLEAR_LAMP=P1^4;
  35          
  36          unsigned int  TVSYNC;      //场同步信号的周期时间,单位:us
  37          unsigned int Phase_time;
  38          unsigned int Width_time;
  39          unsigned char Set_Mode;
  40          unsigned char MODE;//temp
  41          
  42          unsigned char Sys_Mode;
  43          unsigned char Pre_Sys_Mode;
  44          
  45          unsigned char UART_DATA_VALID;
  46          
  47          
  48          unsigned char Pre_Set_Mode;
  49          unsigned int temp_phase;
  50          unsigned int temp_width;
  51          
  52          unsigned int port0_Reg;
  53          unsigned int port2_Reg;
  54          unsigned int Pre_Port0_Reg;
  55          unsigned int Pre_Port2_Reg;
C51 COMPILER V7.02a   LEDCTRL                                                              06/16/2007 13:26:02 PAGE 2   

  56          
  57          unsigned char Vsync_found; //消息   1:场同步中断已发生   0:已知晓并处理完毕
  58          unsigned char Vsync_INT;  //消息   1:场同步中断已发生   0:已知晓并处理完毕
  59          unsigned char Job_Finished;  //消息   1:工作完成   0:工作未完成
  60          
  61          unsigned char TH0_Phase;
  62          unsigned char TL0_Phase;
  63          unsigned char TH0_DPhase;
  64          unsigned char TL0_DPhase;
  65          unsigned char TH1_Width;
  66          unsigned char TL1_Width;
  67          
  68          void set_T0_Phase(void);    //设置相位定时参数
  69          void set_T1_Width(void);    //设置闪光脉冲宽度参数
  70          void set_T0_DPhase(void);
  71          
  72          void SW_set_Phase(void);    //根据开关设置相位及宽度参数
  73          void SW_set_sys_Mode(void); //根据开关设置系统的制式参数
  74          
  75          #define SET_T0_P  { TH0 = TH0_Phase;  TL0 = TL0_Phase;}
  76          #define SET_T0_D  { TH0 = TH0_DPhase;  TL0 = TL0_DPhase;}
  77          #define SET_T1_W  { TH1 = TH1_Width;  TL1 = TL1_Width;}
  78          
  79          
  80          void main()
  81          {
  82   1        P0 = 0xFF;//关闭所有P0口输出
  83   1        P1 = 0xFF;//关闭所有P1口输出
  84   1        P2 = 0xFF;//关闭所有P2口输出
  85   1        P3 = 0xFF;//关闭所有P3口输出
  86   1        
  87   1        Vsync_found = 0;//未发现同步
  88   1        Job_Finished = 0;
  89   1      
  90   1        CLEAR_SYNC = 0 ;//wait for Vsync  
  91   1        CLEAR_SYNC = 1 ;
  92   1      
  93   1        SET_LAMP   = 1 ;
  94   1        CLEAR_LAMP = 0 ;//Lamp OFF
  95   1        CLEAR_LAMP = 1 ;
  96   1      
  97   1        MODE = SET_MODE_PORT;//读取设置模式
  98   1        MODE &= SET_MODE_MAP;//
  99   1        Set_Mode = MODE & 0x01 ;//获得设置模式
 100   1      
 101   1        //根据外部开关设置的状态设置视频制式
 102   1        SW_set_sys_Mode();
 103   1      
 104   1        port0_Reg = PHASE_PORT;//读取相位端口
 105   1        port2_Reg = WIDTH_PORT;//读取宽度端口
 106   1        SW_set_Phase(); //上电默认状态变化,设置相应参数
 107   1        
 108   1      
 109   1        UART_DATA_VALID = 0;//串口设置数据无效
 110   1      
 111   1        ET0=1;  //定时器/计数器0允许中断
 112   1        ET1=1;  //定时器/计数器1允许中断
 113   1      
 114   1        EX0=1;  //启动外部中断0开始工作
 115   1        EX1=1;  //启动外部中断1开始工作
 116   1      
 117   1        TR0=0;         //关闭定时器/计数器0开始工作  上电复位默认不打开,等待场同步中断打开定时器
C51 COMPILER V7.02a   LEDCTRL                                                              06/16/2007 13:26:02 PAGE 3   

 118   1        TR1=0;         //关闭定时器/计数器1开始工作
 119   1        TMOD = 0X11;   //内部的GATE控制
 120   1        { SET_T1_W }   //  { TH1 = TH1_Width;  TL1 = TL1_Width;}
 121   1        { SET_T0_P }   //  { TH0 = TH0_Phase;  TL0 = TL0_Phase;}
 122   1                       
 123   1        Vsync_INT = 0;
 124   1        //等第一个视频中断信号出现后,会自动打开定时器/计数器0
 125   1        IT0 = 1;//外部中断1边沿触发中断
 126   1        IT1 = 1;//外部中断0边沿触发中断
 127   1        PX1 = 1;//外部中断1处于高优先级
 128   1        PX0 = 0;//外部中断0处于低优先级
 129   1        PT0 = 0;//定时器0中断处于低优先级
 130   1        PT1 = 0;//定时器1中断处于低优先级
 131   1        EA=1;//总中断允许
 132   1      
 133   1        while(1)
 134   1        {
 135   2          if(Vsync_found==1)
 136   2              {//当同步信号出现时,才改变各种参数,等待以后使用
 137   3                Vsync_found = 0;//清除标志
 138   3      
 139   3            port0_Reg = PHASE_PORT;//读取当前值
 140   3            port2_Reg = WIDTH_PORT;//读取当前值
 141   3      
 142   3            MODE = SET_MODE_PORT;//读取设置模式
 143   3            MODE &= SET_MODE_MAP;//
 144   3            Set_Mode = MODE & 0x01 ;//获得设置模式
 145   3                if(Set_Mode != Pre_Set_Mode)  SW_set_Phase(); //若状态变化,设置相应参数
 146   3      
 147   3            MODE = SYS_MODE_PORT;//读取视频信号制式
 148   3            MODE &= SYS_MODE_MAP;//
 149   3            Sys_Mode = (MODE >> 1) & 0x01;//获得视频信号制式
 150   3                if(Sys_Mode != Pre_Sys_Mode)  SW_set_sys_Mode(); //若制式变化,设置相应制式参数
 151   3      
 152   3            if(Set_Mode == 1)
 153   3                {//当闪光参数由外部控制时,需要检测参数的变化
 154   4              if( (Pre_Port0_Reg != port0_Reg)||(Pre_Port2_Reg != port2_Reg) )
 155   4                  {//端口数据变化
 156   5                        SW_set_Phase(); //若参数变化,设置相应参数
 157   5                      }
 158   4            }
 159   3          }
 160   2        }//while(1) 等待中断
 161   1      }
 162          
 163          //设置相位定时参数
 164          void set_T0_Phase(void)
 165          {
 166   1        if( Phase_time >= (TVSYNC/2) )
 167   1        {//相位大于TVSYNC/2
 168   2          TH0_Phase = ( (65535- Phase_time+(TVSYNC/2) ) >> 8); //倍频后的相位
 169   2          TL0_Phase = ( (65535- Phase_time+(TVSYNC/2) ) & 0xFF);
 170   2        }
 171   1        else
 172   1        {//相位小于TVSYNC/2
 173   2          TH0_Phase = ( (65535- Phase_time ) >> 8); //倍频后的相位
 174   2          TL0_Phase = ( (65535- Phase_time ) & 0xFF);
 175   2        }
 176   1      }
 177          
 178          //设置倍频相位定时参数
 179          void set_T0_DPhase(void)
C51 COMPILER V7.02a   LEDCTRL                                                              06/16/2007 13:26:02 PAGE 4   

 180          {
 181   1        TH0_DPhase = ( (65535 - (TVSYNC/2) + Width_time  ) >> 8); //倍频后的第二个脉冲的相位
 182   1        TL0_DPhase = ( (65535 - (TVSYNC/2) + Width_time  ) & 0xFF);
 183   1      }
 184          
 185          //设置闪光脉冲宽度参数
 186          void set_T1_Width(void)
 187          {
 188   1        TH1_Width = ((65535- Width_time) >> 8); //脉冲宽度
 189   1        TL1_Width = ((65535- Width_time) & 0xFF);              
 190   1      }
 191          
 192          
 193          
 194          //根据外部开关设置的状态设置视频制式
 195          void SW_set_sys_Mode(void)
 196          {
 197   1        MODE = SYS_MODE_PORT;//读取视频信号制式
 198   1        MODE &= SYS_MODE_MAP;//
 199   1        Sys_Mode = (MODE >> 1) & 0x01;//获得视频信号制式
 200   1      
 201   1        if(Sys_Mode==0) TVSYNC = T_PAL;  //PAL制式的周期时间
 202   1        else TVSYNC = T_NTSC;            //NTSC制式的周期时间
 203   1      
 204   1        Pre_Sys_Mode = Sys_Mode;
 205   1      
 206   1        set_T0_Phase();    //设置相位定时参数
 207   1        set_T1_Width();    //设置闪光脉冲宽度参数
 208   1        set_T0_DPhase();
 209   1      }
 210          
 211          //根据外部开关设置的状态设置闪光脉冲的相位和宽度以及倍频需要的参数
 212          void SW_set_phase(void)
 213          {
 214   1        unsigned int TempInt;
 215   1        //计算宽度
 216   1        TempInt = 0;
 217   1        temp_width = WIDTH_PORT;
 218   1        temp_width &= WIDTH_MAP;//WIDTH_MAP 0x3F P2.0 --- P2.5
 219   1      
 220   1        if (temp_width & 0x01) TempInt = (TempInt<<1) + 1;  //P2.0=1
 221   1        else TempInt = TempInt << 1;                        //P2.0=0
 222   1        temp_width  >>= 1;
 223   1        if (temp_width & 0x01) TempInt = (TempInt<<1) + 1;  //P2.1=1
 224   1        else TempInt = TempInt << 1;                        //P2.1=0
 225   1        temp_width  >>= 1;
 226   1        if (temp_width & 0x01) TempInt = (TempInt<<1) + 1;  //P2.2=1
 227   1        else TempInt = TempInt << 1;                        //P2.2=0
 228   1        temp_width  >>= 1;
 229   1        if (temp_width & 0x01) TempInt = (TempInt<<1) + 1;  //P2.3=1
 230   1        else TempInt = TempInt << 1;                        //P2.3=0
 231   1        temp_width  >>= 1;
 232   1        if (temp_width & 0x01) TempInt = (TempInt<<1) + 1;  //P2.4=1
 233   1        else TempInt = TempInt << 1;                        //P2.4=0
 234   1        temp_width  >>= 1;
 235   1        if (temp_width & 0x01) TempInt = (TempInt<<1) + 1;  //P2.5=1
 236   1        else TempInt = TempInt << 1;                        //P2.5=0
 237   1        
 238   1        temp_width = TempInt * 150;       // 最大值  63*150 uS    定时步长150微秒
 239   1      
 240   1        //计算相位
 241   1        TempInt = 0;
C51 COMPILER V7.02a   LEDCTRL                                                              06/16/2007 13:26:02 PAGE 5   

 242   1        temp_phase = PHASE_H_PORT;//P2口   P2.6 P2.7
 243   1        temp_phase &= PHASE_MAP_H;//PHASE_MAP_H 0xC0
 244   1        if (temp_phase & 0x40) TempInt = (TempInt<<1) + 1;  //P2.6=1
 245   1        else TempInt = TempInt << 1;                        //P2.6=0
 246   1        temp_phase  >>= 1;
 247   1        if (temp_phase & 0x40) TempInt = (TempInt<<1) + 1;  //P2.7=1
 248   1        else TempInt = TempInt << 1;                        //P2.7=0
 249   1      
 250   1        temp_phase = PHASE_L_PORT;
 251   1        temp_phase &= PHASE_MAP;//D7...D0
 252   1        temp_phase += TempInt*256;//将D9 D8考虑进来
 253   1        if(temp_phase >999) temp_phase = 0;  //最大设置999
 254   1        temp_phase *= 20;  // 最大值  999*20 uS    定时步长20微秒
 255   1            
 256   1        Phase_time = temp_phase;  // 新设置的相位
 257   1        Width_time = temp_width;  // 新设置的宽度
 258   1        
 259   1        Pre_Set_Mode = Set_Mode; //修改当前状态完成
 260   1        Pre_Port0_Reg = port0_Reg;//修改当前状态参数
 261   1        Pre_Port2_Reg = port2_Reg;//修改当前状态参数
 262   1      
 263   1        set_T0_Phase();    //设置相位定时参数
 264   1        set_T1_Width();    //设置闪光脉冲宽度参数
 265   1        set_T0_DPhase();
 266   1      
 267   1      }
 268          
 269          
 270          void int0_int(void) interrupt 0
 271          {
 272   1      }
 273          void int1_int(void) interrupt 2
 274          {// 场同步中断    打开定时器0
 275   1      
 276   1        Vsync_INT = 1;    //同步中断
 277   1        Vsync_found = 1;  //发现同步
 278   1        { SET_T0_P }      //  { TH0 = TH0_Phase;  TL0 = TL0_Phase;}
 279   1        TR0=1;            //打开T0定时器
 280   1      }
 281          
 282          void timer0_int(void) interrupt 1 
 283          {//定时器0的中断  打开定时器1,关闭定时器0
 284   1      
 285   1      //定时器0用于对脉冲相位定时
 286   1          SET_LAMP   = 0 ;//打开光源,闪光开始
 287   1          SET_LAMP   = 1 ;
 288   1      
 289   1          TR0=0;           //关闭T0定时器
 290   1          { SET_T1_W }     //  { TH1 = TH1_Width;  TL1 = TL1_Width;}
 291   1          TR1=1;           //打开定时器1,开始光脉冲宽度定时
 292   1      
 293   1          if(Vsync_INT==1) 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -