单片机通用模拟串口C程序
bps 就是 1000000/9600=104.167微秒 执行的timer是
//104.167*11.0592/12= 96
TL0=TH0;
ET0=1;
}
//-------------------------------------------------------------------------------------------------------
// 函数名称: set_timer_interrupt
// 功能说明: 打开定时器中断允许,与硬件有关
//--------------------------------------------------------------------------------------------------------
void set_timer_interrupt()
{
EA=1;
}
//-------------------------------------------------------------------------------------------------------
// 函数名称: IntTimer0
// 功能说明: 定时器中断函数,与硬件有关,但不做处理,直接调用通用中断处理函数
//--------------------------------------------------------------------------------------------------------
void IntTimer0() interrupt 1
{
timer_isr(); //调用中断处理函数
}
//-------------------------------------------------------------------------------------------------------
// 函数名称: idle
// 功能说明: 等待定时器中断时的执行程序,与具体应用有关
//--------------------------------------------------------------------------------------------------------
void idle()
{
}
//-------------------------------------------------------------------------------------------------------
// 函数名称: timer_isr
// 功能说明: 中断处理函数,与硬件无关,通用函数
//--------------------------------------------------------------------------------------------------------
void timer_isr(void) /*中断服务程序*/
{
char mask, start_bit, flag_in;
//发送程序
if ( flag_tx_ready )
{
if ( --timer_tx_ctr=0 )
{
mask = internal_tx_buffer1;
internal_tx_buffer >>= 1;
if ( mask )
{
set_tx_pin_high();
}
else
{
set_tx_pin_low();
}
timer_tx_ctr = 3;
if ( --bits_left_in_tx=0 )
{
flag_tx_ready = FALSE;
}
}
}
// 接收程序
if ( flag_rx_off==FALSE )
{
if ( flag_rx_waiting_for_stop_bit )
{
if ( --timer_rx_ctr=0 )
{
flag_rx_waiting_for_stop_bit = FALSE;
flag_rx_ready = FALSE;
internal_rx_buffer = 0xFF;
if ( internal_rx_buffer!=0xC2 )
{
inbuf[qin] = internal_rx_buffer;
if ( ++qin>=IN_BUF_SIZE )
{
qin = 0;
}
}
}
}
else // rx_test_busy接收忙
{
if ( flag_rx_ready==FALSE )
{
start_bit = get_rx_pin_status();
// 判断起始位
if ( start_bit==0 )
{
flag_rx_ready = TRUE;
internal_rx_buffer = 0;
timer_rx_ctr = 4;
bits_left_in_rx =
rx_num_of_bits;
rx_mask = 1;
}
}
else
{
if ( --timer_rx_ctr=0 )
{
timer_rx_ctr = 3;
flag_in =
get_rx_pin_status();
if ( flag_in )
{
internal_rx_buffer |= rx_mask;
}
rx_mask = 1;
if ( --bits_left_in_rx=0 )
{
flag_rx_waiting_for_stop_bit = TRUE;
}
}
}
}
}
}
//-------------------------------------------------------------------------------------------------------
// 函数名称: init_uart
// 功能说明: 初始化异步串口,与硬件无关,通用函数
//--------------------------------------------------------------------------------------------------------
void init_uart( void )
{
flag_tx_ready = FALSE;
flag_rx_ready = FALSE;
flag_rx_waiting_for_stop_bit = FALSE;
flag_rx_off = FALSE;
rx_num_of_bits = 10;
tx_num_of_bits = 10;
set_tx_pin_low();
timer_set();
set_timer_interrupt(); // 使能计时器中断
}
//-------------------------------------------------------------------------------------------------------
// 函数名称: get_char
// 输入参数: 无
// 输出参数: ch,接收数据
// 功能说明: 接收一个字节,与硬件无关,通用函数
//--------------------------------------------------------------------------------------------------------
char get_char( void )
{
char ch;
do
{
while ( qout==qin )
{
idle();
}
ch = inbuf[qout] 0xFF;
if ( ++qout>=IN_BUF_SIZE )
{
qout = 0;
}
}
while ( ch==0x0A || ch==0xC2 );
return( ch );
}
//-----------------------------------------------------------------------------------------
// 函数名称: put_char
// 功能说明: 接收一个字节,与硬件无关,通用函数
//-------------------------------------------
- FPGA的DSP性能揭秘(06-16)
- 基于单片机通用引脚的软件UART设计(10-16)
- 分时操作系统思想在单片机中的具体应用 (10-30)
- 基于AT89C51+DSP的双CPU伺服运动控制器的研究(05-26)
- 关于RTX51 TINY的分析与探讨(05-30)
- 基于MC9S12DGl28单片机的智能寻迹车设计(04-03)