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

📄 408al.lst

📁 控制CCD曝光
💻 LST
字号:
C51 COMPILER V8.08   408AL                                                                 02/11/2009 11:21:57 PAGE 1   


C51 COMPILER V8.08, COMPILATION OF MODULE 408AL
OBJECT MODULE PLACED IN 408al.OBJ
COMPILER INVOKED BY: E:\应用软件\keil c\C51\BIN\C51.EXE 408al.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <reg51.h>
   2          #include <stdio.h>
   3          #include <intrins.h>
   4          #include <math.h>
   5          
   6          /******************************与编译器无关的数据类型定义*********************************/
   7          typedef unsigned char      uint8;              
   8          typedef signed   char      int8;  
   9          typedef unsigned short     uint16;              
  10          typedef signed   short     int16;               
  11          typedef unsigned long      uint32;        
  12          typedef signed   long      int32;            
  13          typedef float              fp32;      
  14          typedef double             fp64;    
  15          /********************************************************************************************
  16          * 定义参数变量名
  17          *********************************************************************************************/
  18          sbit START=P3^5;
  19          sbit STR=P3^6;
  20          sbit SUBTIME=P3^7;
  21          sbit CE=P1^0;
  22          sbit OE=P1^1;
  23          sbit STDBY=P1^2;
  24          sbit SEN=P1^4;
  25          sbit SCLK=P1^5;
  26          sbit ACC_0=ACC^0;
  27          sbit SDATA=P1^6;
  28          sbit ACLK=P1^7;
  29          sbit ADD_SUN=P2^5;
  30          sbit SUBB_SUN=P2^7;
  31          unsigned char NumINT0, TIME_NUM, WAIT;
  32          unsigned char COM_P,STOP,COM_DATA;
  33          
  34          /********************************************************************************************
  35          * 函数名称:COM1()   (SMOD=1,则波特率=19200) (SMOD=0,则波特率=9600)
  36          * 功    能:串口初始化,用于串口数据发送(晶振为11.0592MHZ)
  37          * 入口参数:无
  38          * 出口参数:无
  39          *********************************************************************************************/
  40          void COM1()
  41          {
  42   1      TMOD=0X22;               //(设置定时器T0工作在方式2)
  43   1      TL1=0XFD;
  44   1      TH1=0XFD;
  45   1      SCON=0X50;             //(采用方式1,波特率可变,带奇偶校验的)
  46   1      PCON=0X80;           //(SMOD=1)
  47   1      TR1=1;
  48   1      }
  49          
  50          /********************************************************************************************
  51          * 函数名称:EXIT_INT0()
  52          * 功    能:外部中断0程序,用于检测CPLD计数地址是否计数完毕,转由单片机调用地址。
  53          * 入口参数:无
  54          * 出口参数:无
  55          *********************************************************************************************/
