微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 单片机通用模拟串口C程序

单片机通用模拟串口C程序

时间:03-15 来源:互联网 点击:

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

  // 功能说明: 接收一个字节,与硬件无关,通用函数

//-------------------------------------------

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top