?? 單片機(jī)控制圖像芯片的程序.c
字號:
delay_nop(60); //延時1秒就足夠了
ISP_CONTR=0x60; //0110,0000 軟復(fù)位到系統(tǒng)ISP監(jiān)控區(qū)
}
//------------------------------------------------下載用戶程序
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號卡接受數(shù)據(jù)完畢”的信息后,關(guān)閉CS
else
{
recv_9200_buf[bit_count]=ch;//
bit_count++;
if(bit_count==INBUF_LEN)
{
recv_9200_buf[2]='\0';
read_flag=1; //如果串口接收的數(shù)據(jù)達(dá)到INBUF_LEN個
bit_count=0;
} //else send_string_com("<",1);
}
RI=0;
}
}
/********************************************************************
功 能:實(shí)時時鐘寫入一字節(jié)
說 明:往DS1302寫入1Byte數(shù)據(jù) (內(nèi)部函數(shù))
入口參數(shù):d 寫入的數(shù)據(jù)
***********************************************************************/
void RTInputByte(unsigned char d)
{
unsigned char i;
ACC = d;
for(i=8; i>0; i--)
{
T_IO = ACC0; /*相當(dāng)于匯編中的 RRC */
T_CLK = 1;
T_CLK = 0;
ACC = ACC >> 1;
}
}
/********************************************************************
功 能:實(shí)時時鐘讀取一字節(jié)
說 明:從DS1302讀取1Byte數(shù)據(jù) (內(nèi)部函數(shù))
返 回 值:ACC
***********************************************************************/
unsigned char RTOutputByte(void)
{
unsigned char i;
for(i=8; i>0; i--)
{
ACC = ACC >>1; /*相當(dāng)于匯編中的 RRC */
ACC7 = T_IO;
T_CLK = 1;
T_CLK = 0;
}
return(ACC);
}
/********************************************************************
功 能:往DS1302寫入數(shù)據(jù)
說 明:先寫地址,后寫命令/數(shù)據(jù) (內(nèi)部函數(shù))
調(diào) 用:RTInputByte() , RTOutputByte()
入口參數(shù):ucAddr: DS1302地址, ucData: 要寫的數(shù)據(jù)
返 回 值:無
***********************************************************************/
void W1302(unsigned char ucAddr, unsigned char ucDa)
{
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(ucAddr); //地址,命令
RTInputByte(ucDa); //寫1Byte數(shù)據(jù)
T_CLK = 1;
T_RST = 0;
}
/********************************************************************
功 能:讀取DS1302某地址的數(shù)據(jù)
說 明:先寫地址,后讀命令/數(shù)據(jù) (內(nèi)部函數(shù))
調(diào) 用:RTInputByte() , RTOutputByte()
入口參數(shù):ucAddr: DS1302地址
返 回 值:ucData :讀取的數(shù)據(jù)
***********************************************************************/
unsigned char R1302(unsigned char ucAddr)
{
unsigned char ucData;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(ucAddr); /* 地址,命令 */
ucData = RTOutputByte(); /* 讀1Byte數(shù)據(jù) */
T_CLK = 1;
T_RST = 0;
return(ucData);
}
/********************************************************************
功 能:往DS1302寫入時鐘數(shù)據(jù)(多字節(jié)方式)
說 明:先寫地址,后寫命令/數(shù)據(jù)
調(diào) 用:RTInputByte()
入口參數(shù):pWClock: 時鐘數(shù)據(jù)地址 格式為: 秒 分 時 日 月 周 年 控制
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:時鐘多字節(jié)寫命令 */
for (i = 8; i>0; i--) /*8Byte = 7Byte 時鐘數(shù)據(jù) + 1Byte 控制*/
{
RTInputByte(*pWClock); /* 寫1Byte數(shù)據(jù)*/
pWClock++;
}
T_CLK = 1;
T_RST = 0;
}
/********************************************************************
功 能:讀取DS1302時鐘數(shù)據(jù)
說 明:先寫地址/命令,后讀數(shù)據(jù)(時鐘多字節(jié)方式)
調(diào) 用:RTInputByte() , RTOutputByte()
入口參數(shù):pRClock: 讀取時鐘數(shù)據(jù)地址 格式為: 秒 分 時 日 月 周 年
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:時鐘多字節(jié)讀命令 */
for (i=8; i>0; i--)
{
*pRClock = RTOutputByte(); /* 讀1Byte數(shù)據(jù) */
pRClock++;
}
T_CLK = 1;
T_RST = 0;
}
/********************************************************************
功 能:往DS1302寄存器數(shù)寫入數(shù)據(jù)(多字節(jié)方式)
說 明:先寫地址,后寫數(shù)據(jù)(寄存器多字節(jié)方式)
調(diào) 用:RTInputByte()
入口參數(shù):pWReg: 寄存器數(shù)據(jù)地址
***********************************************************************/
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:時鐘多字節(jié)寫命令 */
for (i=31; i>0; i--) /* 31Byte 寄存器數(shù)據(jù) */
{
RTInputByte(*pWReg); /* 寫1Byte數(shù)據(jù)*/
pWReg++;
}
T_CLK = 1;
T_RST = 0;
}
/********************************************************************
函 數(shù) 名:BurstR1302R()
功 能:讀取DS1302寄存器數(shù)據(jù)
說 明:先寫地址,后讀命令/數(shù)據(jù)(寄存器多字節(jié)方式)
調(diào) 用:RTInputByte() , RTOutputByte()
入口參數(shù):pRReg: 寄存器數(shù)據(jù)地址
返 回 值:無
***********************************************************************/
void BurstR1302R(unsigned char *pRReg)
{
unsigned char i;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(0xff); /* 0xff:時鐘多字節(jié)讀命令 */
for (i=31; i>0; i--) /*31Byte 寄存器數(shù)據(jù) */
{
*pRReg = RTOutputByte(); /* 讀1Byte數(shù)據(jù) */
pRReg++;
}
T_CLK = 1;
T_RST = 0;
}
/********************************************************************
函 數(shù) 名:Set1302()
功 能:設(shè)置初始時間
說 明:先寫地址,后讀命令/數(shù)據(jù)(寄存器多字節(jié)方式)
調(diào) 用:W1302()
入口參數(shù):pClock: 設(shè)置時鐘數(shù)據(jù)地址 格式為: 秒 分 時 日 月 周 年
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,寫保護(hù)*/
}
/*************************************************************************
函 數(shù) 名:Get1302()
功 能:讀取DS1302當(dāng)前時間
說 明:
調(diào) 用:R1302()
入口參數(shù):ucCurtime: 保存當(dāng)前時間地址。當(dāng)前時間格式為: 秒 分 時 日 月 周 年
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)//發(fā)送當(dāng)前時間
{
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);//發(fā)送月
send_char_com(var2);
var1=timebuf_BCD[3]/0x10;
var2=timebuf_BCD[3]%0x10;
var1+=0x30;
var2+=0x30;
send_char_com(var1); //發(fā)送日
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); //發(fā)送年
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(); //發(fā)送當(dāng)前時間
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();//發(fā)送時間
}
if(strcmp(recv_9200_buf,"sv")==0)
{
send_char_com('y');
//readcapcard();//與圖象卡通信
}
if(strcmp(recv_9200_buf,"rs")==0)
{
//ISP_CONTR=0x60;//發(fā)送下載信號
}
}
/////////////////////////////////////////////////////////////////
//道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;//關(guān)閉線圈通道
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;//通知圖像卡開始轉(zhuǎn)存
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);//等待轉(zhuǎn)存結(jié)束,如果為低表明還沒有完成
INPUT_SEL4=1;
write_ONE_byte(0x42,0x87,0x10); //轉(zhuǎn)存完畢后禁止IPORT輸出
wire0_flag_cycle=0;//測試周期結(jié)束
car_speed=wire_test_time[1]/2;//車速
send_char_com(0x01); send_char_com(car_speed);//開始讀取數(shù)據(jù),先發(fā)送車道名與車速度
CS_V2=0; //select card,ready for read
memset(wire_test_time,0,8);//完成后清空數(shù)組
}
//----------------------------------------------------------
//道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; //測試周期結(jié)束
car_speed=wire_test_time[3]/2;
send_char_com(0x02); //發(fā)送車長
send_char_com(car_speed); //發(fā)送車速度
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;//測試周期結(jié)束
car_speed=wire_test_time[5]/2;
send_char_com(0x04);//發(fā)送車長
send_char_com(car_speed);//發(fā)送車速度
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;//測試周期結(jié)束
car_speed=wire_test_time[7]/2;
send_char_com(0x08);//發(fā)送車長
send_char_com(car_speed);//發(fā)送車速度
memset(wire_test_time,0,8);
}
//----------------------------------------------------------
/////////////////////////////////////////////////////////////
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -