ATMEGA8A 单片机I/O口模拟串口
时间:09-13
来源:互联网
点击:
最近调试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机
}
}
模拟串口主要是先要考虑到波特率和数据格式。我采用的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机
}
}
GPS 单片机 AVR 示波器 电路 MCU LED 相关文章:
- 通讯硬件接口综述(11-11)
- 基于ARM的车载GPS智能导航系统(11-19)
- 基于GPS定位的嵌入式汽车监控器设计(01-14)
- GSM/GPS车载系统中LCD中文显示的编程方法(05-06)
- 基于DSP技术汽车定位防盗系统的体系结构研究(05-26)
- 赛灵思与微软汽车业务部推出的智能车载信息系统(06-18)