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

📄 408al.c

📁 控制CCD曝光
💻 C
字号:
#include <reg51.h>
#include <stdio.h>
#include <intrins.h>
#include <math.h>

/******************************与编译器无关的数据类型定义*********************************/
typedef unsigned char      uint8;              
typedef signed   char      int8;  
typedef unsigned short     uint16;              
typedef signed   short     int16;               
typedef unsigned long      uint32;        
typedef signed   long      int32;            
typedef float              fp32;      
typedef double             fp64;    
/********************************************************************************************
* 定义参数变量名
*********************************************************************************************/
sbit START=P3^5;
sbit STR=P3^6;
sbit SUBTIME=P3^7;
sbit CE=P1^0;
sbit OE=P1^1;
sbit STDBY=P1^2;
sbit SEN=P1^4;
sbit SCLK=P1^5;
sbit ACC_0=ACC^0;
sbit SDATA=P1^6;
sbit ACLK=P1^7;
sbit ADD_SUN=P2^5;
sbit SUBB_SUN=P2^7;
unsigned char NumINT0, TIME_NUM, WAIT;
unsigned char COM_P,STOP,COM_DATA;

/********************************************************************************************
* 函数名称:COM1()   (SMOD=1,则波特率=19200) (SMOD=0,则波特率=9600)
* 功    能:串口初始化,用于串口数据发送(晶振为11.0592MHZ)
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void COM1()
{
TMOD=0X22;               //(设置定时器T0工作在方式2)
TL1=0XFD;
TH1=0XFD;
SCON=0X50;             //(采用方式1,波特率可变,带奇偶校验的)
PCON=0X80;           //(SMOD=1)
TR1=1;
}

/********************************************************************************************
* 函数名称:EXIT_INT0()
* 功    能:外部中断0程序,用于检测CPLD计数地址是否计数完毕,转由单片机调用地址。
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void EXIT_INT0() interrupt 0	//外部中断0子程序
{
 unsigned char CCD_DATAL,CCD_DATAH,CCD_DATA;
 unsigned char K1;
 unsigned int K2;
 NumINT0-=1;	  //第一,第二次曝光都放弃,第三次曝光保存。
 
 if(NumINT0==0)
 {
  START=0;		 //START为低电平,表示CPLD计数地址停止,由单片机ACLK发出脉冲信号计数地址。
  STR=1;		 //STR为高电平,关闭74HC244,此时74HC244输出呈高阻态
  STDBY=1;       //关闭TDA9965输出
  while(COM_DATA!=66)   //握手协议,准备发送串行数据给上位机PC
  {
   SBUF=88;
   while(TI==0);
   TI=0;
   while(RI==0);
   RI=0;
   COM_DATA=SBUF;
  }							// while(COM_DATA!=66) 循环语句结束
  COM_DATA=0X22;
  for(K1=0;K1<247;K1++)  
  {
  for(K2=1;K2<769;K2++)
  {
  OE=0;
  CCD_DATAL=P0;
  CCD_DATAH=P2;
  OE=1;				   //读控制信号有效
  CCD_DATA=(CCD_DATAH<<4)+(CCD_DATAL>>4);
  ACLK=0;		  //地址计数脉冲信号
  ACLK=1;
  if(K2%2==1)			   
  {
  SBUF=CCD_DATA;  		  //将累加器数据送入SBUF,准备发送
  while(TI==0);
  TI=0;
  }  //	if(K1==244)语句结束
  }		     //for循环语句结束
  }
  COM_P=0X00;
  NumINT0=3;  //重新赋NumINT0值
  START=1;	  //转向由CPLD开始对地址计数
  STR=0;		 //STR为低电平,开启74HC244
  STDBY=0;       //启动TDA9965输出
  OE=1;			 //读控制信号无效
  }			 //if(NumINT0==0)循环语句结束
  STOP=0X02;
 }

 /********************************************************************************************
* 函数名称:delay_1ms()
* 功    能:软件延时
* 入口参数:t    延时参数,t值越大,延时越长
* 出口参数:无
*********************************************************************************************/
void delay_1ms(unsigned char t)
{ 
unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<120;j++);
}

