详解一个非常好的串口程序:Mega128

发布者:学海飘香最新更新时间:2017-12-20 来源: 21IC中国电子网关键字:串口程序  Mega128 手机看文章 扫描二维码
随时随地手机看文章

#i nclude

本文引用地址: http://embed.21ic.com/hardware/development/201712/49750.html

#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

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

上一篇:用软件实现PIC16F5X异步串行口
下一篇:mega162驱动TLC1543源代码

推荐阅读最新更新时间:2024-05-03 02:10

lcd液晶12232F的串口C51程序
由于12232F这个显示器用得比较平常,但平常见到的是一些并口的汇编程序,并且也没有对应于12232F的并口程序,串口的C51程序极少见,为了方便大家使用,所以本站把它调试了一个出来,大家多多指教! 由于12232F这个显示器用得比较平常,但平常见到的是一些并口的汇编程序,并且也没有对应于12232F的并口程序,串口的C51程序极少见,为了方便大家使用,所以本站把它调试了一个出来,大家多多指教! /******************************************************/ /* 12232F串口驱动程序C51,11.0592M晶振 */ /*使用这款LCD应该要注意的问题: */ z /
[单片机]
单片机通用模拟串口C程序
//----------------------------------------------------------------------   // UART.C   // 通用模拟串口程序   // 资源需求:一个硬件计数器,两个I/O口   // 硬件计数器的计数时间设定为三倍波特率   // 定义的两个I/O口,用于发送和接收,分别用在receive()和transmit(char)中   // 设立了专门的接收缓冲区,用于存储接收数据   // 注意:必需根据波特率来设定定时器;   // 每次通信开始必须调用初始化函数init_uart()   //--------------------
[单片机]
STC11F04单片机串口终端程序
用STC11F04单片机做的串口终端程序。类似交换机的telnet命令。 由于时间仓促仅仅只实现了简单的几个命令。 help LED1_ON LED1_OFF LED2_ON LED2_OFF 例如,在串口终端输入? 输入Time 命令,可以查询到现在单片机内部的时间。 输入LED1_ON 可以把板子上的 LED1点亮 输入LED1_OFF可以把板子上的LED1熄灭 如果输入的不是以上的命令,则提示错误信息。 总体上,目前就实现了以上功能。 感兴趣的朋友可以自己再加入一些命令。 整个源代码如下: #include reg51.h #include stdio.h #include intrin
[单片机]
STC11F04单片机<font color='red'>串口</font>终端<font color='red'>程序</font>
PIC串口通信程序(1)
接收采用中断实现 #include pic.h unsigned char error=0x00; //错误数据帧,丢弃 bit Q=0; //一次数据帧接收完成标志位 unsigned char message ; //数据信息缓存区 unsigned char j=0x00; //数据信息的长度 void interrupt isr(void) //接收中断处理 { if(RCIF&&RCIE) { if(FERR)//监测是否有帧错误 { error=RCREG; }
[单片机]
PIC串口通信程序(3)发送字符
#include pic.h __CONFIG(XT&WDTDIS&LVPDIS); main() { SPBRG=25; SYNC=0;//选择异步模式 BRGH=1;//高波特率方式 TXEN=1;//发送使能 TX9=0;//不发送第9位 SPEN=1;//USART使能 //以上可替代语句RCSTA=0b10000000,TXSTA=0b00100100 TXREG='A'; while(1) { if(TRMT==1)//如果TSR空,说明发送完毕,发下个数据 { TXREG='A';//再次填充TXREG,USART模块会继续自动发送 } } }
[单片机]
PIC<font color='red'>串口</font>通信<font color='red'>程序</font>(3)发送字符
写一个串口接收发送程序
对于串口,流,的编程一直是相当头疼的,总是分不清头尾,写出来的程序总是没有把握,传输间的的程序尚可,但是发送一些带协议的东西就受不了了。 经过查资料,学习,得到一些经验,可以使用定界符法,显式长度法来发送数据。 一贯习惯是使用定界符+显式长度,写的不论不类,现在想想没有这个必要,如果在单片机上的话使用定界符,在中断里快速判断定界符和过滤每一个字符是相当奢侈的事情。故而转用显式长度法 显式长度的具体用法是,先发送要发送数据的字节数,在发送数据 接收也比较简单,先接收数据长度区,判断大小是否适合自己的RAM空间, 确定需要接收的长度后,启动正常的接收,并设置一个超时(在有限的时间里没有收到完整的数据,则丢弃)。在实际的应用中,发
[单片机]
MSP430F149串口收发程序详解
MSP430单片机的串口收发程序涉及到多个寄存器,可以一步一步按照以下步骤进行配置: 1、首先将用到的IO口设置为第二功能,例如要使用P3.4和P3.5作为USART0的TXD和RXD,则有 P3SEL |= BIT3+BIT4; 2、使能串口收发功能,要配置以下寄存器 如果既要收,又要发,则需要将UTXE0和URXE0置1,因为他们默认都是不打开的。 在IAR的头文件中有关于两位的掩码: #define UTXE0 (0x80) #define USPIE0 (0x40) 因此,我们可以直接使用语句: ME1 |= UTXE0 + URXE0; 3、选择每帧的数据位的个数,需要配置寄存器: 默认的是7bit数据位,因此将C
[单片机]
串口调试助手源程序
1.建立项目 2.在项目中插入MSComm控件 3.利用ClassWizard定义CMSComm类控制变量 4.在对话框中添加控件 5.添加串口事件消息处理函数OnComm() 6.打开和设置串口参数 7.发送数据 8.发送十六进制字符 9.在接收框中以十六进制显示 10.如何设置自动发送 11.什么是VARIANT数据类型?如何使用VARIANT数据类型?   这是串口调试助手源程序及编程详细过程(一)的续篇,首先谢谢朋友们的支持与鼓励。 8.发送十六进制字符 在主对话框中加入一个复选接钮,ID为IDC_CHECK_HEXSEND Captio
[模拟电子]
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

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

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