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

📄 单片机控制图像芯片的程序.c

📁 用单片机读写图像显示芯片SAA7114H的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
            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 + -