📄 hand_serial_all.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 + -