AVR128单片机最小系统串口,外部中断,跑马灯,uCOS-II移植

发布者:星辰耀眼最新更新时间:2019-10-25 来源: 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协议工作过程详解文档,内含实例代码

小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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