打印
[Atmel]

用AtmelStudio6.2跑mega16例程(52)串口通信

[复制链接]
1266|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ddllxxrr|  楼主 | 2014-11-12 21:34 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本例得安装VSPD,虚拟串口。当按下k1时会向PC串口发送数据。
以下是Studio6.2编译通过的截图:



程序清单:

/*
* GccApplication15.c
*
* Created: 2014-11-12 20:55:37
*  Author: Administrator
*/

#define F_CPU 4000000UL
#include <avr/io.h>
#include<avr/delay.h>
#include <avr/interrupt.h>
#include <stdint.h>

struct  
{
        uint8_t Buf_Aray[100];
        uint8_t Buf_Len;
}Receive_Buffer;

uint8_t Clear_Buffer_Flag = 0;

const uint8_t SEG_CODE[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};
       
char *s = "this is AVR computer!\n",*P;

void Init_USART()
{
   UCSRB = _BV(RXEN)|_BV(TXEN)|_BV(RXCIE);
   UCSRC = _BV(URSEL)|_BV(UCSZ1)|_BV(UCSZ0);
   UBRRL = (F_CPU/9600/16-1)% 256;
   UBRRH = (F_CPU/9600/16-1)/256;
}

void PutChar(char c)
{
       
        if(c=='\n')PutChar('\r');
        UDR = c;
        while(!(UCSRA & _BV(UDRE)));
}

void Show_Received_Digits()
{
    uint8_t i;
        for(i=0;i<Receive_Buffer.Buf_Len;i++)
        {
                PORTC = SEG_CODE[Receive_Buffer.Buf_Aray[i]];
                _delay_ms(400);
        }       
}


int main(void)
{
    Receive_Buffer.Buf_Len=0;
        DDRB = 0x00;PORTB = 0xFF;
        DDRC = 0xFF;PORTC = 0x00;
        DDRD = 0x02;PORTD = 0xFF;
        MCUCR = 0x08;
        GICR = _BV(INT1);
        Init_USART();
        sei();
        while(1) Show_Received_Digits();
}

ISR(USART_RXC_vect)
{
        uint8_t c= UDR;
        if(c == '\r'||c=='\n')Clear_Buffer_Flag = 1;
        if(c >= '0'&& c<='9')
        {
               
                if(Clear_Buffer_Flag==1)
                {
                       
                        Receive_Buffer.Buf_Len = 0;
                        Clear_Buffer_Flag = 0;
                }
                Receive_Buffer.Buf_Aray[Receive_Buffer.Buf_Len]= c-'0';
                if(Receive_Buffer.Buf_Len<100)Receive_Buffer.Buf_Len++;
        }
}

ISR(INT1_vect)
{
        uint8_t i=0;
        while(s[i]!='\0')PutChar(s[i++]);
}




相关帖子

沙发
moyansen| | 2014-12-9 23:56 | 只看该作者
您好,我在学习ATMega16;麻烦你帮忙看一下我的这个串口通信程序出错在哪里,我只能在串口调试助手接收到80 98 9E E0 9E FE 9E 98 FE 9E 9E FE,我本想发送hello world的。编译器是Atmel Studio 6.2
下面是代码
#define F_CPU 4000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define uchar unsigned char
#define uint unsigned int

//初始化IO口
void IO_init()
{
        DDRD=0x02;                //TxD(PD1)为输出
        PORTD=0xFF;
}
//初始化串口
void USART_init()
{
        UCSRA=0x00;
        UCSRC|=_BV(URSEL)|_BV(UCSZ1)|_BV(UCSZ0);        //8位数据位
        UCSRB|=_BV(TXEN);                                                        //使能发送
        UBRRL=(F_CPU/9600/16-1)%256;
        UBRRH=(F_CPU/9600/16-1)/256;
}
//发送一个字符
void TxD_Byte(uchar c)
{
        while(!(UCSRA&_BV(UDRE)));
        UDR=c;
}
//发送一串字符
void TxD_String(uchar *p,uchar len)
{
        uchar i;
        for(i=0;i<len;i++)  //控制字符个数
        {
                TxD_Byte(*p);
                p++;
        }
}

int main()
{
        IO_init();
        USART_init();
        while(1)
        {
                TxD_String("Hello World",11);
                _delay_ms(500);
        }
}

使用特权

评论回复
板凳
ddllxxrr|  楼主 | 2014-12-11 21:28 | 只看该作者
moyansen 发表于 2014-12-9 23:56
您好,我在学习ATMega16;麻烦你帮忙看一下我的这个串口通信程序出错在哪里,我只能在串口调试助手接收到80 ...

是不是波特率错了,或外边的晶振错了,反正我看你这个就是波特率不对

使用特权

评论回复
地板
moyansen| | 2014-12-13 00:22 | 只看该作者
ddllxxrr 发表于 2014-12-11 21:28
是不是波特率错了,或外边的晶振错了,反正我看你这个就是波特率不对

电路图我是使用 单片机C语言程序设计实训100例-基于AVR+protues仿真  这本书的,程序也是在他上面修改的,但是不知道为什么就是不能正常发送数据

使用特权

评论回复
5
ddllxxrr|  楼主 | 2014-12-13 11:15 | 只看该作者
moyansen 发表于 2014-12-13 00:22
电路图我是使用 单片机C语言程序设计实训100例-基于AVR+protues仿真  这本书的,程序也是在他上面修改的 ...

楼主是用Proteus环境仿真还是实际电路跑呢????

使用特权

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

本版积分规则

个人签名:http://shop34182318.taobao.com/ http://shop562064536.taobao.com

2398

主题

6953

帖子

67

粉丝