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

📄 main.c

📁 主要有基于51的I2c读写24c64的测试程序
💻 C
📖 第 1 页 / 共 2 页
字号:
        if( 0x01 & Btemp )    //先发送低位, 再发高位
        HC595_DS_H;

        else
        HC595_DS_L;
		
        HC595_SHCP_L;
		//asm("nop");
        HC595_SHCP_H;
		//asm("nop");
		
        Btemp = Btemp >> 1;
    }

	//锁存  		
	HC595_STCP_L;
	//delay_nus( 1 );
	HC595_STCP_H;
}																				

//数码管显示
void NumDisplay( unsigned char Bit, unsigned char num )
{		
    HC139_Sendbyte( Bit );
	HC595_Send( Atab[num] ); 	 //第3位数字显示数num	
}

//注意此函数在循环体中使用
//内部包含5ms延时
void DataDisp( long int datal )
{
    uchar i;
	unsigned int wei[4];	
    wei[0] = datal / 1000;
	wei[1] = (datal - wei[0] * 1000) / 100;
	wei[2] = (datal - wei[0] * 1000 - wei[1] * 100) / 10;
    wei[3] = datal % 10;

	//显示停留时间
    for( i = 0; i < 5; i++ )
	{
    NumDisplay( 0,wei[0] );
   	delay_nms( 3 );	

    NumDisplay( 1, wei[1] );
   	delay_nms( 3 );	

    NumDisplay( 2, wei[2] );
   	delay_nms( 3 );	

    NumDisplay( 3, wei[3] );
   	delay_nms( 3 );	
	}
}

//-----------------------------------------------------芯片74HC595以及74HC139部分接口函数(数码管)结束--------------------------------------------------


//-----------------------------------------------------ADC0832驱动部分函数--------------------------------------------------
/*
********************************************************************
** 函数名 :ADC0832读数据程序
** 入口   :需转换通道channel  [0:1]
** 返回   : 无符号字符型 uchar
** 例子   : Data_adc = ReadAdc0832( 0 );   //读取adc0832芯片的0通道模拟电压
** 说明   : 使用时请在芯片加上精准电压源, 建议彩专用芯片
********************************************************************
*/

//工作时序
//当cs由高变低时,选中ADC0832。在时钟的上升沿,DI端的数据移入ADC0832内部的多路地址移位寄存器。
//在第一个时钟期间,Dl为高,表示启动位,紧接着输入两位配置位。当输入启动位和配置位后,选通输入模拟通道,转换开始。
//转换开始后,经过一个时钟周期延迟,以使选定的通道稳定。ADC0832接着在第4个时钟下降沿输出转换数据。
//数据输出时先输出最高位(D7~DO);输出完转换结果后,又以最低位开始重新输出一遍数据(D7~DO),两次发送的最低位共用。当片选cS
//为高时,内部所有寄存器清0,输出变为高阻态。如果要再进行一次模傲转换,片选cs必须再次从高向低跳变,后面再输入启动位和配置位

//adc0832读数据
uchar ReadAdc0832( uchar channel ) reentrant
{
    uchar i = 0;
    uchar outdata = 0;
    //初始化: 选通 数据口保持高电平
	//当cs由高变低时,选中ADC0832。在时钟的上升沿,DI端的数据移入ADC0832内部的多路地址移位寄存器
    ADC0832_CS_L;   // 使能
    ADC0832_DIDO_H; //
    ADC0832_SCK_L;  //第一次触发
    _nop_();
	_nop_();
    ADC0832_SCK_H;  //
    _nop_();
	_nop_();
	
	//模拟通道的选择及单端输入和差分输入的选择
	ADC0832_DIDO_H;
    ADC0832_SCK_L;  //第二次触发
	_nop_();
	_nop_();
    ADC0832_SCK_H;
    _nop_();
	_nop_();
	
	if( channel == 1 )	
    	{
        	ADC0832_DIDO_H;
    	}
	
    else
    	{
        	ADC0832_DIDO_L;
    	}
	ADC0832_SCK_L;  //第三次触发
    _nop_();
	_nop_();
	ADC0832_SCK_H;
	_nop_();
	_nop_();
	
	
    ADC0832_SCK_L;
	_nop_();
	_nop_();
    ADC0832_DIDO_H;   //置为输入准备读数据
    ADC0832_SCK_H;
	_nop_();
	_nop_();

	outdata = 0;     //初始化
	
    //读数据D7~D0
    for( i = 1; i <= 8; i++ )
    	{
        	if( ADC0832_DIDO == 1 )
            	{
					outdata |= 0x01;
				}

			ADC0832_SCK_H;
        	ADC0832_SCK_L;

        	outdata = outdata << 1; //左移一位
    	}

    //此函数不再读数据D0~D7  (注意D0位重叠)
    ADC0832_CS_H;        //禁止
    	
	return outdata;
}
//-----------------------------------------------------ADC0832驱动部分函数结束--------------------------------------------------


