第1个回答 2012-01-05
硬件环境:1. ATmega8(MCU)2. USB to TTL(计算机与单片机通信)
软件环境:ICC-AVR v7.22
程序如下:
#include<iom8v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
//-----UART
#define MCLK 8000000
//-----UART
uchar Rdata=0x00;
uchar Last_Rdata=0x00;
/***************************************************
** 函数名称: UART_init
** 功能描述: 串口初始化
** 输 入: 无
** 输 出: 无
** 说 明: 19200,N,8,1
****************************************************/
void UART_Init(uint baud)
{
UCSRB=0x00;
UCSRA=0x00; // 控制寄存器清零
UCSRC=(1<<URSEL)|(0<<UPM0)|(3<<UCSZ0);
// 选择UCSRC,异步模式,
// 禁止校验,1位停止位,8位数据位
baud=MCLK/16/baud-1; //波特率最大为65K
UBRRL=baud;
UBRRH=baud>>8; //设置波特率
UCSRB=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE);
//接收、发送使能,接收中断使能
SREG=BIT(7); //全局中断开放
DDRD|=BIT(1); //配置TX为输出
// DDRD&=~BIT(0);
// PORTD|=BIT(0);
}
/***************************************************
** 函数名称: UART_TXD
** 功能描述: 串口发送函数
** 输 入: 发送的字节
** 输 出: 无
** 说 明: 无
****************************************************/
void UART_TXD(uchar tdata)
{
while(!(UCSRA&(BIT(UDRE)))) ; //检测UDR是不是空
UDR=tdata;
while(!(UCSRA&(BIT(TXC)))); //等待发送数据
UCSRA|=BIT(TXC);
}
/***************************************************
** 函数名称: main
** 功能描述: 时钟初始化函数
** 输 入: 无
** 输 出: 无
** 说 明: 无
****************************************************/
void main(void)
{
CLI(); //关所有中断
UART_Init(19200);
SEI(); //使能全局中断
UART_TXD('h');
UART_TXD('e');
UART_TXD('l');
UART_TXD('l');
UART_TXD('o');
for(;;)
{
if((Last_Rdata=='O')&&(Rdata=='K'))
{
Last_Rdata=0;
Rdata=0;
UART_TXD('E');
UART_TXD('N');
UART_TXD('D');
}
}
}
/***************************************************
** 函数名称: UART_RXD
** 功能描述: 串口接收中断函数
** 输 入: 无
** 输 出: 无
** 说 明: 无
****************************************************/
#pragma interrupt_handler UART_RXD:iv_USART_RX
void UART_RXD()
{
UCSRB&=~BIT(RXCIE);
Rdata=UDR;
Last_Rdata=Rdata;
UCSRB|=BIT(RXCIE);
}
第2个回答 2012-01-04
这种问题必须你自己解决,虽然道理简单,但是做起程序来还是挺麻烦,好好学学吧,自己弄懂之后你会很有成就感,没有人会愿意花上半上午的时间给你做这个程序的