串口

应用芯片: AT Mega16               晶振: 7.3728MHz      

代码文件: uart_int.c

                         |_________DELAY.H

##############################################

DELAY.H :

#ifndef __IAR_DELAY_H
#define __IAR_DELAY_H

#include <intrinsics.h>

#define XTAL 7.3728                    //可定义为你所用的晶振频率(单位Mhz)


#define delay_us(x) __delay_cycles ( (unsigned long)(x * XTAL) )
#define delay_ms(x) __delay_cycles ( (unsigned long)(x * XTAL*1000) )
#define delay_s(x) __delay_cycles ( (unsigned long)(x * XTAL*1000000) )

#endif

 

uart_int.c :

#include <iom16.h>
#include "delay.h"
#define uchar unsigned char
#define uint unsigned int

uchar c;

//###########################################################
/*串口初始化函数*/

void Uart_Init(void)
{                        
    UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE);             //允许发送和接收
    UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);       //8位数据位+1位停止位

    UBRRH=0x00;                                                             //设置波特率寄存器低位字节
    UBRRL=47;                                                                   //9600    //设置波特率寄存器高位字节
   
    SREG_I = 1;                                                                //开总中断
    DDRD_Bit1=1;                                                             //配置TX为输出(很重要)
}
//###########################################################
/*发送一个字符数据,查询方式*/

void Uart_Transmit(uchar data)
{
     while(!(UCSRA&(1<<UDRE)));                                  // 等待发送缓冲器为空
                                                                                         //也可以写成 while(UCSRA_UDRE==0);  
     UDR = data;                                                               // 发送数据
}
//###########################################################
/*中断接收*/

#pragma vector=USART_RXC_vect
__interrupt void USART_RXC_Server(void)
{
UCSRB_RXCIE = 0;                                                        //关串口中断
c = UDR ;                                                                       //将收到的值赋值给变量
Uart_Transmit(c);                                                          //发给串口以检测对错
UCSRB_RXCIE = 1;                                                         //开串口中断
}
//###########################################################
/*主函数*/

void main(void)
{
Uart_Init();
delay_us(20);                       //串口初始化后,必须延时20us以上才能发送数据,否则会出现错误
Uart_Transmit(0x64);

while(1)
{ ; }                                        //此时可以用串口助手发送字符,然后可以正确接收
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值