C51 COMPILER V8.08   408AL                                                                 02/11/2009 11:21:57 PAGE 2   

  56          void EXIT_INT0() interrupt 0    //外部中断0子程序
  57          {
  58   1       unsigned char CCD_DATAL,CCD_DATAH,CCD_DATA;
  59   1       unsigned char K1;
  60   1       unsigned int K2;
  61   1       NumINT0-=1;      //第一,第二次曝光都放弃,第三次曝光保存。
  62   1       
  63   1       if(NumINT0==0)
  64   1       {
  65   2        START=0;               //START为低电平,表示CPLD计数地址停止,由单片机ACLK发出脉冲信号计数地址。
  66   2        STR=1;                 //STR为高电平,关闭74HC244,此时74HC244输出呈高阻态
  67   2        STDBY=1;       //关闭TDA9965输出
  68   2        while(COM_DATA!=66)   //握手协议,准备发送串行数据给上位机PC
  69   2        {
  70   3         SBUF=88;
  71   3         while(TI==0);
  72   3         TI=0;
  73   3         while(RI==0);
  74   3         RI=0;
  75   3         COM_DATA=SBUF;
  76   3        }                                                     // while(COM_DATA!=66) 循环语句结束
  77   2        COM_DATA=0X22;
  78   2        for(K1=0;K1<247;K1++)  
  79   2        {
  80   3        for(K2=1;K2<769;K2++)
  81   3        {
  82   4        OE=0;
  83   4        CCD_DATAL=P0;
  84   4        CCD_DATAH=P2;
  85   4        OE=1;                            //读控制信号有效
  86   4        CCD_DATA=(CCD_DATAH<<4)+(CCD_DATAL>>4);
  87   4        ACLK=0;                 //地址计数脉冲信号
  88   4        ACLK=1;
  89   4        if(K2%2==1)                      
  90   4        {
  91   5        SBUF=CCD_DATA;                  //将累加器数据送入SBUF,准备发送
  92   5        while(TI==0);
  93   5        TI=0;
  94   5        }  // if(K1==244)语句结束
  95   4        }                  //for循环语句结束
  96   3        }
  97   2        COM_P=0X00;
  98   2        NumINT0=3;  //重新赋NumINT0值
  99   2        START=1;        //转向由CPLD开始对地址计数
 100   2        STR=0;                 //STR为低电平,开启74HC244
 101   2        STDBY=0;       //启动TDA9965输出
 102   2        OE=1;                  //读控制信号无效
 103   2        }                      //if(NumINT0==0)循环语句结束
 104   1        STOP=0X02;
 105   1       }
 106          
 107           /********************************************************************************************
 108          * 函数名称:delay_1ms()
 109          * 功    能:软件延时
 110          * 入口参数:t    延时参数,t值越大,延时越长
 111          * 出口参数:无
 112          *********************************************************************************************/
 113          void delay_1ms(unsigned char t)
 114          { 
 115   1      unsigned int i,j;
 116   1      for(i=0;i<t;i++)
 117   1      for(j=0;j<120;j++);
C51 COMPILER V8.08   408AL                                                                 02/11/2009 11:21:57 PAGE 3   

 118   1      }
 119          
 120          void delay_50us(unsigned char t1)
 121          { 
 122   1      unsigned int i,j;
 123   1      for(i=0;i<t1;i++)
 124   1      for(j=0;j<120;j++);
 125   1      }
 126           /********************************************************************************************
 127          * 函数名称:EXIT_INT1()
 128          * 功    能:外部中断1程序,采用外部中断1的下跳沿信号,对CCD进行曝光控制。
 129          * 入口参数:无
 130          * 出口参数:无
 131          *********************************************************************************************/
 132          void EXIT_INT1() interrupt 2
 133          {
 134   1      SUBTIME=0;                      //SUBTIME为低电平,开始进行曝光控制;
 135   1      delay_50us(TIME_NUM);  //根据设置TIME_NUM的数值,进行曝光延时控制;
 136   1      SUBTIME=1;
 137   1      }
 138           /********************************************************************************************
 139          * 函数名称:TDA9965()
 140          * 功    能:对TDA9965写入参数值。
 141          * 入口参数:无
 142          * 出口参数:无
 143          *********************************************************************************************/
 144           void TDA9965(unsigned int TDA_SDATA)
 145           {
 146   1        unsigned char i;
 147   1        SCLK=0;
 148   1        SEN=0;
 149   1        for(i=0;i<12;i++)
 150   1        {
 151   2        TDA_SDATA=_iror_(TDA_SDATA,1);   //右循环移位,将参数一位位的参数移到SDATA中
 152   2        ACC=TDA_SDATA;
 153   2        SDATA=ACC_0;
 154   2        SCLK=1;
 155   2        SCLK=0;
 156   2        }
 157   1        SEN=1;
 158   1        SCLK=1;
 159   1        }
 160            
 161          /********************************************************************************************
 162          * 函数名称:main()
 163          * 功    能:主函数
 164          * 入口参数:无
 165          * 出口参数:无
 166          *********************************************************************************************/
 167          void main()
 168          {
 169   1       STR=0;                                            //74HC244工作有效,74HC244输出A=Y;
 170   1       START=1;                                          //START为高电平,CPLD对地址计数有效;
 171   1       STDBY=0;                      //STDBY为低电平,启动TDA9965芯片工作。
 172   1       OE=1;                                             //OE为高电平,关闭外部数据储存器的读控制信号;
 173   1       CE=0;                                                     //CE为低电平,外部数据存储器选通;
 174   1       TIME_NUM=20;                           
 175   1       STOP=0X01;     
 176   1       COM_P=0X00;
 177   1       COM_DATA=0X22;    //COM_DATA初始化
 178   1       TDA9965(0X3FF0);
 179   1       TDA9965(0X4FF0);
C51 COMPILER V8.08   408AL                                                                 02/11/2009 11:21:57 PAGE 4   

 180   1       TDA9965(0XAAE0);
 181   1       TDA9965(0XC070);
 182   1       SUBTIME=1;                                //SUBTIME为高电平,单片机没有实时曝光控制;
 183   1       NumINT0=0X03;                             //采用三次曝光取一次曝光值,进行存储;
 184   1       COM1();
 185   1        EA=1;
 186   1       EX1=1;
 187   1       IT1=1; 
 188   1       ADD_SUN=1;
 189   1       SUBB_SUN=1;
 190   1      
 191   1      
 192   1      while(1)
 193   1      {
 194   2      
 195   2      if(ADD_SUN==0)  //判断是否有"+"键被按下,如果有,每按下一次"+"键,相应的曝光延时增加1ms
 196   2      {
 197   3      delay_1ms(10);
 198   3      if(ADD_SUN==0)
 199   3      {
 200   4      if(TIME_NUM<80)
 201   4      TIME_NUM=TIME_NUM+1;
 202   4      else
 203   4      TIME_NUM=80; 
 204   4      while(ADD_SUN==0);
 205   4      delay_1ms(10);
 206   4      }
 207   3      }
 208   2      
 209   2      
 210   2      if(SUBB_SUN==0)         //判断是否有"-"键被按下,如果有,每按下一次"-"键,相应的曝光延时减少1ms
 211   2      {
 212   3      delay_1ms(10);
 213   3      if(SUBB_SUN==0)
 214   3      {
 215   4      if(TIME_NUM>1)
 216   4      TIME_NUM=TIME_NUM-1;   
 217   4      else
 218   4      TIME_NUM=1;
 219   4      while(SUBB_SUN==0);
 220   4      delay_1ms(10);
 221   4      }
 222   3      }
 223   2      
 224   2       
 225   2      if(RI==1)                  //如果PC机KEY键有按下,则转向中断处理
 226   2      {
 227   3       RI=0;
 228   3       COM_P=SBUF;
 229   3      
 230   3        while(COM_P==0X01)   //如果PC机KEY1键有按下,循环一次退出
 231   3         {
 232   4         EX0=1;
 233   4         IT0=1;
 234   4         while(STOP==0X01);
 235   4         STOP=0X01;
 236   4         EX0=0;
 237   4         IT0=0;
 238   4         }  
 239   3      
 240   3      while(COM_P==0X02)      //如果PC机KEY2键有按下,则一直循环      
 241   3      {
C51 COMPILER V8.08   408AL                                                                 02/11/2009 11:21:57 PAGE 5   

 242   4         EX0=1;
 243   4         IT0=1;
 244   4         while(STOP==0X01); 
 245   4         STOP=0X01;
 246   4         if(RI==1)
 247   4         {
 248   5         RI=0;
 249   5         COM_P=SBUF;
 250   5        }
 251   4        if(COM_P==0X03)
 252   4        break;
 253   4      
 254   4        COM_P=0X02;
 255   4      }
 256   3      
 257   3      } //结束if(RI==1)语句
 258   2      } //结束while(1)循环语句
 259   1      
 260   1       }//main主函数结束


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    517    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      6    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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