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

📄 hand_serial_all.c

📁 c8051单片机使用smbus(I2C)接口的测试程序
💻 C
字号:

#include "hand_serial_all_h.h"

BYTE code hex_[]={"0123456789ABCDEF"}; 

//串口0全局变量
type_of_ring_buffer  send_buff_com_0;
type_of_ring_buffer  recv_buff_com_0;
xdata BYTE send_buff_com_0_array[SERIAL_BUFF_LEN];
xdata BYTE recv_buff_com_0_array[SERIAL_BUFF_LEN];
bit send_idle_com_0;

//串口1全局变量
type_of_ring_buffer  send_buff_com_1;
type_of_ring_buffer  recv_buff_com_1;
xdata BYTE send_buff_com_1_array[SERIAL_BUFF_LEN];
xdata BYTE recv_buff_com_1_array[SERIAL_BUFF_LEN];
bit send_idle_com_1;

idata BYTE Count10ms;	//延迟10ms的变量


//ring_buff begin:
void init_ring_buffer(type_of_ring_buffer *ring_buffer, BYTE data_buffer_len,BYTE *data_buff_array) 
{
		
	ring_buffer->ring_buffer_len	=	data_buffer_len;
	ring_buffer->read_index	=	0;
	ring_buffer->write_index	=	0;
	ring_buffer->empty=1;
	ring_buffer->buffer_ptr	=data_buff_array;
}

BYTE get_char_from_buff(type_of_ring_buffer *ring_buffer) 
{
	BYTE t_data;
	t_data=ring_buffer->buffer_ptr[ring_buffer->read_index];
	ring_buffer->buffer_ptr[ring_buffer->read_index++]=0;//读完后清空
	ring_buffer->read_index = ring_buffer->read_index%ring_buffer->ring_buffer_len;
	if(ring_buffer->read_index==ring_buffer->write_index)
		ring_buffer->empty=1;
	else ring_buffer->empty=0;
	return(t_data);
}

void put_char_to_buff(type_of_ring_buffer *ring_buffer,BYTE t_data) 
{
	ring_buffer->buffer_ptr[ring_buffer->write_index++]	= t_data;
	ring_buffer->write_index =	ring_buffer->write_index%ring_buffer->ring_buffer_len;
	if(ring_buffer->read_index==ring_buffer->write_index)
		ring_buffer->empty=1;
	else ring_buffer->empty=0;
	
}

//ring buff end.



/*串口初始化a 
	fosc=40MHZ; SMOD=0时 (256-11)=9600,(256-22)=4800,(256-43)=2400,(256-87)=1200*/
void serial_init(void)
{
	//初始化串口变量
	init_ring_buffer(&send_buff_com_0,SERIAL_BUFF_LEN,send_buff_com_0_array);
	init_ring_buffer(&recv_buff_com_0,SERIAL_BUFF_LEN,recv_buff_com_0_array);

	init_ring_buffer(&send_buff_com_1,SERIAL_BUFF_LEN,send_buff_com_1_array);
	init_ring_buffer(&recv_buff_com_1,SERIAL_BUFF_LEN,recv_buff_com_1_array);
	


	//串口0,1用定时器1作为波特率发生器
  TMOD  |= 0x20;                     // TMOD: timer 1, mode 2, 8-bit reload
  TH1    = BAUD_TIMER;     					// set Timer1 reload value for baudrate
  TR1    = 1;                         // start Timer1

  PCON  |= 0x80;                      // SMOD00 = 1
  PCON  |= 0x10;                      // SMOD01 = 1
  
/*

  T2CON = 0x30;                        //串口0用定时器2
  TH2	=(65536-BAUD_TIMER2)/256;      //波特率
  TL2	=(65536-BAUD_TIMER2)%256; 
  RCAP2H=(65536-BAUD_TIMER2)/256;    
  RCAP2L=(65536-BAUD_TIMER2)%256; 
  TR2=1;                             	

  T4CON = 0x30;                        //串口1用定时器4
  TH4	=(65536-BAUD_TIMER4)/256;      //波特率
  TL4	=(65536-BAUD_TIMER4)%256; 
  RCAP4H=(65536-BAUD_TIMER4)/256;    
  RCAP4L=(65536-BAUD_TIMER4)%256; 
  TR4_ON;                             	
*/
  SCON0   = 0x50;                     // SCON0: mode 1, 8-bit UART, enable RX
  TI0    = 1;                         // Indicate TX0 ready
	ES0=1;
 	send_idle_com_0=1;
 	
 	//串口1
 	SCON1=0x50;
 	TI1_ON;
 	ES1_ON;
 	send_idle_com_1=1;
 	

}

