Mega128的串口通讯程序

发布者:牟牟的侬最新更新时间:2016-07-18 来源: eefocus关键字:Mega128  串口通讯 手机看文章 扫描二维码
随时随地手机看文章
#i nclude
#i nclude
#i nclude "uart.h"
/* USART Buffer Defines */
#define USART_RX_BUFFER_SIZE 16 /* 1,2,4,8,16,32,64,128 or 256 
bytes */
#define USART_RX_BUFFER_MASK ( USART_RX_BUFFER_SIZE - 1 )
#define USART_TX_BUFFER_SIZE 16 /* 1,2,4,8,16,32,64,128 or 256 
bytes */
#define USART_TX_BUFFER_MASK ( USART_TX_BUFFER_SIZE - 1 )
#if ( USART_RX_BUFFER_SIZE & USART_RX_BUFFER_MASK )
#error RX buffer size is not a power of 2
#endif
/* Static Variables */
static unsigned char USART_RxBuf[USART_RX_BUFFER_SIZE];
static volatile unsigned char USART_RxHead;
static volatile unsigned char USART_RxTail;
static unsigned char USART_TxBuf[USART_TX_BUFFER_SIZE];
static volatile unsigned char USART_TxHead;
static volatile unsigned char USART_TxTail;
/* 串口初始化 */
void InitUSART(INT8U  baudrate)
{
INT8U x;
UBRR0L = baudrate;
UCSR0B = ( (1< Complete
Interrupt Enable, Receiver Enable and Transmitter Enable*/
x = 0; /* flush receive buffer */
USART_RxTail = x;
USART_RxHead = x;
USART_TxTail = x;
USART_TxHead = x;
}
/* 接收中断 */
void USART_RX_interrupt( void )
{
unsigned char data;
unsigned char tmphead;
data = UDR0; /* read the received data */
tmphead = ( USART_RxHead + 1 ) & USART_RX_BUFFER_MASK;/* 
calculate
buffer index */
USART_RxHead = tmphead; /* store new index */
if ( tmphead == USART_RxTail )
{
return;/* ERROR! Receive buffer overflow, you can use
flux cortorl */
}
USART_RxBuf[tmphead] = data; /* store received data in buffer 
*/
}
/* 发送中断 */
void USART_TX_interrupt( void )
{
unsigned char tmptail;
if ( USART_TxHead != USART_TxTail )/* check if all data is
transmitted */
{
tmptail = ( USART_TxTail + 1 ) & USART_TX_BUFFER_MASK;/*
calculate buffer index */
USART_TxTail = tmptail; /* store new index */
UDR0 = USART_TxBuf[tmptail]; /* start transmition */
}
else
{
UCSR0B &= ~(1< }
}
/* 读取数据函数 */
unsigned char ReceiveByte( void )
{
unsigned char tmptail;
while ( USART_RxHead == USART_RxTail ) /* wait for incomming 
data */
;
tmptail = ( USART_RxTail + 1 ) & USART_RX_BUFFER_MASK;/* 
calculate
buffer index */
USART_RxTail = tmptail; /* store new index */
return USART_RxBuf[tmptail]; /* return data */
}
/* 发送数据函数 */
void TransmitByte( unsigned char data )
{
unsigned char tmphead;
tmphead = ( USART_TxHead + 1 ) & USART_TX_BUFFER_MASK; /* 
calculate
buffer index */
while ( tmphead == USART_TxTail )/* wait for free space in 
buffer */
;
USART_TxBuf[tmphead] = data; /* store data in buffer */
USART_TxHead = tmphead; /* store new index */
UCSR0B |= (1< }
/* 查询是否有数据 */
unsigned char DataInReceiveBuffer( void )
{
return ( USART_RxHead != USART_RxTail ); /* return 0 (FALSE) 
if the
receive buffer is empty */
}
/* 中断中只做很少的事情,通常我是在接收中断中post一个信号量,触发别的任务读数据
*/
关键字:Mega128  串口通讯 引用地址:Mega128的串口通讯程序

上一篇:Atmega16 单片机串口通信与外部中断介绍
下一篇:AVR定时器工作原理

推荐阅读最新更新时间:2024-03-16 15:00

51单片机IO口模拟串口通讯1-延时法
最近因工作需要,研究了一下单片机IO口模拟串口通讯的相关知识。相关内容主要参考了网上《51单片机模拟串口的三种方法》和《单片机IO口模拟串口程序(发送+接收)》两篇文档,并动手做了一下实验。感受颇多。 硬件环境:STC89C52 软件环境:IDE Keil uVision V4.10 编译器 C51 V9.0 代码如下: /********************************************** 方法1:延时法 硬件:11.0592MHz晶振,STC89C52,RXD P1.0 TXD P1.1 波特率:9600 描述:所谓延时法是指根据模拟出的波特率,每1位持续的时间的长短是通过循环空指令来延
[单片机]
51单片机IO口模拟<font color='red'>串口通讯</font>1-延时法
STM32F1--串口通讯实验
串口通讯实验–通讯的基本概念 通讯的基本概念 1、串行通讯 2、并行通讯 3、异步通讯 4、同步通讯 5、单工、半双工、全双工 串口通讯实验–USART介绍 串口通讯简介 一般采用的是标准的电气标准,但是采用的协议没有标准规定,但是,我们一般都采用96N81 的标准(9600波特率, N 无校验位, 8 位数据位,1位停止位) 串口通讯一般当采用的引脚只有三个,所以 TXD RXD SGND 这三个 USART 同步异步收发器 USART的结构框图 关于波特率的相关问题 串口通讯实验–USART 的配置步骤 step1 使能串口时钟概念和对应的串口引脚 step2 初始化串口参数 停
[单片机]
STM32F1--<font color='red'>串口通讯</font>实验
基于CH341A的USB串口通讯设计
  随着计算机技术的发展,具有热插拔功能的USB接口逐渐取代了RS232C接口,使得采用RS232C通讯的旧式设备应用受到限制。此外,由于RS232C通讯接口编程简单,控制灵活,大多数MCU仍然把它作为一个标准模块固化在其外围电路当中。目前,市面上虽然有一些成型的USB/ RS232C转换产品,但功能比较简单,只支持3线通信方式,并且与PC端的串口应用程序不完全兼容,使用过程中经常出现握手失败的情况。本文根据实际情况中PC的USB接口使用情况,设计了两款产品,在芯片厂家提供的驱动程序下,仅需少量编程即可满足USB与RS232C接口的转换问题,以及实现MCU与PC之间的USB串口通信。   1 CH341A简介   CH341
[嵌入式]
51单片机IO口模拟串口通讯6
/*************************************************************** *模拟接收程序,这个程序的作用从模拟串口接收数据,然后将这些数据发送到实际串口 *在单片机上模拟了一个串口,使用P3.2作为发送和接收端 *以P3.2模拟串口接收端,从模拟串口接收数据发至串口 *本程序来源于《单片机IO口模拟串口程序(发送+接收)》 *硬件环境:11.0592MHz, RXD P3.2 ***************************************************************/ #include reg51.h #include stdio.h
[单片机]
西门子PLC串口通讯方法分析
1、 RS485串口通信 第三方设备大部分支持,西门子S7  PLC可以通过选择自由口通信模式控制串口通信。最简单的情况是只用发送指令(XMT)向打印机或者变频器等第三方设备发送信息。不管任何情况,都必须通过S7  PLC编写程序实现。  当选择了自由口模式,用户可以通过发送指令(XMT)、接收指令(RCV)、发送中断、接收中断来控制通信口的操作。  2、        PPI通信          PPI协议是S7-200CPU最基本的通信方式,通过原来自身的端口(PORT0或PORT1)就可以实现通信,是S7-200  CPU默认的通信方式。  PPI是一种主-从协议通信,主-从站在一个令牌环网中。在CPU内用户网络读写
[嵌入式]
8051系统的串口通讯及应用
在微型计算机数字系统里,数据传输可分为并行传输与串行传输两种,并行式传输一次传输多个位(通常是8位)。因此,连接两个系统之间的传输线必须有多条,当然一次传输多个位,传输的速度比较快,但是传输用到的线数也多,线路费用相对会高,线路噪声,阻抗匹配等问题也多,所以并行式传输不适合长距离通讯。 串行式传输每次传输一个位,数据传输的速度表面上不怎么快,但连接两个系统之间,只要两条传输线即可,适合长距离的 通信 。实际上,目前串行 端口 传输速率已比并行端口输出传输速率快。 实际中考虑使用并行式传输还是串行式传输要根据数据量与环境而定。若要将8051系统的数据传至另一8051系统,则可以使用串行式数据传输。 最典型的串行式数据传输 接口
[单片机]
8051系统的<font color='red'>串口通讯</font>及应用
11、PIC系列-串口通讯模块
1、PIC32参考资源 PIC32系列参考手册 中文版 链接地址:PIC32系列参考手册 第21章 UART 模块 2、串口通讯描述 通用异步收发器模块是 PIC32MX 系列器件提供的串行 I/O 模块之一。 UART 模块的主要特性有: • 全双工 8 位或 9 位数据传输 • 偶校验、奇校验或无奇偶校验选项 (对于 8 位数据) • 一个或两个停止位 • 硬件自动波特率特性 • 完全集成的波特率发生器,具有 16 位预分频器 • 当器件工作在 80 MHz 时,波特率范围从 76 bps 至 20 Mbps • 独立的接收和发送 FIFO 数据缓冲区 • 奇偶校验、帧和缓冲区溢出错误
[单片机]
11、PIC系列-<font color='red'>串口通讯</font>模块
组态王与单片机多机串口通信的设计
   1 引言   随着工业化要求提高,分布式系统发展以及控制设备与监控设备之间通讯需要,组态软件设计的监控系统逐步普及。现在组态软件繁多,比如KingVieW(组态王)、MCGS、WinCC等。KingView软件基于Microsoft Windows XP,NT/2000操作系统.具有友好的人机操作界面、强大的IO设备端口驱动能力,可与各种PLC、智能仪表、智能模块、板卡、变频器等实时通讯。由于在检测大量模拟量的工业现场使用PLC与组态软件通讯势必增加产品成本。而单片机接口丰富,与A/D转换模块组合可以完成相同的工作,并且系统可靠、成本低。    2 组态王与单片机的串口通讯方法   目前,组态王与单片机的通信多是
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved