实验名称:串口通信实验
功能描述:计算机通过串口向开发板发送数据,开发板将数据原样送回。
实验目的:学习串口通信
实验说明:MCU--M128
内部8M晶振
连接方式:利用串口线将开发板和计算机相连。
单片机源程序如下:
/************************************************
文件:sio.c
用途:结构化串口通信程序
************************************************/
#include "config.h"
#if USEUART0
siocirqueue RTbuf_UART0;
#endif
#if USEUART1
siocirqueue RTbuf_UART1;
#endif
#if (CPU_TYPE == M32)||(CPU_TYPE == M16)||(CPU_TYPE == M8)
#define USEUART0 TRUE
#define USEUART1 FALSE
#define iv_USART0_RXC iv_USART_RXC
#define iv_USART0_TXC iv_USART_TXC
#define UDR0 UDR
#define UCSR0A UCSRA
#define UCSR0B UCSRB
#define UCSR0C UCSRC
#define UBRR0H UBRRH
#define UBRR0L UBRRL
#define RXCIE0 RXCIE
#define TXCIE0 TXCIE
#endif
/*********************************************************************************************************
** 函数名称: Com_init
** 功能描述: 初始化串行口
** 输 入:
** 全局变量: 无
** 调用模块: Com_baudrate
** 说明:
** 注意:
********************************************************************************************************/
void Com_init (void) {
//WDR(); //喂狗
//CLI(); // 关中断
#if USEUART0
Tbuf_init(&RTbuf_UART0); //初始化接收缓冲
Rbuf_init(&RTbuf_UART0);
UCSR0B = 0x00; //disable while setting baud rate
UCSR0A=0x00;
#if CPU_TYPE <= M32
UCSRC = (1< UCSR0C=0x06; //8 DATA ,1 STOP, NO PARITY UCSR0B = (1< #endif #if USEUART1 Tbuf_init(&RTbuf_B); //初始化接收缓冲 Rbuf_init(&RTbuf_B); UCSR1B = 0x00; //disable while setting baud rate UCSR1A = 0x00; UCSR1C = 0x06; UCSR1B = 0xD8; #endif Com_baudrate (9600); // //SEI(); // 开中断 } /********************************************************************************************************* ** 函数名称: Com_baudrate ** 功能描述: 利用定时器T1产生由参数baudrate指定的波特率 ** 输 入: baudrate指定的波特率 ** 全局变量: 无 ** 调用模块: 无 ** 说明: ** 注意: ********************************************************************************************************/ void Com_baudrate (unsigned int baudrate) { unsigned int tmp; tmp= F_CPU/baudrate/16-1; #if USEUART0 UBRR0H=(unsigned char)(tmp>>8); UBRR0L=(unsigned char)tmp; #endif #if USEUART1 UBRR1H=(unsigned char)(tmp>>8); UBRR1L=(unsigned char)tmp; #endif } /********************************************************************************************************* ** 函数名称: Com_putchar ** 功能描述: 从串行口输出一个字符c ** 输 入: c:输出字符 ** 输出 : 0:失败 1:成功 ** 全局变量: 无 ** 调用模块: ** 说明: ** 注意: ********************************************************************************************************/ unsigned char Com_putchar (unsigned char c,siocirqueue *RTbuf) { //WDR(); //喂狗 if (Tbuf_full(RTbuf)) return(0); else{ Tbuf_putchar(c,RTbuf); // 将数据加入到发送缓冲区并开中断 return(1); } } /********************************************************************************************************* ** 函数名称: Com_putstring ** 功能描述: 从串行口输出一个字符串 ** 输 入: p:指向输出字符串 len:输出长度 ** 输出 : ** 全局变量: 无 ** 调用模块: ** 说明: ** 注意: ********************************************************************************************************/ void Com_putstring (unsigned char *p,unsigned char len,siocirqueue *RTbuf) { unsigned char i; //WDR(); //喂狗 if (len!=0 ){ for(i=0;i } else { do{ while(Com_putchar(*p,RTbuf)==0);//WDR(); //喂狗; }while(*p++!='n'); } } /********************************************************************************************************* ** 函数名称: Com_getchar ** 功能描述: 从串行口输入一个字符 ** 输 入: mode:0不需等待,在调用函数前检测Com_R_count的值 ** 1 等待数据到来 ** 输出 : 读入的字符 ** 全局变量: 无 ** 调用模块: ** 说明: ** 注意: ********************************************************************************************************/ unsigned char Com_getchar (unsigned char mode,siocirqueue *RTbuf) { //WDR(); //喂狗 // Delay(Delay_Comget,MaxLimit_Comget_Delay); // if (mode>0) while(Com_R_count(RTbuf)==0 && !DelayOvf(Delay_Comget))//WDR(); //喂狗; // if (DelayOvf(Delay_Comget)) // return 0; //时间超时 // else while(!Com_R_count(RTbuf)); return (Rbuf_getchar(RTbuf));// 串行口输入正确,返回输入的字符 } void Com_Rbuf_Clear(siocirqueue *RTbuf){ Rbuf_init(RTbuf); } unsigned char Com_getstring (unsigned char *p,unsigned char len,siocirqueue *RTbuf) { unsigned char i=0; //WDR(); //喂狗 if (len>0 ){ for(i=0;i *p++=Com_getchar(1,RTbuf); } return(len); } else{ do{ *p++=Com_getchar(1,RTbuf); i++; //WDR(); //喂狗 }while(*(p-1)!='n'); // *p++=Com_getchar(1,RTbuf); // *(p)=0; return(i); } } /********************************************************************************************************* ** 函数名称: Com_R_count ** 功能描述: 返回接收缓冲区字符个数函数 ** 输 入: ** 输出 : 字符个数 ** 全局变量: 无 ** 调用模块: ** 说明: ** 注意: ********************************************************************************************************/ unsigned char Com_R_count(siocirqueue *RTbuf){ return RTbuf->R_count; } /********************************************************************************************************* ** 函数名称: Rbuf_init ** 功能描述: 接收缓冲区初始化 ** 输 入: ** 输出 : ** 全局变量: 无 ** 调用模块: ** 说明: ** 注意: ********************************************************************************************************/ void Rbuf_init(siocirqueue *RTbuf){ RTbuf->R_front=0; RTbuf->R_rear=0; RTbuf->R_count=0; RTbuf->R_overflow=0; } /********************************************************************************************************* ** 函数名称: Tbuf_init ** 功能描述: 发送缓冲区初始化 ** 输 入: ** 输出 : ** 全局变量: 无 ** 调用模块: ** 说明: ** 注意: ********************************************************************************************************/ void Tbuf_init(siocirqueue *RTbuf){ RTbuf->T_front=0; RTbuf->T_rear=0; RTbuf->T_count=0; RTbuf->T_disabled=1; } /********************************************************************************************************* ** 函数名称: Rbuf_empty ** 功能描述: 接收缓冲区判空 ** 输 入: ** 输出 : TRUE 空 FALSE 非空 ** 全局变量: 无 ** 调用模块: ** 说明: ** 注意: ********************************************************************************************************/ unsigned char Rbuf_empty(siocirqueue *RTbuf){ return RTbuf->R_count==0; } /********************************************************************************************************* ** 函数名称: Tbuf_empty ** 功能描述: 发送缓冲区判空 ** 输 入: ** 输出 : TRUE 空 FALSE 非空 ** 全局变量: 无 ** 调用模块: ** 说明: ** 注意: ******************************************************************************************************** unsigned char Tbuf_empty(void){ return RTbuf->T_count==0; } /*********************************************************************************************************
上一篇:AVR单片机快速PWM定时器0发生模式 TIME0_快速PWM程序
下一篇:SPI协议工作过程详解文档,内含实例代码
设计资源 培训 开发板 精华推荐
- 使用 ROHM Semiconductor 的 BD5337 的参考设计
- 0.96寸OLED小电视
- OM17022: BFU520W评估板,用于频率为315、,434和868 MHz的汽车遥控无钥匙进入LNA应用
- LTC3130EUDC-1 宽输入电压范围 5V 转换器的典型应用使用小型一次电池
- 使用 ams AG 的 AS1312-BTDT 的参考设计
- MIC5271电容负低压降稳压器的典型应用
- 大道至简 书法(PCB版本)
- 555仿真1810300524
- 使用 Analog Devices 的 LTC6404 的参考设计
- 用于 MCU 系统负载感应的 NCP301LSN47T1 4.7V 电压检测器的典型应用