实验名称:串口通信实验
功能描述:计算机通过串口向开发板发送数据,开发板将数据原样送回。
实验目的:学习串口通信
实验说明: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协议工作过程详解文档,内含实例代码
推荐阅读
史海拾趣
在市场竞争日益激烈的今天,方舟公司凭借其卓越的产品质量和完善的售后服务,成功打开了国内外市场。公司积极参与国内外行业展会和交流活动,与众多知名企业建立了战略合作关系。同时,方舟公司还不断拓展海外市场,产品远销欧美、东南亚等地区,赢得了客户的广泛赞誉。
南晶电子(DGNJDZ)成立于2011年,起初只是一家专注于半导体分立器件研发和生产的小型企业。创始人毛姬娜凭借其敏锐的市场洞察力和技术背景,带领团队攻克了一个又一个技术难关,逐渐在电子行业崭露头角。公司初期面临着资金短缺、技术瓶颈等重重困难,但毛姬娜和团队凭借坚韧不拔的精神,一步步走出了困境。
在过去,国内企业在车载信号传输领域的共模电感选择有限,主要依赖进口品牌。岑科意识到这一市场的巨大空缺后,决定借助自主研发设备的优势进行研发工作。经过两三年的攻关,岑科成功研发出了ACML系列共模电感。这一系列产品在温度特性上表现优异,可在-40℃到150℃的范围内正常工作,并适用于CAN-BUS、CAN-FD、A2B及以太网等多种场景。岑科的这一研发成果不仅填补了国内市场空白,还实现了国产替代,为汽车电子行业的发展做出了重要贡献。
为了进一步提升国际竞争力,AIC公司开始实施全球化布局战略。公司先后在多个国家设立了研发中心和生产基地,以便更好地服务全球客户。同时,AIC公司还积极参加国际展览和交流活动,与海外企业建立合作关系,推动产品的全球化销售。这些举措使AIC公司的国际影响力不断提升,市场份额也进一步扩大。
为了进一步拓展市场,长工微电子积极寻求战略合作。近期,长工微电子与世强先进(深圳)科技股份有限公司签署战略合作协议,授权世强先进全线代理其旗下电源管理IC、开关转换器、多相控制器、降压电源模块、电子保险丝等产品。这一合作有助于长工微电子更好地满足客户需求,提高市场占有率。
随着公司的不断发展,Bourns在1952年取得了世界上第一个可调式电阻的专利,即TrimpotR。这一技术突破标志着Bourns在电子元器件领域的领先地位,也为公司的产品线增添了核心竞争力。可调电阻的广泛应用推动了Bourns在电子行业的快速发展。
wince6.0下DirectDraw Sample怎样打开 wince6.0下DirectDraw Sample怎样打开,请教了,感激不尽。 Sample目录如下 ..\\WINCE600\\PUBLIC\\DIRECTX\\SDK\\SAMPLES\\DDRAW\\SRC 里面有DDEX1,DDEX2...DDUTIL,DONUTS,DONUTS2..等实例代码,请问怎么打开,里面好像没有工程文件。… 查看全部问答∨ |
说明: XP,接USB轨迹球,接USB手写板.留个USB口可随意使用 要求:禁止USB口接进USB键盘使用 一筹莫展。 目前试过的方案,都失败: 1. 屏蔽键盘消息。但手写板就不能用了 2. 列出系统HID设备,打算在接收数据时清空 请大家帮忙… 查看全部问答∨ |
我用VS2005+WINCE 现在有几个问题向大家请教一下. 1.我的系统内核是定制好的,也就是厂家写好的,我现在发现老是关不了机,点一次"挂起"没用,再点一次就直接重新启动,我只能每次都强制关机,我害怕这样下去总有一天把扳子烧坏,有没有什么办法啊?? ...… 查看全部问答∨ |
电气控制及可编程控制技术-主讲教师:王平 石油大学远程课件,普通话,从接触器到plc编程,特别适合初学者。 电气控制及可编程控制技术(下载有效时间一个月 11.30~12.30.2010)… 查看全部问答∨ |
【求助】ZigBee cc2530通讯中 多个路由器 冲突的问题 这几天赶个任务,很急,求助论坛里面的大神,帮帮忙,小弟先谢过了~~ 最近调试ZigBee cc2530 多个路由器与协调器通讯,发现了一些问题,有一个始终不得其解。 即: 协调器先开启,路由器R1联网,然后通讯正常;路由器R2后联网,可以接受 ...… 查看全部问答∨ |