void delay_50us(unsigned char t1)
{ 
unsigned int i,j;
for(i=0;i<t1;i++)
for(j=0;j<120;j++);
}
 /********************************************************************************************
* 函数名称:EXIT_INT1()
* 功    能:外部中断1程序,采用外部中断1的下跳沿信号,对CCD进行曝光控制。
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void EXIT_INT1() interrupt 2
{
SUBTIME=0;			//SUBTIME为低电平,开始进行曝光控制;
delay_50us(TIME_NUM);  //根据设置TIME_NUM的数值,进行曝光延时控制;
SUBTIME=1;
}
 /********************************************************************************************
* 函数名称:TDA9965()
* 功    能:对TDA9965写入参数值。
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
 void TDA9965(unsigned int TDA_SDATA)
 {
  unsigned char i;
  SCLK=0;
  SEN=0;
  for(i=0;i<12;i++)
  {
  TDA_SDATA=_iror_(TDA_SDATA,1);   //右循环移位,将参数一位位的参数移到SDATA中
  ACC=TDA_SDATA;
  SDATA=ACC_0;
  SCLK=1;
  SCLK=0;
  }
  SEN=1;
  SCLK=1;
  }
  
/********************************************************************************************
* 函数名称:main()
* 功    能:主函数
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void main()
{
 STR=0;						   //74HC244工作有效,74HC244输出A=Y;
 START=1;					   //START为高电平,CPLD对地址计数有效;
 STDBY=0;                      //STDBY为低电平,启动TDA9965芯片工作。
 OE=1;						   //OE为高电平,关闭外部数据储存器的读控制信号;
 CE=0;						   	   //CE为低电平,外部数据存储器选通;
 TIME_NUM=20;				
 STOP=0X01;	
 COM_P=0X00;
 COM_DATA=0X22;    //COM_DATA初始化
 TDA9965(0X3FF0);
 TDA9965(0X4FF0);
 TDA9965(0XAAE0);
 TDA9965(0XC070);
 SUBTIME=1;				   //SUBTIME为高电平,单片机没有实时曝光控制;
 NumINT0=0X03;				   //采用三次曝光取一次曝光值,进行存储;
 COM1();
  EA=1;
 EX1=1;
 IT1=1;	
 ADD_SUN=1;
 SUBB_SUN=1;


while(1)
{

if(ADD_SUN==0)	//判断是否有"+"键被按下,如果有,每按下一次"+"键,相应的曝光延时增加1ms
{
delay_1ms(10);
if(ADD_SUN==0)
{
if(TIME_NUM<80)
TIME_NUM=TIME_NUM+1;
else
TIME_NUM=80; 
while(ADD_SUN==0);
delay_1ms(10);
}
}


if(SUBB_SUN==0)		//判断是否有"-"键被按下,如果有,每按下一次"-"键,相应的曝光延时减少1ms
{
delay_1ms(10);
if(SUBB_SUN==0)
{
if(TIME_NUM>1)
TIME_NUM=TIME_NUM-1;   
else
TIME_NUM=1;
while(SUBB_SUN==0);
delay_1ms(10);
}
}

 
if(RI==1)		   //如果PC机KEY键有按下,则转向中断处理
{
 RI=0;
 COM_P=SBUF;

  while(COM_P==0X01)   //如果PC机KEY1键有按下,循环一次退出
   {
   EX0=1;
   IT0=1;
   while(STOP==0X01);
   STOP=0X01;
   EX0=0;
   IT0=0;
   }  

while(COM_P==0X02)	//如果PC机KEY2键有按下,则一直循环	
{
   EX0=1;
   IT0=1;
   while(STOP==0X01); 
   STOP=0X01;
   if(RI==1)
   {
   RI=0;
   COM_P=SBUF;
  }
  if(COM_P==0X03)
  break;

  COM_P=0X02;
}

} //结束if(RI==1)语句
} //结束while(1)循环语句

 }//main主函数结束

⌨️ 快捷键说明

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