📄 408al.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 + -