历史上的今天
返回首页

历史上的今天

今天是:2025年08月12日(星期二)

正在发生

2018年08月12日 | PIC24串口发送和接收程序

2018-08-12 来源:eefocus

做智能家居时,下位机用的时PIC24FJ64GA004,所以写了下面那个程序。

由于对PIC24的不熟悉,忘了加配置们,导致波特率一直不对,后面加上配置位就行了。

接收的数据按一定格式,用来控制继电器。

发送的数据暂时没用到。启用发送只要使能中断就行。

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

*         PIC24串口发送和接收    

*

* 文    件: main.c

* 作    者: ZhnJa

* 修改日期: 2013-4-6

* 说明: 9600波特率,暂时关闭发送。

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

#include "p24FJ64GA004.h"

#define RELAY1  LATBbits.LATB14

#define RELAY2  LATBbits.LATB13

// Setup configuration bits

_CONFIG1(JTAGEN_OFF & GCP_OFF & GWRP_OFF & COE_OFF & FWDTEN_OFF &  FWPSA_PR32 & WDTPS_PS2048 & ICS_PGx3)    // JTAG/Code Protect/Write Protect/Clip-on Emulation mode/ Watchdog Timer/ICD pins select

_CONFIG2(FCKSM_CSDCMD & OSCIOFNC_OFF & POSCMOD_HS & FNOSC_PRI)  // Disable CLK switch and CLK monitor, OSCO or Fosc/2, HS oscillator,Primary oscillator

    

void UART2Init(void);

void Delay(unsigned int t);

    

unsigned char Rev[6];//接收数组

unsigned char Send[10]={0x69,1,2,3,4,5,6,7,8,9};//发送数组

unsigned char i=0;//发送位

unsigned char Index=0;//接收位

    

int main(void)

{

    TRISBbits.TRISB13 = 0;//IO方向初始化

    TRISBbits.TRISB14 = 0;

    TRISBbits.TRISB5 = 1;

    UART2Init();

    while(1)

    {           

     //接收判断

        if(Rev[0]==0x68 && Rev[2]==0x69)

        {

            if(Rev[3]==0x01)

            {

                if(Rev[4] == 1)

                RELAY1 = 1;

                if(Rev[4] == 0)

                RELAY1 = 0;

            }   

            if(Rev[3]==0x02)

            {

                if(Rev[4] == 1)

                RELAY2 = 1;

                if(Rev[4] == 0)

                RELAY2 = 0;

            }   

        }

    }   

    return 0;

}

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

** Name:    UART2Init

** Function: 串口2初始化

** Input:    

** Output:   

** Time:     2013.4.05

** Attention: 11.0596MHz,9600bunds

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

void UART2Init(void)

{

    TRISCbits.TRISC5 = 1;//IO口方向

    TRISCbits.TRISC4 = 0;

    RPINR19bits.U2RXR = 21;//RP21

    RPOR10bits.RP20R = 5;//RP20

        

    U2MODEbits.BRGH = 1;//高速

    U2BRG = 143;    //波特率

    U2STAbits.UTXISEL0 = 0;//当最后一个字符被移出发送移位寄存器时产生中断

    U2STAbits.UTXISEL1 = 0;

    U2MODEbits.UARTEN = 1;

    SRbits.IPL = 3; //CPU优先级3

    IPC7bits.U2TXIP = 4; //发送中断优先级4

    IEC1bits.U2TXIE = 1; //允许发送中断

    IFS1bits.U2TXIF = 0; //清标志位

        

    IPC7bits.U2RXIP=5; //接收中断优先级

    IEC1bits.U2RXIE=1; //允许接收中断

    IFS1bits.U2RXIF=0; //清标志位

            

//  U2STAbits.UTXEN = 1; //使能发送,同时产生发送中断

        

}   

    

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

** Name:     _U2TXInterrupt

** Function: 串口2接收中断

** Input:    

** Output:   

** Time:     2013.4.05

** Attention: 

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

void __attribute__((interrupt, no_auto_psv)) _U2RXInterrupt(void)

{

    unsigned char temp; 

    IFS1bits.U2RXIF=0; //清标志位

    temp=U2RXREG;

    if(temp == 0x68)    //判断是否为第一位

        Index = 0;

    if(Index>=sizeof(Rev)) Index=0;

    Rev[Index]=temp;

    Index++;

}

    

    

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

** Name:     _U2TXInterrupt

** Function: 串口2发送中断

** Input:    

** Output:   

** Time:     2013.4.05

** Attention: 

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

void __attribute__((interrupt, no_auto_psv)) _U2TXInterrupt(void)

{

    

    IFS1bits.U2TXIF = 0; //清中断标志        

    U2TXREG = Send[i] ;  //发送数据 

    while(U2STAbits.TRMT == 0); 

    Nop();Nop();Nop();Nop();        

    i++;

    if(i==10)

    {

        i=0;    

    }       

}

    

    

void Delay(unsigned int t)

{

 unsigned int i,j;

    for(i=t;i>4;i--)

    for(j=1;j<10000;j++);

}


推荐阅读

史海拾趣

Akros[台湾超硕股份有限公司]公司的发展小趣事

随着电子行业的快速发展,Akros公司意识到技术创新的重要性。公司加大了对研发的投入,成功开发出了一系列具有高性能和稳定性的电子产品。这些产品不仅满足了市场的多样化需求,还赢得了客户的广泛认可。通过技术的不断创新和产品的不断优化,Akros逐渐在行业中树立了良好的口碑。

Cypress(赛普拉斯)公司的发展小趣事

Cypress公司成立于1982年,总部设在美国加州的San Jose。创业之初,公司专注于高速CMOS SRAM、EEPROM、PAL器件和TTL逻辑器件的设计和开发。这一时期,Cypress通过引入创新的技术和产品设计,在竞争激烈的电子芯片市场中逐渐崭露头角。公司凭借对技术的持续投入和积累,为未来的发展奠定了坚实的基础。

Electronic Transistors Corp公司的发展小趣事

在技术创新的基础上,ETC公司开始积极拓展市场。公司通过优化产品线,满足不同客户的需求,逐渐打开了国际市场的大门。同时,ETC还加大了品牌宣传力度,通过参加国际电子展会、发布技术白皮书等方式,提升品牌知名度和影响力。这些举措使ETC在全球范围内的市场份额不断扩大,品牌影响力也日益增强。

Capax Technologies Inc公司的发展小趣事

Capax Technologies Inc的崛起始于一次技术突破。公司研发团队成功开发出一种新型半导体材料,显著提高了电子设备的性能和能效。这一创新成果迅速在行业内引起关注,Capax Technologies Inc因此获得了大量订单和投资。随着技术的不断迭代和优化,Capax Technologies Inc逐渐在电子行业中崭露头角,成为一家备受瞩目的创新型企业。

aconno公司的发展小趣事

随着公司实力的增强,aconno开始积极拓展国内外市场。通过与各大电商平台和分销商建立合作关系,aconno的产品迅速覆盖了更广泛的地域和用户群体。此外,公司还积极参与国际电子展和技术交流会,与全球合作伙伴建立紧密的合作关系,共同推动电子行业的发展。

C&H Technology公司的发展小趣事

随着智能手机市场的快速发展,C&H Technology意识到单纯的芯片制造已经不能满足市场需求。于是,公司开始加大研发投入,致力于在5G通信、人工智能等前沿技术领域取得突破。经过多次试验和失败,C&H Technology的研发团队终于成功开发出了一款集成5G通信功能的手机芯片,并获得了多项专利。这一技术突破不仅提升了公司在行业内的地位,也为公司的未来发展奠定了坚实的基础。

问答坊 | AI 解惑

电视监控系统组成

闭路监控系统主要组成部分是:前端部分(产生图像的摄像机或成像装置),传输部分(图像的传输),控制部分,显示记录部分。如图所示。 1、 前端部分 CCTV的前端设备是直接完成现场图像捕捉功能的设备及其辅助设备,主要有一体化智能快球、固定 ...…

查看全部问答>

基于STM32的μC/OS Ⅱ移植例程

例程大小:1583K 例程说明: 1.改移植和模板工程不包括操作系统核ucosⅡ的源代码,如需使用请向操作系统的供应商联系或者网上下载免费的源代码。 2.本移植使用的是 ucosⅡ 2.83版本,需要在OS文件夹下添加的操作系统源代码包括如下文件: os_fla ...…

查看全部问答>

单片机外围电路设计

在用单片机设计的过程中,难免要进行一些外围电路设计。这里我收集了一本不错的单片机外围电路设计的电子书,特的拿出来和大家一起分享!!!!!!!!!…

查看全部问答>

请教我读一读这个密码锁程序

在网上找了个密码锁程序来学习,用KEIL编译,开始不能生成HEX文件,后来找到原因了,有些是数字0打成了字母O,有些是漏了冒号! 现在想问一下,这个程序应该怎样读?密码是如何设置的?刚学,搞不懂. org 0000h AJMP START ORG 0030H START:ACALL BP ...…

查看全部问答>

S3C2440+ADS+H-JTAG+AXD无法调试

在AXD中Load Image后无法正常加载,加载后的程序如下                __main        [0x00000000]   andeq    r0,r0,r0        ...…

查看全部问答>

片内flash和片外flash?

刚接触开发板, 不清楚什么是片内RAM和片外RAM,以及片内Flash和片外Flash. 请大家解释一下, 我用的是philips的板子. 难道LPC2214处理器内部也有ARM和Flash吗? …

查看全部问答>

【编程】请教磁盘数据如何擦除

最近需要开发一个擦除硬盘的工具,实现的功能就是将一整块硬盘挂到一台机器上,比如说是Windows系统的机器上,然后利用该工具将整块硬盘的数据清除,而且清除后不可以再恢复。并且这块硬盘不管它是在什么系统下用的硬盘(比如AIX、HP、SCO等等), ...…

查看全部问答>

大侠,能给个Finsh shell移植到stm32的例子吗

或者给个移植的文档也行啊,radio里的东西感觉有点乱啊,谢谢了…

查看全部问答>

关于ADC转换使用DMA的问题!

ADC配置为一次转换6个通道,使用DMA传送, SCAN位为0  CONT位为零.外部触发使用软件触发. 出现一个问题是,转换只能在最后一通道转换完成后产生DMA传送,前面5通道全部丢失.  SCAN位置1也一样!…

查看全部问答>

为什么UC3843驱动MOS管的波形,只有几个周期有波形,其它时间没有?

我现在用UC3843控制MOS管来做boost升压电路,测量UC3843的6脚输出波形发现,只有几个周期有波形,其它时间输出波形一直为低。24VDC升压到120VDC,0.25A,开关频率为220K。请问这是为什么? …

查看全部问答>