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

发布时间:2016-9-13 11:29    发布者:designapp
关键词: ATMEGA8A
最近调试GPS的一个模块,需要把数据从GPS读取,再通过串口发送给PC机等一些功能。要用到2个串口,我使用了AMTEGA8A单片机,所以用普通IO模拟做了一个串口。花了我两个晚上的时间,才调试好模拟串口程序,也遇到不少的问题,今天终于搞定了。但是还只是波特率1200,校验位N 数据8 停止1 ,以后再慢慢完善。
  
模拟串口主要是先要考虑到波特率和数据格式。我采用的1200的波特率,所以一个位的时间是:1s/1200=833.3333333us .这里我没用定时器,我是用延时来实现定时的,一个位的延时时间定为833us,AVR里面的延时程序还是比较精确的,我用示波器观察波形,也是正确的。一般串口协议(校验位N 数据8 停止1 )以我现在调试这个来说,比较简单,一个起始位,8位数据,一个停止位,每一位时间都是833us
  
以下是我调试的电路板子:
  


  


  源程序:
  /*******************ATMEGA8A_GPS****************************************/
  /*****File Function : I/O模拟串口调试 *****/
  /*****Program Author : ZhengWen(ClimberWin) *****/
  /*****MCU : ATMEGA8A 内部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>=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>=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机
  }
  }
本文地址:https://www.eechina.com/thread-173725-1-1.html     【打印本页】

本站部分文章为转载或网友发布,目的在于传递和分享信息,并不代表本网赞同其观点和对其真实性负责;文章版权归原作者及原出处所有,如涉及作品内容、版权和其它问题,我们将根据著作权人的要求,第一时间更正或删除。
您需要登录后才可以发表评论 登录 | 立即注册

厂商推荐

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表