C语言程序>>USART

 

#include
#include
#include
#include "usart.h"

//常量定义
#define BAUDRATE         9600 //波特率
#define F_CPU    16000000 //这个已经在makefile里面定义了

void init_USART(void)//USART 初始化
{

    //USART 9600 8, n,1  PC上位机软件(超级终端等)也要设成同样的设置才能通讯
    UCSRC = (1<     //异步,8位数据,无奇偶校验,一个停止位,无倍速
    /*
    UBRRH与UCSRC共用I/O 地址。因此访问该地址时需注意以下问题。
    写访问
    当在该地址执行写访问时, USART 寄存器选择位(URSEL)控制被写入的寄存器。
    若URSEL为0,对UBRRH值更新;若URSEL为1,对UCSRC设置更新
   
    读访问
    对UBRRH 或UCSRC 寄存器的读访问则较为复杂。但在大多数应用中,基本不需要读这些寄存器
   
   
    没有UBRR这个16位寄存器,因为UBRRL(0x09)/UBRRH(0x20)的地址不连续,而且UBRRH跟UCSRC共用地址
    */
   
    //U2X=0时的公式计算
    UBRRL= (F_CPU/BAUDRATE/16-1)%256;
    UBRRH= (F_CPU/BAUDRATE/16-1)/256;
    //U2X=1时的公式计算
    //UBRRL= (F_CPU/BAUDRATE/8-1)%256;
    //UBRRH= (F_CPU/BAUDRATE/8-1)/256;
    //也可根据数据手册的[波特率设置的例子]查得
    //UBRRL = 0x2F; //set baud rate lo
    //UBRRH = 0x00; //set baud rate hi
    UCSRA = 0x00;
    UCSRB = (1<     //使能接收中断,使能接收,使能发送
}

void put_c(unsigned char c) //发送采用查询方式
{
 while( !(UCSRA & (1<  UDR=c;
}

void put_s(unsigned char *ptr)
{
 while (*ptr)
 {
  put_c(*ptr++);
 }
 put_c(0x0D);
 put_c(0x0A);  //结尾发送回车换行
}

#ifndef _USART_H_
#define _USART_H_

void init_USART(void);//USART 初始化
void put_s(unsigned char *ptr);

#endif  /* _USART_H_ */

你可能感兴趣的:(AVR)