📄 单片机控制图像芯片的程序.c
字号:
delay_nop(60); //延时1秒就足够了
ISP_CONTR=0x60; //0110,0000 软复位到系统ISP监控区
}
//------------------------------------------------下载用户程序
if(ch>127)
{
bit_count=0;
timebuf_BCD[bit_count]=ch;
checksum= ch-128;
send_string_com(">",1);
}
else if(ch=='1')
{
CS_V2=1;
RI=0;
}//接受到ARM板的“1号卡接受数据完毕”的信息后,关闭CS
else
{
recv_9200_buf[bit_count]=ch;//
bit_count++;
if(bit_count==INBUF_LEN)
{
recv_9200_buf[2]='\0';
read_flag=1; //如果串口接收的数据达到INBUF_LEN个
bit_count=0;
} //else send_string_com("<",1);
}
RI=0;
}
}
/********************************************************************
功 能:实时时钟写入一字节
说 明:往DS1302写入1Byte数据 (内部函数)
入口参数:d 写入的数据
***********************************************************************/
void RTInputByte(unsigned char d)
{
unsigned char i;
ACC = d;
for(i=8; i>0; i--)
{
T_IO = ACC0; /*相当于汇编中的 RRC */
T_CLK = 1;
T_CLK = 0;
ACC = ACC >> 1;
}
}
/********************************************************************
功 能:实时时钟读取一字节
说 明:从DS1302读取1Byte数据 (内部函数)
返 回 值:ACC
***********************************************************************/
unsigned char RTOutputByte(void)
{
unsigned char i;
for(i=8; i>0; i--)
{
ACC = ACC >>1; /*相当于汇编中的 RRC */
ACC7 = T_IO;
T_CLK = 1;
T_CLK = 0;
}
return(ACC);
}
/********************************************************************
功 能:往DS1302写入数据
说 明:先写地址,后写命令/数据 (内部函数)
调 用:RTInputByte() , RTOutputByte()
入口参数:ucAddr: DS1302地址, ucData: 要写的数据
返 回 值:无
***********************************************************************/
void W1302(unsigned char ucAddr, unsigned char ucDa)
{
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(ucAddr); //地址,命令
RTInputByte(ucDa); //写1Byte数据
T_CLK = 1;
T_RST = 0;
}
/********************************************************************
功 能:读取DS1302某地址的数据
说 明:先写地址,后读命令/数据 (内部函数)
调 用:RTInputByte() , RTOutputByte()
入口参数:ucAddr: DS1302地址
返 回 值:ucData :读取的数据
***********************************************************************/
unsigned char R1302(unsigned char ucAddr)
{
unsigned char ucData;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(ucAddr); /* 地址,命令 */
ucData = RTOutputByte(); /* 读1Byte数据 */
T_CLK = 1;
T_RST = 0;
return(ucData);
}
/********************************************************************
功 能:往DS1302写入时钟数据(多字节方式)
说 明:先写地址,后写命令/数据
调 用:RTInputByte()
入口参数:pWClock: 时钟数据地址 格式为: 秒 分 时 日 月 周 年 控制
8Byte (BCD码)1B 1B 1B 1B 1B 1B 1B 1B
***********************************************************************/
void BurstW1302T(unsigned char *pWClock)
{
unsigned char i;
W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(0xbe); /* 0xbe:时钟多字节写命令 */
for (i = 8; i>0; i--) /*8Byte = 7Byte 时钟数据 + 1Byte 控制*/
{
RTInputByte(*pWClock); /* 写1Byte数据*/
pWClock++;
}
T_CLK = 1;
T_RST = 0;
}
/********************************************************************
功 能:读取DS1302时钟数据
说 明:先写地址/命令,后读数据(时钟多字节方式)
调 用:RTInputByte() , RTOutputByte()
入口参数:pRClock: 读取时钟数据地址 格式为: 秒 分 时 日 月 周 年
7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B
***********************************************************************/
void BurstR1302T(unsigned char *pRClock)
{
unsigned char i;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(0xbf); /* 0xbf:时钟多字节读命令 */
for (i=8; i>0; i--)
{
*pRClock = RTOutputByte(); /* 读1Byte数据 */
pRClock++;
}
T_CLK = 1;
T_RST = 0;
}
/********************************************************************
功 能:往DS1302寄存器数写入数据(多字节方式)
说 明:先写地址,后写数据(寄存器多字节方式)
调 用:RTInputByte()
入口参数:pWReg: 寄存器数据地址
***********************************************************************/
void BurstW1302R(unsigned char *pWReg)
{
unsigned char i;
W1302(0x8e,0x00); /* 控制命令,WP=0,写操作*/
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(0xfe); /* 0xbe:时钟多字节写命令 */
for (i=31; i>0; i--) /* 31Byte 寄存器数据 */
{
RTInputByte(*pWReg); /* 写1Byte数据*/
pWReg++;
}
T_CLK = 1;
T_RST = 0;
}
/********************************************************************
函 数 名:BurstR1302R()
功 能:读取DS1302寄存器数据
说 明:先写地址,后读命令/数据(寄存器多字节方式)
调 用:RTInputByte() , RTOutputByte()
入口参数:pRReg: 寄存器数据地址
返 回 值:无
***********************************************************************/
void BurstR1302R(unsigned char *pRReg)
{
unsigned char i;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(0xff); /* 0xff:时钟多字节读命令 */
for (i=31; i>0; i--) /*31Byte 寄存器数据 */
{
*pRReg = RTOutputByte(); /* 读1Byte数据 */
pRReg++;
}
T_CLK = 1;
T_RST = 0;
}
/********************************************************************
函 数 名:Set1302()
功 能:设置初始时间
说 明:先写地址,后读命令/数据(寄存器多字节方式)
调 用:W1302()
入口参数:pClock: 设置时钟数据地址 格式为: 秒 分 时 日 月 周 年
7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B
返 回 值:无
***********************************************************************/
void Set1302(unsigned char *pClock)
{
unsigned char i;
unsigned char ucAddr = 0x80;
W1302(0x8e,0x00); /* 控制命令,WP=0,写操作*/
for(i =7; i>0; i--)
{
W1302(ucAddr,*pClock); /* 秒 分 时 日 月 周 年 */
pClock++;
ucAddr +=2;
}
W1302(0x8e,0x80); /* 控制命令,WP=1,写保护*/
}
/*************************************************************************
函 数 名:Get1302()
功 能:读取DS1302当前时间
说 明:
调 用:R1302()
入口参数:ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 周 年
7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
返 回 值:无
******************************************************************/
void Get1302(unsigned char ucCurtime[])
{
unsigned char i;
unsigned char ucAddr = 0x81;
for (i=0; i<7; i++)
{
ucCurtime[i] = R1302(ucAddr);/*格式为: 秒 分 时 日 月 周 年 */
ucAddr += 2;
}
}
void send_time(void)//发送当前时间
{
unsigned char var1;
unsigned char var2;
Get1302(timebuf_BCD); //将时间存入timebuf_BCD中
var1=timebuf_BCD[4]/0x10;
var2=timebuf_BCD[4]%0x10;
var1+=0x30;
var2+=0x30;
send_char_com(var1);//发送月
send_char_com(var2);
var1=timebuf_BCD[3]/0x10;
var2=timebuf_BCD[3]%0x10;
var1+=0x30;
var2+=0x30;
send_char_com(var1); //发送日
send_char_com(var2);
var1=timebuf_BCD[2]/0x10;
var2=timebuf_BCD[2]%0x10;
var1+=0x30;
var2+=0x30;
send_char_com(var1);
send_char_com(var2);
var1=timebuf_BCD[1]/0x10;
var2=timebuf_BCD[1]%0x10;
var1+=0x30;
var2+=0x30;
send_char_com(var1);
send_char_com(var2);
var1=timebuf_BCD[6]/0x10;
var2=timebuf_BCD[6]%0x10;
var1+=0x30;
var2+=0x30;
send_string_com("20",2); //发送年
send_char_com(var1);
send_char_com(var2);
}
void main(void)
{
unsigned char wire_test_time[8];
unsigned char car_speed=0;
unsigned char wire_length=120;
unsigned char iic_buf[20];
EA=1; //open all interrupt
ES=1; //OPEN serial interrupt
P2=0xff;
CS_V2=1; //in the begining ,off chipselect
#ifdef debug
Set1302(timebuf_BCD);
#endif
init_serialcomm(); //初始化串口
send_time(); //发送当前时间
memset(iic_buf,0,20);
write_ONE_byte(0x42,0x88,0x58);//sw reset scaler 0101 1000 Audio clock generation in power-down and output disabled
write_ONE_byte(0x42,0x88,0x78);// 0111 1000
write_N_byte(0x42,0x00,saa7114_init_data,0xf0); //全部初始化寄存器
write_ONE_byte(0x42,0x88,0x78);// 0111 1000
write_ONE_byte(0x42,0x88,0x58);//sw reset scaler 0101 1000 Audio clock generation in power-down and output disabled
write_ONE_byte(0x42,0x88,0x78);// 0111 1000
read_N_byte(0x42,0x8f,iic_buf,1); send_char_com_hex(*(iic_buf));//Status information scaler part
////////////////////////////////////////////////////////////////////////
memset(wire_test_time,0,8);
while(1)
{
if(read_flag)
{
read_flag=0;
if( strcmp(recv_9200_buf,"gt")==0)
{
send_time();//发送时间
}
if(strcmp(recv_9200_buf,"sv")==0)
{
send_char_com('y');
//readcapcard();//与图象卡通信
}
if(strcmp(recv_9200_buf,"rs")==0)
{
//ISP_CONTR=0x60;//发送下载信号
}
}
/////////////////////////////////////////////////////////////////
//道1
INPUT_SEL1=0;//开启线圈通道
if((ch0==1)&&(ch1==0)&&(wire0_flag_cycle==0))
wire0_flag_cycle=1;//线圈信号有效,一个测试周期开始
if((ch0==1)&&(ch1==0)&&(wire0_flag_cycle==1)) wire_test_time[1]++;
if((ch1==0)&&(ch0==0)&&(wire0_flag_cycle==1))
{
INPUT_SEL1=1;//关闭线圈通道
write_ONE_byte(0x42,0x02,0xc1);//开AI21
write_ONE_byte(0x42,0x87,0x11);//允许IPORT输出
write_ONE_byte(0x42,0x91,0x00);//允许IPORT输出
write_ONE_byte(0x42,0xa0,0x02);//允许IPORT输出
write_ONE_byte(0x42,0x88,0x78);// reset一下 0111 1000
write_ONE_byte(0x42,0x88,0x58);//sw reset scaler 0101 1000 Audio clock generation in power-down and output disabled
write_ONE_byte(0x42,0x88,0x78);// 0111 1000
CAPSTR_V2=0;//通知图像卡开始转存
CAPSTR_V2=1;//
delay_nop(960); //延时1秒就足够了
delay_nop(960); //延时1秒就足够了
delay_nop(960); //延时1秒就足够了
delay_nop(660); //延时1秒就足够了
delay_nop(660); //延时1秒就足够了
delay_nop(660); //延时1秒就足够了
delay_nop(660); //延时1秒就足够了
delay_nop(660); //延时1秒就足够了
INPUT_SEL4=0;//打开CAPING_V2所在的245
while(CAPING_V2==0);//等待转存结束,如果为低表明还没有完成
INPUT_SEL4=1;
write_ONE_byte(0x42,0x87,0x10); //转存完毕后禁止IPORT输出
wire0_flag_cycle=0;//测试周期结束
car_speed=wire_test_time[1]/2;//车速
send_char_com(0x01); send_char_com(car_speed);//开始读取数据,先发送车道名与车速度
CS_V2=0; //select card,ready for read
memset(wire_test_time,0,8);//完成后清空数组
}
//----------------------------------------------------------
//道2
if((ch2==1)&&(ch3==0)&&(wire1_flag_cycle==0))
wire1_flag_cycle=1; //信号有效,一个测试周期开始
if((ch2==1)&&(ch3==0)&&(wire1_flag_cycle==1)) wire_test_time[3]++;
if(((ch3==0)&&(ch2==0))&&(wire1_flag_cycle==1))
{
wire1_flag_cycle=0; //测试周期结束
car_speed=wire_test_time[3]/2;
send_char_com(0x02); //发送车长
send_char_com(car_speed); //发送车速度
memset(wire_test_time,0,8);
}
//----------------------------------------------------------
//道3
if((ch4==1)&&(ch5==0)&&(wire2_flag_cycle==0))
wire2_flag_cycle=1;//信号有效,一个测试周期开始
if((ch4==1)&&(ch5==0)&&(wire2_flag_cycle==1)) wire_test_time[5]++;
if(((ch5==0)&&(ch4==0))&&(wire2_flag_cycle==1))
{
wire2_flag_cycle=0;//测试周期结束
car_speed=wire_test_time[5]/2;
send_char_com(0x04);//发送车长
send_char_com(car_speed);//发送车速度
memset(wire_test_time,0,8);
}
//----------------------------------------------------------
//道4
if((ch6==1)&&(ch7==0)&&(wire3_flag_cycle==0))
wire3_flag_cycle=1;//信号有效,一个测试周期开始
if((ch6==1)&&(ch7==0)&&(wire3_flag_cycle==1))
wire_test_time[7]++;
if(((ch7==0)&&(ch6==0))&&(wire3_flag_cycle==1))
{
wire3_flag_cycle=0;//测试周期结束
car_speed=wire_test_time[7]/2;
send_char_com(0x08);//发送车长
send_char_com(car_speed);//发送车速度
memset(wire_test_time,0,8);
}
//----------------------------------------------------------
/////////////////////////////////////////////////////////////
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -