打印
[AVR单片机]

请问为什么AVR 128 单片机串行通信接收可以,为什么发送不可以,请高手指教,谢谢。

[复制链接]
1163|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

//***********************************************************************
//                        包含文件
//***********************************************************************

#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;
}




相关帖子

沙发
huangxz| | 2013-6-2 22:20 | 只看该作者
完全可以,如果不行,查硬件
但是奇怪的是楼主为啥用这么多delay
可怜的m128

使用特权

评论回复
板凳
qin552011373| | 2013-6-3 11:30 | 只看该作者
huangxz 发表于 2013-6-2 22:20
完全可以,如果不行,查硬件
但是奇怪的是楼主为啥用这么多delay
可怜的m128 ...

估计是硬件的问题  关键是她的delay里面的数还有问题  winavr延时函数里面的参数设置是uchar  他那个设置基本已经溢出了

使用特权

评论回复
地板
zhanchao|  楼主 | 2013-6-3 17:01 | 只看该作者
1.现在是接受没有问题
2.是发送不可以(串口调试助手)
3.加delay显示查询显示的程序位置(没有仿真)
4.这是验证串口程序(不是应用程序)
5.请高手指点

使用特权

评论回复
5
qin552011373| | 2013-6-4 21:06 | 只看该作者
zhanchao 发表于 2013-6-3 17:01
1.现在是接受没有问题
2.是发送不可以(串口调试助手)
3.加delay显示查询显示的程序位置(没有仿真)

你的delay还溢出了

使用特权

评论回复
6
lion1899| | 2013-6-17 19:46 | 只看该作者

好像没有溢出!

使用特权

评论回复
7
qin552011373| | 2013-6-18 21:50 | 只看该作者
lion1899 发表于 2013-6-17 19:46
好像没有溢出!

我的2007是char型的  不过你的问题解决了么

使用特权

评论回复
8
lion1899| | 2013-6-18 21:54 | 只看该作者
是楼主的问题,我只是路过的 = =!对了 亲爱的版主 我刚发帖问了个问题  关于步进电机的  您能帮我看看么

使用特权

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

本版积分规则

1

主题

2

帖子

0

粉丝