//*****************************************
//串口0中断处理
serial0() interrupt 4  using 1
{
	BYTE idata t_data;
	if (TI0 ) 
  	{
  		TI0 = 0;  
    	if (!send_buff_com_0.empty)              
	   	{
//    		SBUF=get_char_from_buff(&send_buff_com_0); 
			SBUF0=send_buff_com_0.buffer_ptr[send_buff_com_0.read_index++];
			send_buff_com_0.read_index = send_buff_com_0.read_index%send_buff_com_0.ring_buffer_len;
			if(send_buff_com_0.read_index==send_buff_com_0.write_index)
				send_buff_com_0.empty=1;
			else send_buff_com_0.empty=0;
    	}
    	else send_idle_com_0=1; 
  	}
    if (RI0)  
    {
    	RI0 = 0;	
    	t_data = SBUF0;
//     	put_char_to_buff(&recv_buff_com_0,t_data);
		recv_buff_com_0.buffer_ptr[recv_buff_com_0.write_index++]	= t_data;
		recv_buff_com_0.write_index =	recv_buff_com_0.write_index%recv_buff_com_0.ring_buffer_len;
		if(recv_buff_com_0.read_index==recv_buff_com_0.write_index)
			recv_buff_com_0.empty=1;
		else recv_buff_com_0.empty=0;
		
    }
}

//串口1中断处理
serial1() interrupt 20  using 1
{
	BYTE idata t_data;
	if (TI1 ) 
  {
  	TI1_OFF;  
   	if (!send_buff_com_1.empty)              
	 	{
			SBUF1=send_buff_com_1.buffer_ptr[send_buff_com_1.read_index++];
			send_buff_com_1.read_index = send_buff_com_1.read_index%send_buff_com_1.ring_buffer_len;
			if(send_buff_com_1.read_index==send_buff_com_1.write_index)
				send_buff_com_1.empty=1;
			else send_buff_com_1.empty=0;
    }
   	else 
   		send_idle_com_1=1; 
  }
  if(RI1)  
  {
   	RI1_OFF;	
   	t_data = SBUF1;
		recv_buff_com_1.buffer_ptr[recv_buff_com_1.write_index++]	= t_data;
		recv_buff_com_1.write_index =	recv_buff_com_1.write_index%recv_buff_com_1.ring_buffer_len;
		if(recv_buff_com_1.read_index==recv_buff_com_1.write_index)
			recv_buff_com_1.empty=1;
		else recv_buff_com_1.empty=0;
  }
}

BYTE if_empty_com_0(void)
{
	return(recv_buff_com_0.empty);
}

BYTE if_empty_com_1(void)
{
	return(recv_buff_com_1.empty);
}


void putbyte_com_0(char c)
{
	ES0=0;
//	put_char_to_buff(&send_buff_com_0,c);
	send_buff_com_0.buffer_ptr[send_buff_com_0.write_index++]	= c;
	send_buff_com_0.write_index =	send_buff_com_0.write_index%send_buff_com_0.ring_buffer_len;
	if(send_buff_com_0.read_index==send_buff_com_0.write_index)
		send_buff_com_0.empty=1;
	else send_buff_com_0.empty=0;
	
	if(send_idle_com_0==1)
	{
		TI0=1;
		send_idle_com_0=0;
	}
	ES0=1;
}

void putstring_com_0(BYTE  *c)
{
	for (;*c!=0;c++)   //遇到停止符0结束
	putbyte_com_0(*c);
}

void puthex_com_0(BYTE c)
{
	int ch;
	putbyte_com_0(' ');
	putbyte_com_0('0');
	putbyte_com_0('x');
	ch=(c>>4)&0x0f;
	putbyte_com_0(hex_[ch]);
	ch=c&0x0f;
	putbyte_com_0(hex_[ch]);
}

BYTE getbyte_com_0(void)
{
	char c;
	ES0=0;
	while(recv_buff_com_0.empty);
//	c=get_char_from_buff(&recv_buff_com_0);

	c=recv_buff_com_0.buffer_ptr[recv_buff_com_0.read_index++];
	recv_buff_com_0.read_index = recv_buff_com_0.read_index%recv_buff_com_0.ring_buffer_len;
	if(recv_buff_com_0.read_index==recv_buff_com_0.write_index)
		recv_buff_com_0.empty=1;
	else recv_buff_com_0.empty=0;

	ES0=1;
	return(c);
}

