历史上的今天

今天是:2024年10月25日(星期五)

正在发生

2019年10月25日 | AVR128单片机最小系统串口,外部中断,跑马灯,uCOS-II移植

发布者:星辰耀眼 来源: 51hei关键字:AVR128  单片机  最小系统 手机看文章 扫描二维码
随时随地手机看文章

实验名称:串口通信实验
功能描述:计算机通过串口向开发板发送数据,开发板将数据原样送回。
实验目的:学习串口通信
实验说明: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<UCSR0B = (1<#else

UCSR0C=0x06;  //8 DATA ,1 STOP, NO PARITY

UCSR0B = (1<#endif


#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        while(Com_putchar(p[i],RTbuf)==0);//WDR(); //喂狗;

        }

        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                //WDR(); //喂狗

                *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;

        }

/*********************************************************************************************************

[1] [2]
关键字:AVR128  单片机  最小系统 引用地址:AVR128单片机最小系统串口,外部中断,跑马灯,uCOS-II移植

上一篇:AVR单片机快速PWM定时器0发生模式 TIME0_快速PWM程序
下一篇:SPI协议工作过程详解文档,内含实例代码

推荐阅读

全球半导体先进制程监控仪器制造商MKS Instruments, Inc.于美国股市10月23日盘后公布2018年第3季(截至2018年9月30日为止)财报:营收年增0.2%(季减15%)至4.87亿美元,非一般公认会计原则(Non-GAAP)每股稀释盈余年增20.5%(季减19.3%)至1.88美元。MarketWatch报导,根据FactSet的调查,分析师原先预期MKS Instruments第3季营收、Non-GAAP每股稀释盈余各为4...
已亲测,可以实现。第一步:配置相关管脚输出,比如我的是配置到PB9,使用的是定时器4的第四通道。void Pwm_Gpio_Config(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); /*GPIOB_Pin_9, TIM4_Channel4 PWM*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = G...
尽管有报道称 Redmi K30S 即将在国内正式上市,但 Redmi 仍未官宣。今天在微博上出现的几张图片表明,Redmi K30S 至尊纪念版将于 10 月 27 日正式发布。微博上(来源见图)出现的海报证实了 Redmi K30S 的名称。另外,从图像中可以明显看出,它是9月份在全球市场上发售的小米 10T 的国行版本。海报显示,Redmi K30S 的主要功能包括骁龙...
新一代小金刚Redmi Note 11系列已官宣定档10月28日发布。距离发布会越来越近,官方预热不断有干货曝出。作为同价位的标杆产品,其游戏性能自然不容忽视。Redmi Note 11打游戏表现如何?据官方最新爆料,Redmi Note 11运行知名MOBA手游,90帧流畅运行,游戏体验有保障了。一般来说,是否支持游戏高帧率,是性能分水岭,通过知名大型MOBA游戏,高帧率模...

史海拾趣

问答坊 | AI 解惑

CC4013------双上升沿D触发器

对CC4013双上升沿D触发器的  简单的介绍…

查看全部问答∨

想在南京找家培训机构学嵌入式!

如题,想了半天,百度上回答的太假了,找答案还是来比较专业的eeworld比较好,呵呵,望各位大侠帮个忙,给点建议!…

查看全部问答∨

wince6.0下DirectDraw Sample怎样打开

wince6.0下DirectDraw Sample怎样打开,请教了,感激不尽。 Sample目录如下 ..\\WINCE600\\PUBLIC\\DIRECTX\\SDK\\SAMPLES\\DDRAW\\SRC 里面有DDEX1,DDEX2...DDUTIL,DONUTS,DONUTS2..等实例代码,请问怎么打开,里面好像没有工程文件。…

查看全部问答∨

要求区分USB键盘,并屏蔽其中某键盘接收的数据

说明: XP,接USB轨迹球,接USB手写板.留个USB口可随意使用 要求:禁止USB口接进USB键盘使用 一筹莫展。 目前试过的方案,都失败: 1. 屏蔽键盘消息。但手写板就不能用了 2. 列出系统HID设备,打算在接收数据时清空 请大家帮忙…

查看全部问答∨

帮忙!!怎样学习ARM

本人想学习ARM开发,听说要有操作系统知识,想请问下该怎样去学习呢?是直接学习linux,wince,ucos操作系统吗?可以介绍下看什么书比较好?…

查看全部问答∨

关于WINCE下开发的几个问题,新手,请多关照!!

我用VS2005+WINCE 现在有几个问题向大家请教一下. 1.我的系统内核是定制好的,也就是厂家写好的,我现在发现老是关不了机,点一次"挂起"没用,再点一次就直接重新启动,我只能每次都强制关机,我害怕这样下去总有一天把扳子烧坏,有没有什么办法啊?? ...…

查看全部问答∨

电气控制及可编程控制技术视频教程

电气控制及可编程控制技术-主讲教师:王平 石油大学远程课件,普通话,从接触器到plc编程,特别适合初学者。   电气控制及可编程控制技术(下载有效时间一个月 11.30~12.30.2010)…

查看全部问答∨

【仿真】指纹系统怎么仿真,在什么软件上面可以仿真

    用S3C2440开发一个指纹识别系统,没有做实物,不知道用什么软件仿真可以验证,求大家指导!!! …

查看全部问答∨

【求助】ZigBee cc2530通讯中 多个路由器 冲突的问题

这几天赶个任务,很急,求助论坛里面的大神,帮帮忙,小弟先谢过了~~ 最近调试ZigBee cc2530 多个路由器与协调器通讯,发现了一些问题,有一个始终不得其解。 即: 协调器先开启,路由器R1联网,然后通讯正常;路由器R2后联网,可以接受 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved