打印
[AVR单片机]

如何在单片机初始化后自动发送字符串

[复制链接]
2070|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sixfeet|  楼主 | 2007-5-22 11:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
觉得是一个很简单的事,可是在串口调试助手下却无法显示的到,不知道是什么原因呢:
#include <stdio.h> 
#include <macros.h> 
#include "iom128v.h" 
#include "pgmspace.h"

void Usart0_init(void)  //7.3728Mhz频率,设置波特率9.6k,8位数据位,无校验,接收发送使能,1位停止位 

  UBRR0H=0; 
  UBRR0L=47; 
  UCSR0B=(1<<RXEN0)|(1<<TXEN0);  //发送接收使能,使用查询方式,故没有使能中断 
  UCSR0C=(1<<UCSZ00)|(1<<UCSZ01);  //0x06 8位数据,1位停止位,无校验 


void Usart0_transmit(unsigned char c)  //查询方式发送接收字符函数 

  while( !(UCSR0A&(1<<UDRE0)));//等待发送缓冲区为空 
  UDR0=c; 
  } 

unsigned char Usart0_receive(void) 

  while (!(UCSR0A&(1<<RXC0))) ; 
  return UDR0; 

   
int main(void) 

   unsigned int temp; 
   Usart0_init();

   Usart0_transmit('A');  //就是为了能发个A,为什么出不来
   while(1) 
     { 
       Usart0_transmit( Usart0_receive()); 
       for(temp=0;temp<3000;temp++) 
     { 
  } 

相关帖子

沙发
maomao40| | 2007-5-23 13:38 | 只看该作者

检查硬件电路

看你的初始化也没有错(建议在进行赋值前先把 UCSR0B和 UCSR0C清零)
检查一下硬件吧!
也可以看一下生成的汇编文件,看程序编译后是不是对的!
也可以通过软仿真来看看!

使用特权

评论回复
板凳
avrvi| | 2007-5-24 22:58 | 只看该作者

给你试试我的程序

这里有讨论128的串口程序 http://bbs.avrvi.com/htm_data/30/0705/2419.html
//ICC-AVR application builder : 2007-5-20 17:21:25
// Target : M128
// Crystal: 7.3728Mhz
// AVR与虚拟仪器 http://www.avrvi.com
// 古欣 整理

#include <iom128v.h>
#include <macros.h>

void port_init(void)
{
PORTA = 0x00;
DDRA = 0x00;
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00; //m103 output only
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0x00;
PORTE = 0x00;
DDRE = 0x00;
PORTF = 0x00;
DDRF = 0x00;
PORTG = 0x00;
DDRG = 0x00;
}

//UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9600 (0.0%)
// char size: 8 bit
// parity: Disabled
void uart0_init(void)
{
UCSR0B = 0x00; //disable while setting baud rate
UCSR0A = 0x00;
UCSR0C = 0x06;
UBRR0L = 0x2F; //set baud rate lo
UBRR0H = 0x00; //set baud rate hi
UCSR0B = 0xD8;
}

#pragma interrupt_handler uart0_rx_isr:19
void uart0_rx_isr(void)
{
//uart has received a character in UDR
}

#pragma interrupt_handler uart0_tx_isr:21
void uart0_tx_isr(void)
{
//character has been transmitted
}

//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
XDIV = 0x00; //xtal divider
XMCRA = 0x00; //external memory
port_init();
uart0_init();

MCUCR = 0x00;
EICRA = 0x00; //extended ext ints
EICRB = 0x00; //extended ext ints
EIMSK = 0x00;
TIMSK = 0x00; //timer interrupt sources
ETIMSK = 0x00; //extended timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}

void USART_Init( unsigned int baud )
{
/* 设置波特率*/
UBRR0H = (unsigned char)(baud>>8);
UBRR0L = (unsigned char)baud;
/* 接收器与发送器使能*/
UCSR0B = (1<<RXEN0)|(1<<TXEN0);
/* 设置帧格式: 8 个数据位, 2 个停止位 */
UCSR0C = (1<<USBS0)|(3<<UCSZ00);
}

void USART_Transmit( unsigned char data )
{
/* 等待发送缓冲器为空 */
while ( !( UCSR0A & (1<<UDRE0)) )
;
/* 将数据放入缓冲器,发送数据*/
UDR0 = data;
}

unsigned char USART_Receive( void )
{
/* 等待接收数据*/
while ( !(UCSR0A & (1<<RXC0)) )
;
/* 从缓冲器中获取并返回数据*/
return UDR0;
}


void main(void)
{
unsigned char tmp;
init_devices();
while(1)
{
if(UCSR0A&(1<<RXC0))
{
  tmp=USART_Receive();
  USART_Transmit(tmp);
}
}
}

http://bbs.avrvi.com/attachment/Mon_0705/30_1_8c07d1fa4020c37.jpg

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

7

帖子

0

粉丝