新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > ATMEGA8A 单片机I/O口模拟串口

ATMEGA8A 单片机I/O口模拟串口

作者:时间:2016-09-07来源:网络收藏

  最近调试GPS的一个模块,需要把数据从GPS读取,再通过串口发送给PC机等一些功能。要用到2个串口,我使用了AMTEGA8A单片机,所以用普通IO模拟做了一个串口。花了我两个晚上的时间,才调试好模拟串口程序,也遇到不少的问题,今天终于搞定了。但是还只是波特率1200,校验位N 数据8 停止1 ,以后再慢慢完善。

本文引用地址:http://www.eepw.com.cn/article/201609/296666.htm

  模拟串口主要是先要考虑到波特率和数据格式。我采用的1200的波特率,所以一个位的时间是:1s/1200=833.3333333us .这里我没用定时器,我是用延时来实现定时的,一个位的延时时间定为833us,AVR里面的延时程序还是比较精确的,我用示波器观察波形,也是正确的。一般串口协议(校验位N 数据8 停止1 )以我现在调试这个来说,比较简单,一个起始位,8位数据,一个停止位,每一位时间都是833us

  以下是我调试的电路板子:

  

 

  

 

  源程序:

  /*******************_GPS****************************************/

  /*****File Function : 模拟串口调试 *****/

  /*****Program Author : ZhengWen(ClimberWin) *****/

  /*****MCU : 内部4M RC/外部4M 晶振 *****/

  /*****Compile Date : 2010/10/19 *****/

  /*****Edition Info : V1.0 *****/

  /****************************************************************************/

  //按键LED显示测试OK

  //修改时间:2010.10.20

  //编写模拟串口程序 define:PC3=RXD PC2=TXD

  //串口发送OK,波特率设置为1200 校验位N 数据8 停止1

  //修改时间:2010.10.21

  //串口接收数据OK,+1后 返回发送给电脑

  #include

  #include //延时程序

  #define uchar unsigned char

  #define uint unsigned int

  //引脚定义

  #define IO_RXD 3 //PC3 模拟RXD

  #define IO_TXD 2 //PC2 模拟TXD

  #define LED1 4 //PD4 LED1

  #define LED2 3 //PD3 LED2

  #define KEY1 0 //PB0 按键1

  #define KEY2 1 //PB1 按键2

  /*位移宏定义*/

  #define Set_Bit(val, bitn) (val |=(1<<(bitn))) //位置高

  #define Clr_Bit(val, bitn) (val&=~(1<<(bitn))) //位置低

  #define Get_Bit(val, bitn) (val &(1<<(bitn)) ) //取某一位的值

  void keytest(void); //按键测试程序

  void IO_int(void); //端口初始化配置

  void IO_UART_Sent(uchar TXD_data);//模拟串口发送程序

  uchar IO_UART_Receive(void); //模拟串口接收程序

  void IO_int(void)

  {

  DDRD=0xff;//定义PORTD端口为输出

  DDRB=0xFC;//

  DDRC=0xF7;//配置模拟串口输入输出

  PORTD=0xFF;

  PORTB=0xFF;

  PORTC=0xFF;

  }

  void keytest(void) //按键测试程序

  {

  /*********************************************/

  if(Get_Bit(PINB,KEY1)==0)

  {

  Clr_Bit(PORTD,LED1);

  IO_UART_Sent(0xaa);

  //////////////////

  while(Get_Bit(PINB,KEY1)==0) //按键去抖

  { _delay_ms(1000);}

  }

  /**********************************************/

  if(Get_Bit(PINB,KEY2)==0)

  {

  Clr_Bit(PORTD,LED2);

  IO_UART_Sent(0x74);

  //////////////////

  while(Get_Bit(PINB,KEY2)==0) //按键去抖

  { _delay_ms(1000);}

  }

  /******************************************/

  Set_Bit(PORTD,LED1);

  Set_Bit(PORTD,LED2);

  }

  ///////////////////////模拟串口发射程序//////////////////

  void IO_UART_Sent(uchar TXD_data) //波特率1200

  {

  uchar i;

  uchar Sent_SBUF;

  Sent_SBUF=TXD_data;

  Clr_Bit(PORTC,IO_TXD);//发送起始位START

  _delay_us(833);

  while(i<8) //发送8位数据

  {

  Clr_Bit(PORTD,LED1);

  if(Sent_SBUF & 0x01)

  {Set_Bit(PORTC,IO_TXD);}

  else

  {Clr_Bit(PORTC,IO_TXD);}

  Sent_SBUF>>=1;

  _delay_us(833);

  i++;

  Set_Bit(PORTD,LED1);

  }

  Set_Bit(PORTC,IO_TXD);//发送STOP信号

  _delay_us(833);

  }

  ///////////////////////模拟串口接收程序//////////////////

  uchar IO_UART_Receive(void) //波特率1200

  {

  uchar i;

  uchar Recieve_SBUF=0x00;

  i=0x00;

  while(Get_Bit(PINC,IO_RXD));

  _delay_us(833);

  while(i<8)

  {

  Clr_Bit(PORTD,LED2);

  Recieve_SBUF>>=1;

  if(Get_Bit(PINC,IO_RXD))

  {Recieve_SBUF|=0x80;}

  i++;

  _delay_us(833);

  Set_Bit(PORTD,LED2);

  }

  while(!Get_Bit(PINC,IO_RXD));

  return Recieve_SBUF;

  }

  //////////////////主程序///////////////////////

  int main()

  {

  uchar i;

  _delay_ms(100); //开机延时

  IO_int(); //IO初始化配置

  _delay_ms(100);//开机延时

  IO_UART_Sent(0x55); //发送0x55测试

  while(1)

  {

  i=IO_UART_Receive();

  _delay_ms(20);

  IO_UART_Sent(0xaa);

  _delay_ms(20);

  IO_UART_Sent(i+1); //如果接收到串口数据后 ,+1 发送回给PC机

  }

  }



关键词: ATMEGA8A I/O

评论


相关推荐

技术专区

关闭