×
嵌入式 > 嵌入式开发 > 详情

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

发布时间:2020-06-19 发布时间:
|

最近调试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<<(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机

}

}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
艾默生CT变频器鞍钢集团应用案例集锦