//***********************************************************************
// 包含文件
//***********************************************************************
#include <string.h>
#include <stdio.h>
#define F_CPU 7372800 // 单片机主频为7.3728MHz,用于延时子程序
#include <util/delay.h>
#include <avr/io.h>
#include <avr/iom128.h>
#include <avr/interrupt.h> //中断信号头文件
//***********************************************************************
// 定义变量区
//***********************************************************************
#define LEDA PORTA //PORTA口接8个发光二极管
#define LEDC PORTC //PORTC口接8个发光二极管
#define delay_us(x) _delay_us(x) //AVR GCC延时函数 x(us)
#define delay_ms(x) _delay_ms(x) //AVR GCC延时函数 x(ms)
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define baud 9600 //设置波特率的大小
#define baud_setting (uint)((ulong)F_CPU/(16*(ulong)baud)-1) //波特率计算公式
#define baud_h (uchar)(baud_setting>>8) //提取高位
#define baud_l (uchar)(baud_setting) //低位
uchar data;
void USART0_Init( void );
void USART0_Transmit( unsigned char data );
unsigned char USART0_Receive( void );
//***********************************************************************
// IO端口初始化
//***********************************************************************
void system_init()
{
DDRA=0xff; //设置PA口为输出
LEDA=0x88; //01
//LEDA=UCSR0A;
DDRC=0xff; //设置PC口为输出
LEDC=0b00011000;
}
void usart_init()
{
UBRR0H=baud_h; //写波特率的值
UBRR0L=baud_l;
UCSR0B = (1<<RXEN0)|(1<<TXEN0); /* 接收器与发送器使能*/
UCSR0C = (1<<UCSZ00)|(1<<UCSZ01); /* 设置帧格式: 8 个数据位, 1个停止位*/
}
//*************************************************************************
// 主程序01初始化;02寄存器空中断;03主程序
//*************************************************************************
int main(void)
{
unsigned char tmp=0;
system_init();
delay_ms(1000); //相关操作
usart_init();
while(1)
{
if(UCSR0A&(1<<RXC0)) //如果接收缓存区有数据
{
tmp=USART0_Receive(); //接收数据
delay_ms(1000); //相关操作
LEDA=0xba; //03
delay_ms(1000); //相关操作
LEDA=tmp; //03
USART0_Transmit(tmp); //发送数据
delay_ms(1000); //相关操作
LEDA=0x71;; //F
}
}
}
// 数据发送【发送5 到8 位数据位的帧】
void USART0_Transmit( unsigned char data )
{
/* 等待发送缓冲器为空 */
while ( !( UCSR0A & (1<<UDRE0)) );
/* 将数据放入缓冲器,发送数据 */
UDR0 = data;
}
// 数据接收【以5 到8 个数据位的方式接收数 据帧】
unsigned char USART0_Receive( void )
{
/* 等待接收数据*/
while ( !(UCSR0A & (1<<RXC0)) );
/* 从缓冲器中获取并返回数据*/
return UDR0;
}
|