//串口1函数
void putbyte_com_1(char c)
{
	ES1_OFF;
	send_buff_com_1.buffer_ptr[send_buff_com_1.write_index++]	= c;
	send_buff_com_1.write_index =	send_buff_com_1.write_index%send_buff_com_1.ring_buffer_len;
	if(send_buff_com_1.read_index==send_buff_com_1.write_index)
		send_buff_com_1.empty=1;
	else send_buff_com_1.empty=0;
	
	if(send_idle_com_1==1)
	{
		TI1_ON;
		send_idle_com_1=0;
	}
	ES1_ON;
}

void putstring_com_1(BYTE  *c)
{
	for (;*c!=0;c++)   //遇到停止符0结束
	putbyte_com_1(*c);
}

void puthex_com_1(BYTE c)
{
	int ch;
	putbyte_com_1(' ');
	putbyte_com_1('0');
	putbyte_com_1('x');
	ch=(c>>4)&0x0f;
	putbyte_com_1(hex_[ch]);
	ch=c&0x0f;
	putbyte_com_1(hex_[ch]);
}

BYTE getbyte_com_1(void)
{
	char c;
	ES1_OFF;
	while(recv_buff_com_1.empty);
//	c=get_char_from_buff(&recv_buff_com_0);

	c=recv_buff_com_1.buffer_ptr[recv_buff_com_1.read_index++];
	recv_buff_com_1.read_index = recv_buff_com_1.read_index%recv_buff_com_1.ring_buffer_len;
	if(recv_buff_com_1.read_index==recv_buff_com_1.write_index)
		recv_buff_com_1.empty=1;
	else recv_buff_com_1.empty=0;

	ES1_ON;
	return(c);
}


//处理定时器函数-begin
void init_timer(type_of_timer *l_timer)
{
	l_timer->active=0;
	l_timer->timer_off=0;
	l_timer->timer_value=0;
} 

void opentimer(type_of_timer *l_timer,int l_timer_value)
{
	l_timer->active=1;
	l_timer->timer_value=l_timer_value;
	l_timer->timer_off=0;
}

void closetimer(type_of_timer *l_timer)
{
	l_timer->active=0;
	l_timer->timer_off=0;
}
//处理定时器函数-end

void delay_10ms(BYTE l_10ms_times) 
{
	Count10ms=l_10ms_times;
	while(Count10ms);
}



/*
void PORT_Init (void)
{
  XBR0    = 0x07;                     // Enable UART0
  XBR1    = 0x00;
  XBR2   	= 0x04;											//enable UART1
  
  XBR2    |= 0x40;                     // Enable crossbar and weak pull-ups

  P0MDOUT |= 0x01;                    // enable TX0 as a push-pull output
  P1MDOUT |= 0x01;                    // enable P1 as push-pull output
  P2MDOUT |= 0x3e;
  P3MDOUT |= 0xff;
	
	EMI0CF=0x23;						//只使用内部XRAM P53 	
}

void SYSCLK_Init (void)
{
  int i;                              // delay counter
  
  OSCXCN = 0x27;                      // start external oscillator with
  for (i=0; i < 256; i++) ;           // XTLVLD blanking interval (>1ms)
//   while (!(OSCXCN & 0x80)) ;          // Wait for crystal osc. to settle
  OSCICN = 0x08;                      // select external oscillator as SYSCLK
                                       // source and enable missing clock
                                       // detector
  CKCON =0x00;					//定义4个定时器的时钟滴答为系统钟的12分频   p187                                 
 //CKCON=0x78;
}



void main(void)
{
	BYTE idata l_char;

	WDTCN = 0xde;                       // disable watchdog timer
	WDTCN = 0xad;
	
	SYSCLK_Init ();                     // initialize oscillator
	PORT_Init();	
	
	serial_init();
	
	EA=1;

	putstring_com_0("1,com0,9600,n/8/1  ");
	putstring_com_1("2,com0,9600,n/8/1  ");
	
	while(1)
	{
		PCON|=0x01;	//idle模式

		if(!if_empty_com_0())
		{
			l_char=getbyte_com_0();
			putbyte_com_0(l_char);  
		}	
		if(!if_empty_com_1())
		{
			l_char=getbyte_com_1();
			putbyte_com_1(l_char);  
		}	
	}
}
*/

⌨️ 快捷键说明

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