//显示标签
void sendlogo( void )
{
	UART_SendCh(10);						 //			
	UART_SendCh(13);
	UART_SendStr( "                       Test Message            " );
	UART_SendCh(10);						 //			
	UART_SendCh(13);
	UART_SendStr( "***************************************************************************" );
	UART_SendCh(10);						 //			
	UART_SendCh(13);
	UART_SendStr( "                                  1  --->  test 4*4                 " );
	UART_SendCh(10);						 //			
	UART_SendCh(13);
	UART_SendStr( "                                  2  --->  test ADC0832        " );
	UART_SendCh(10);						 //			     
	UART_SendCh(13);		
	UART_SendStr( "                                  3  --->  test shumaguang          " );		
	UART_SendCh(10);						 //			
	UART_SendCh(13);						 // 
	UART_SendStr( "                                  4  --->  test I2C(24C64)           " );
	UART_SendCh(10);						 //			
	UART_SendCh(13);
	UART_SendStr( "                                  5  --->  no  test                  " );
	UART_SendCh(10);						 //			
	UART_SendCh(13);
	UART_SendCh(10);						 //			
	UART_SendCh(13);
	UART_SendStr( "  06AotoControl   QiXi.Qin   dongxixiaonanbei@163.com" );
	UART_SendCh(10);						 //			
	UART_SendCh(13);
	UART_SendStr( "***************************************************************************" );
	UART_SendCh(10);						 //			
	UART_SendCh(13);
	UART_SendStr( "Please enter you want to test   -------->     " );	
}


//总初始化
void Device_init( void )
{
	LCD_init();
	Int0init();
	UART_Init();
	EA = 1;
}


//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~主函数~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void main( void )
{
	uchar tmp;
	uint shu = 9999;  //数码管初值
	uchar new = 0;
	uchar old = 0;
	
	Device_init();   //总初始化

    while( 1 )
	{
		EA = 0;  //禁止中断,以免写液晶时出现不必要显示的字符

		//4*4
		if( flagwhole == 1 )
		{
			if( flagsendmessage44 == 1 )
			{
				UART_SendCh(10);						 //			
				UART_SendCh(13);
				UART_SendStr( "<Press 4*4 , and then look at the LCD1602>    " );
				UART_SendCh(10);						 //			
				UART_SendCh(13);
				flagsendmessage44 = 0;
				
			}
			new = KeyScan44();
			if( old != new )
			{
				old = new;
				LCD_write_datalongint( 2, 14, new );

				if( new < 10 )
					LCD_write_char( 2, 15, ' ' );
			}			
		}

		//AD采样
		if( flagwhole == 2 )
		{
			if( flagsendmessageadc0832 == 1 )
			{
				UART_SendCh(10);						 //			
				UART_SendCh(13);
				UART_SendStr( "<move R_pot , and then look at the LCD1602>    " );
				UART_SendCh(10);						 //			
				UART_SendCh(13);
				flagsendmessageadc0832 = 0;
				
			}

			tmp = ReadAdc0832( 0 );
			
			//清除一些不必要的显示
			if( tmp < 100 )
			LCD_write_char( 2, 15, ' ' );
			if( tmp < 10 )
			LCD_write_char( 2, 14, ' ' );
	
			//显示该值
			LCD_write_datalongint( 2, 13, tmp );
		}

		//数码管
		if( flagwhole == 3 )
		{
			if( flagsendmessageshumaguang == 1 )
			{
				UART_SendCh(10);						 //			
				UART_SendCh(13);
				UART_SendStr( "<look at the shumaguang>    " );
				UART_SendCh(10);						 //			
				UART_SendCh(13);
				flagsendmessageshumaguang = 0;
				
			}
			DataDisp( shu-- );	
		}

		//I2C(24C64)
		if( flagwhole == 4 )
		{
			if( flagsendmessage24c64 == 1 )
			{
				UART_SendCh(10);						 //			
				UART_SendCh(13);						 //
				UART_SendStr( "<please enter " );
				UART_SendCh( Rec_Max / 10 + 0x30 );
				UART_SendCh( Rec_Max % 10 + 0x30 );
				UART_SendStr( " words to the Device 24C64> " );
				UART_SendCh(10);						 //			
				UART_SendCh(13);						 //	
				flagsendmessage24c64 = 0;  //标志清0

				flagfillallow = 1;  //允许开始装入数据
				flagdoing24c64 = 1; 
				Rec_n = 0;
			}

			if( RecFullFlag == 1 )                   //如果装满
			{
				UART_SendCh(10);						 //			
				UART_SendCh(13);						 //
				UART_SendStr( ">>>>>You had finished sendding " );
				UART_SendCh( Rec_n / 10 + 0x30 );
				UART_SendCh( Rec_n % 10 + 0x30 );
				UART_SendStr( " words to Device 24C64!  " );
				UART_SendCh(10);						 //			
				UART_SendCh(13);						 //
				UART_SendStr( ">>>>>you can press 3 Keys on the board to see what you had send to the 24C64, " );
				UART_SendCh(10);						 //			
				UART_SendCh(13);						 //
				UART_SendStr( ">>>>>if you press the key *sure*, you can break out the job now, and it is the only way to break out ^_^ ");
				UART_SendCh(10);						 //			
				UART_SendCh(13);
				RecFullFlag = 0; 
				Rec_n = 0;                               //准备重新接收
			}

			if( sure == 1 )
			{
				sure = 0;
				I2c_Write_n( 0xa0, add_p, Rec_buf, Rec_Max);
				LCD_write_array( 2, 2, Rec_buf );	//在1602上显示该数组字符串
				UART_SendCh(10);						 //			
				UART_SendCh(13);
				UART_SendStr( "<you can test continue....> " );
				UART_SendCh(10);						 //			
				UART_SendCh(13);
				flagdoing24c64 = 0;
			}
		}

		//正常状态
		if( flagwhole == 5 )
		{
			flagwhole = 0;     //置标志为0,不做任何测试
			flagdoing24c64 = 0; //任务24C64的工作正在执行标志
			LCD_write_string( 1, 0, " made by hebei   " );
   			LCD_write_string( 2, 0, "    NO TEST       " );
			sendlogo();  //显示标签
		}

		EA = 1;  //打开全局中断
	}

}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -