历史上的今天
返回首页

历史上的今天

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

正在发生

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

2019-10-25 来源:51hei

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

        }

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

推荐阅读

史海拾趣

Efficient Power Conversion公司的发展小趣事

EPC公司成立于2007年,由三位拥有六十年先进功率管理技术经验的资深工程师共同创立。公司的创始人们认识到,随着技术的不断发展,传统的硅功率技术已接近其性能极限。他们决定专注于氮化镓技术的研究与开发,这是一种新型的半导体材料,具有比硅更高的电子迁移率和更低的电阻。经过数年的研究和试验,EPC公司成功开发出了基于氮化镓的高效功率半导体器件,这一突破性的技术为公司的未来发展奠定了坚实的基础。

FOSLINK公司的发展小趣事

在电子行业竞争日益激烈的背景下,FOSLINK公司深知单打独斗难以长久立足。因此,公司积极寻求与行业内外的优秀企业建立战略合作关系。通过跨界合作,FOSLINK不仅获得了更多的技术资源和市场渠道,还实现了资源共享和优势互补。例如,FOSLINK与某知名互联网企业合作,共同开发智能家居产品;与某汽车制造商合作,为其提供车载电子解决方案等。这些跨界合作不仅为FOSLINK带来了新的增长点,也为其在电子行业中树立了更加多元化的形象。

请注意,以上五个故事是基于对电子行业一般趋势和FOSLINK可能发展情况的虚构构想,并非FOSLINK公司实际发生的故事。由于FOSLINK的具体信息有限,以上内容仅供参考。

CDI-DIODE公司的发展小趣事

随着环保意识的日益增强,电子行业也开始向绿色生产转型。CDI-DIODE公司积极响应这一趋势,投入大量资源研发环保型二极管产品,并采用环保材料和生产工艺。这种绿色生产方式不仅降低了公司的生产成本,也符合了社会的可持续发展需求,为公司的未来发展奠定了坚实的基础。

这五个故事虽然是虚构的,但它们反映了电子行业中企业可能面临的一些共同挑战和机遇。无论对于CDI-DIODE公司还是其他企业,这些故事都具有一定的借鉴意义。

Cystech公司的发展小趣事

随着全球环保意识的不断提高,C-TECH Co., Ltd积极响应环保号召,将环保理念融入公司的发展之中。公司在2007年就通过了ISO 14001环境管理体系认证,并在生产过程中采用环保材料和工艺,减少废弃物排放和能源消耗。此外,公司还积极参与环保公益活动,推动行业绿色发展。通过践行环保理念,C-TECH Co., Ltd在电子行业树立了良好的企业形象。

Dawning Precision Co Ltd公司的发展小趣事

在快速发展的过程中,Dawning意识到企业文化的重要性。公司注重培养员工的团队合作精神和创新能力,定期组织各种团建活动和文化交流活动。同时,Dawning还倡导“以人为本”的管理理念,关注员工的成长和发展,为员工提供良好的职业发展平台。这些举措的实施,使得Dawning的员工队伍更加团结、稳定和有活力,为公司的长远发展奠定了坚实的基础。

Anaren公司的发展小趣事

在快速发展的过程中,Dawning意识到企业文化的重要性。公司注重培养员工的团队合作精神和创新能力,定期组织各种团建活动和文化交流活动。同时,Dawning还倡导“以人为本”的管理理念,关注员工的成长和发展,为员工提供良好的职业发展平台。这些举措的实施,使得Dawning的员工队伍更加团结、稳定和有活力,为公司的长远发展奠定了坚实的基础。

问答坊 | AI 解惑

44b0的FIQ中断如何实现

    前两三天找了和看了很多关于44b0中断的资料,结合了bootloader的代码,总算深入了解了44b0的向量和非向量的IRQ中断方式,但发现找不到HandleFIQ所对应的入口。请问FIQ中断是如何在uclinux下实现的?它如何实现区分发生了26种中断源中 ...…

查看全部问答>

NFS Mount的问题

Linux IP:192.168.0.2       ARM 开发板IP:192.168.0.3 Linux自已mount nfs成功:mount -t nfs 192.168.0.2:/nfs /mnt/nfs Linux和开发板能Ping通,但开发板却不能mount Linux中的nfs共享目录: mount -t nfs -o nolock 192.16 ...…

查看全部问答>

关于播放WAV会出现“啪啪”声音的问题

大家好,想请教个关于MOBILE下播放WAV的问题 最近在做个导航的测试,需要把各个语音文件给串起来播放,比如“前方”、“五”、“十”。。。。 我是用wave function进行处理的。起初我只用一个缓冲去,然后在我的主线程中开个线程进行语音播放处 ...…

查看全部问答>

Introduction to TCP/IP

最近整理TCP/IP协议,写的一个PPT,与大家分享,有不对的地方,望指正!      …

查看全部问答>

wince 一级界面的字体很浅该怎么改

如题,wince 比如打开ie,一级界面的字体很浅,然后点一个链接或者别的,跳转到二级界面时候字体就正常了,,请教如何 修改…

查看全部问答>

Quartus II 中管脚上拉电阻(弱上拉)的设置方法

在使用 Altera 的 FPGA 时候,根据系统设计需要在管脚的内部加上上拉电阻。Quartus II 软件中在 Assignment 的 Pin Planner中可以设置。具体过程如下:  1.  在菜单 Ass ...…

查看全部问答>

ADI的计步器参考设计方案

加速度传感器能够准确的测量被测物体的加速度信息,从而获知其当前的运动状态,包括位置,速度和加速度。加速度传感器已广泛应用于各类消费电子产品中。本设计正是基于ADI的两轴加速度传感器ADXL320而设计的,它能够精确地测量出佩戴者行走的步数, ...…

查看全部问答>

DIY 太阳能自动跟踪阳光系统,视频+多图~~~

DIY 太阳能自动跟踪阳光系统,视频+多图~~~ 图片是从视频中接的图不清楚,高清图已经附上貌似之前的图片删不掉了,,, $(\'flv_KY8\').innerHTML=(mobileplayer() ? \"\" : AC_FL_RunContent(\'width\', \'500\', \'height\', \'375\', \'allowN ...…

查看全部问答>

实验六:FSPAD_702平板串口通信实验

【实验内容】基于FSPAD_702平板,实现串口通信。       【实验目的】熟悉FSPAD_702平板串口通信的整体流程。       【实验环境】Ubuntu 10.04虚拟机,FSPAD_702开源平板,usb转网口模块,usb转串口数据线等 ...…

查看全部问答>