📄 i2c.c
字号:
//close all other interrupt source
EX0=0;
EX1=0;
ET1=0;
ES=1;
EA=1; // open all interrupt enable
}
void mcu_send(uchar tdata)
{
while(TI==1);
SBUF=tdata;
}
void port_send(unsigned char port,unsigned char value)
{
unsigned char tdata;
do
{
tdata=ReadRegister(port,LSR); //port c
}while(tdata&0x60!=0x60);
WriteRegister(port,THR,value);
}
/*
void set_exp1(void)
{
unsigned char CCD_PORT = 0x03 ; //CCD控制串口号
port_send(CCD_PORT,'s') ;
delay(50) ;
port_send(CCD_PORT,'e') ;
delay(50) ;
port_send(CCD_PORT,'t') ;
delay(50) ;
port_send(CCD_PORT,' ') ;
delay(50) ;
port_send(CCD_PORT,'8') ;
delay(50) ;
port_send(CCD_PORT,'0') ;
delay(50) ;
port_send(CCD_PORT,'0') ;
delay(50) ;
port_send(CCD_PORT,'0') ;
delay(50) ;
port_send(CCD_PORT,13) ;
delay(50) ;
port_send(CCD_PORT,10) ;
delay(50) ;
}
*/
void set_exp(unsigned int usec)
{
unsigned char wan,qian,bai,shi,ge ;
unsigned char CCD_PORT = 0x03 ; //CCD控制串口号
unsigned int temp_us ;
temp_us = usec ;
wan = (unsigned char)(temp_us/10000) ; //得到万位整数
temp_us -= wan * 10000 ;
qian = (unsigned char)(temp_us/1000) ; //千位整数
temp_us -= qian*1000 ;
bai = (unsigned char)(temp_us / 100) ; //百位整数
temp_us -= bai*100 ;
shi = (unsigned char)(temp_us/10) ; //十位
ge = (unsigned char)(temp_us%10) ; //个位
port_send(CCD_PORT,'s') ;
delay(100);
port_send(CCD_PORT,'e') ;
delay(100);
port_send(CCD_PORT,'t') ;
delay(100);
port_send(CCD_PORT,' ') ;
delay(100);
if (wan != 0) //万位不为0,从万位开始发
{
port_send(CCD_PORT,wan+0x30) ;
delay(100) ;
port_send(CCD_PORT,qian+0x30) ;
delay(100) ;
port_send(CCD_PORT,bai+0x30) ;
delay(100) ;
port_send(CCD_PORT,shi+0x30) ;
delay(100) ;
port_send(CCD_PORT,ge+0x30) ;
delay(100) ;
}
else if (qian != 0) //千位不为0,从千位开始发
{
port_send(CCD_PORT,qian+0x30) ;
delay(100) ;
port_send(CCD_PORT,bai+0x30) ;
delay(100) ;
port_send(CCD_PORT,shi+0x30) ;
delay(100) ;
port_send(CCD_PORT,ge+0x30) ;
delay(100) ;
}
else if (bai != 0) //百位不为0,从百位开始发
{
port_send(CCD_PORT,bai+0x30) ;
delay(100) ;
port_send(CCD_PORT,shi+0x30) ;
delay(100) ;
port_send(CCD_PORT,ge+0x30) ;
delay(100) ;
}
else //十位个位必发
{
port_send(CCD_PORT,shi+0x30) ;
delay(100) ;
port_send(CCD_PORT,ge+0x30) ;
delay(100) ;
}
port_send(CCD_PORT,13) ;
delay(100);
port_send(CCD_PORT,10) ;
delay(100);
return ;
}
serial()interrupt 4 using 2
{
unsigned char tdata;
EA=0;
if(RI)
{
tdata=SBUF;
aBuffer[aPoint]=tdata;
if(aPoint==0)
{
if(tdata==0xeb)
aPoint++;
else
aPoint=0;
}
else if(aPoint==1)
{
if(tdata==0x90)
aPoint++;
else
aPoint=0;
}
else if(aPoint>1&&aPoint<31)
{
aPoint++;
}
RI=0;
}
if(TI)
TI=0;
EA=1;
}
void main(void)
{
unsigned char i,frame,oldframe;
unsigned char qq,sdata[8];
unsigned int high,speed,exp_time;
unsigned int temp_us ;
oldframe=0;
temp_us=1000;
sdata[0]=0xeb;
sdata[1]=0x90;
sdata[4]=0x00;
sdata[5]=0x00;
for (i=0;i<100;i++)
mDelay(100) ;
for(i=0;i<2;i++)
{
if( UART_PORT_CHECK(i))
{
UART_PORT_Init(i,_COM_38K_,_COM_NOPARITY_,_COM_CHR8_,_COM_STOP1_,FALSE,_COM_FIFO1_);
}
}
for(i=2;i<4;i++)
{
if( UART_PORT_CHECK(i))
{
UART_PORT_Init(i,_COM_9600_,_COM_NOPARITY_,_COM_CHR8_,_COM_STOP1_,FALSE,_COM_FIFO1_);
}
}
// this is send one time control register, too to others
// the first one is input mode register 01h
write_scratchPad(0);
write_scratchPad(1);
write_scratchPad(2);
MCU_init();
IE=0x90;//open serial port
WrToRom(0x82,0x00);
mDelay(20);
//01h:sd input only
WrToRom(0x00,0x01);
mDelay(20);
//02h:mode register yuv, sync output
WrToRom(0x60,0x02);
mDelay(20);
//40h:sd mode register0: pal
WrToRom(0x05,0x40);
mDelay(20);
//42h:daca
WrToRom(0x42,0x42);
mDelay(20);
//43h:daca
//WrToRom(0x10,0x43);
//mDelay(20);
//48h:20bit input
WrToRom(0x18,0x48);
mDelay(20);
//4ah:master/slave
WrToRom(0x09,0x4a);
mDelay(20);
set_exp(temp_us);
while(1)
{
if(aPoint==31)
{ ES=0;
if(aBuffer[17]==0xD3)
{
qq=aBuffer[18]&0x03;
if(qq==0x01) //start recorder
{
port_send(0x00,67); //67(C)
port_send(0x00,67);
delay(100);
port_send(0x00,13);
port_send(0x00,10);
delay(100);
sdata[6]=0xff;
}
if(qq==0x02)//end recorder
{
port_send(0x00,68); //68(D)
port_send(0x00,68);
delay(100);
port_send(0x00,13);
port_send(0x00,10);
delay(100);
sdata[6]=0x00;
}
qq=aBuffer[18]&0x0c;
if(qq==0x04)
{
port_send(0x02,0x55);
delay(100);
port_send(0x02,0x82);
delay(100);
port_send(0x02,0x04);
delay(100);
port_send(0x02,0xaa);
delay(100);
}
if(qq==0x08)
{
port_send(0x02,0x55);
delay(100);
port_send(0x02,0xc2);
delay(100);
port_send(0x02,0x04);
delay(100);
port_send(0x02,0xaa);
delay(100);
}
qq=aBuffer[18]&0x30;
if(qq==0x10)
{
port_send(0x02,0x55);
delay(100);
port_send(0x02,0x04);
delay(100);
port_send(0x02,0x80);
delay(100);
port_send(0x02,0xaa);
delay(100);
}
if(qq==0x20)
{
port_send(0x02,0x55);
delay(100);
port_send(0x02,0x04);
delay(100);
port_send(0x02,0x44);
delay(100);
port_send(0x02,0xaa);
delay(100);
}
qq=aBuffer[18]&0xc0;
if(qq==0x40)
{
temp_us=temp_us+50;
temp_us=(temp_us>5000)?5000:temp_us;
set_exp(temp_us);
}
if(qq==0x80)
{
temp_us=temp_us-50;
temp_us=(temp_us<100)?100:temp_us;
set_exp(temp_us);
}
}
///frame
high=aBuffer[11];
high=(high<<8);
high=high+aBuffer[10];
speed=aBuffer[13];
speed=(speed<<8);
speed=speed+aBuffer[12];
frame=floor(27*(0.05*high/speed));
if(frame!=oldframe)
{
XBYTE[0x8055]=frame;
}
oldframe=frame;
sdata[2]=frame;
aPoint=0;
ES=1;
}
//send GPS and exoposure time info to recorder system with port 0x01
port_send(0x01,0xaa); //start with 0xaa
delay(100);
for(i=2;i<17;i++) //longtitude ,latitude,high,speed,hour,min,second in turn
{
port_send(0x01,aBuffer[i]);
delay(100);
}
exp_time=temp_us/50;//exposure time=exp_time*50
sdata[3]=exp_time;
port_send(0x01,exp_time);
delay(100);
port_send(0x01,0xbb); //end with 0xbb
delay(100);
sdata[7]=sdata[0]^sdata[1]^sdata[2]^sdata[3]^sdata[4]^sdata[5]^sdata[6];
bus_reset();
write_byte(0xcc);
write_byte(0x44);
delay(10000);
delay(10000);
/*
for(i=0;i<2;i++)
{
read_scratchPad(i);
tdata=((pad[0]&0xf0)>>4);
tdata=tdata&0x0f;
tdata=tdata|((pad[1]&0x0f)<<4);
sdata[i+2]=tdata;
}
*/
for(i=0;i<8;i++)
{
mcu_send(sdata[i]);
delay(100);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -