PIC与485的通讯源程序

发布者:清新天空最新更新时间:2017-12-04 来源: eefocus关键字:PIC  通讯源程序 手机看文章 扫描二维码
随时随地手机看文章

PIC与485的通讯源程序

#include "HardwareProfile.h" 


//Configure bits 
    __CONFIG( HS & WDTDIS & PWRTDIS & BORDIS & LVPDIS );


void Board_Init(void); 
#if defined(PIC_USE_HC595) 
bit b_Reflash; 
#endif 
#if defined(PIC_USE_KB) 
#define Free        1 
#define Press        0 
bit b_KeyActive; 
bit b_KeyPress; 
bit b_KeyState; 
BYTE u_KeyValue; 
BYTE u_SCANACC
BYTE i_KeyValueBuffer[2]; 
#endif 

BYTE u_10ms_Acc = 0; 
BYTE u_50ms_Acc = 0; 
BYTE u_100ms_Acc = 0; 
BYTE u_200ms_Acc = 0; 
WORD i_500ms_Acc = 0; 
WORD i_1s_Acc = 0; 
BYTE u_frame = 0; 
WORD i_ADC; 

void interrupt ISR(void) 

    if(T0IF) 
    { 
        T0IF = 0; 
        TMR0 = 0x0a;            //定时1ms 
        u_10ms_Acc ++; 
        u_50ms_Acc ++; 
        u_100ms_Acc ++; 
        u_200ms_Acc ++; 
        i_500ms_Acc ++; 
        i_1s_Acc ++; 
#if defined(PIC_USE_HC595) 
        b_Reflash = 1; 
#endif 
        if(u_10ms_Acc >= 10) 
        { 
            u_10ms_Acc = 0; 
            //在下面增加自己的任务,每10ms执行一次 
        } 
        if(u_50ms_Acc >= 50) 
        { 
            u_50ms_Acc = 0; 
            //在下面增加自己的任务,每50ms执行一次 
#if defined(PIC_USE_KB) 
            ADIF = 0; 
            ADGO = 1; 
#endif 
        } 
        if(u_100ms_Acc >= 100) 
        { 
            u_100ms_Acc = 0; 
            //在下面增加自己的任务,每100ms执行一次 
        } 
        if(u_200ms_Acc >= 200) 
        { 
            u_200ms_Acc = 0; 
            //在下面增加自己的任务,每200ms执行一次 
        } 
        if(i_500ms_Acc >= 500) 
        { 
            i_500ms_Acc = 0; 
            //在下面增加自己的任务,每500ms执行一次 
        } 
    } 
    if(ADIF) 
    { 
        ADIF = 0; 
#if defined(PIC_USE_KB) 
        if( ADRESH != 0 )         
        { 
            b_KeyPress = 1;    //有按键被按下 
            i_ADC = ADRESH; 
            i_ADC = i_ADC << 8; 
            i_ADC = i_ADC | ADRESL; 
            i_ADC = i_ADC & 0xfff8l; 
            i_ADC = i_ADC >> 2; 
        } 
        else 
        { 
            b_KeyState = Free;    //没按键被按下 
            b_KeyPress = 0; 
            LED_IO = 0x00; 
        } 
#endif 
    if(TXIF && TXEN) 
    { 
        TXIF = 0; 
    } 
    } 


void main() 

    Board_Init(); 
while(1) 


#if defined(PIC_USE_HC595) 
    if(b_Reflash) 
    { 
        LED_Reflash(); 
        b_Reflash = 0; 
    } 
#endif 


    if(BUTTON1_IO == 0) 
    { 
        DisplayNumber_Process(8888); 
    } 
    if(BUTTON2_IO == 0) 
    { 
        DisplayNumber_Process(0); 
    } 


#if defined(PIC_USE_RS485) 
    if(RCIF) 
    { 
        LED0_IO = LED0_IO ^ 1; 
        DisplayNumber_Process( RS485_RW() ); 
    } 
#endif 




///////////////////////////////////////////////////////////////// 
//Function void Board_Init(void) 
//Input: 
//        NULL 
//Output: 
//        NULL 
//Overview: 根据实际应用初始化板子上各设备 
//         
void Board_Init(void) 

    BUTTON1_TRIS = 1; 
    BUTTON2_TRIS = 1; 
    LED_TRIS = 0; 
    LED_IO = 0x01; 
    TMR0_Init(); 
    #if defined(PIC_USE_HC595) 
        HC595_Init(); 
    #endif 

    #if defined(PIC_USE_LCD12864) 
        LCD_Init(); 
    #endif 

    #if defined(PIC_USE_ISD1700) 
        ISD1700_Init(); 
    #endif 

    #if defined(PIC_USE_KB) 
        KeyBoard_Init(); 
    #endif 

    #if defined(PIC_USE_RS485) 
        RS485_Init(); 
    #endif 
}


#include
#include "HardwareProfile.h"
#if defined(PIC_USE_RS485)


void RS485_Init(void)
{
 RS485_DIR_IO = Receive;
 RS485_DIR_TRIS = 0;
 RS485_RX_TRIS = 1;
 RS485_TX_TRIS = 0;
/* SPBRG = DIVIDER;
 RCSTA = (NINE_BITS|0x90);
 TXSTA = (SPEED|NINE_BITS|0x20);*/
 //SPBRG=25;        //波特率为 9600       Baud Rate = Fosc/(16*(SPBRG+1))
 SPBRG=64;
 BRGH=1;          //高速波特率使能位
 TXEN=1;          //发送允许
 CREN=1;          //连续接收选择位
 SPEN=1;          //串行口使能位
 TXIE=0;  
 RCIE=0;          //接收中断使能开启
 TXIF=0;
 RCIF=0;
 PEIE=1;
 GIE=1;
}

void RS485_Putch(BYTE byte)
{

 /* output one byte */
 while(!TXIF) /* set when register is empty */
  continue;
 RS485_DIR_IO = Send;
 TXREG = byte;
 while(!TRMT) /* set when register is empty */
  ;
 RS485_DIR_IO = Receive;
}

BYTE RS485_Getch(void)
{
 /* retrieve one byte */
 while(!RCIF) /* set when register is not empty */
  continue;
 RCIF = 0;
 return RCREG;
}

BYTE RS485_RW(void)
{
 BYTE temp;
 RS485_Putch(temp = RS485_Getch());
 return temp;
}

#endif


关键字:PIC  通讯源程序 引用地址:PIC与485的通讯源程序

上一篇:PIC16C74单片机显示程序
下一篇:单片机控制的电动自行车驱动系统

推荐阅读最新更新时间:2024-03-16 15:48

Microchip推出全新低成本PIC32MX1/2/5系列32位单片机
最新PIC32MX1/2/5系列专为低成本应用设计,广泛适用于数字音频、蓝牙®、工业连接、USB和通用嵌入式控制等领域。 全球领先的整合单片机、混合信号、模拟器件和闪存专利解决方案的供应商——Microchip Technology Inc.(美国微芯科技公司)近日宣布推出全新低成本、高引脚数的32位PIC32单片机(MCU)系列产品。最新的PIC32MX1/2/5系列MCU结合了Microchip现有PICM32MX1/2与PIC32MX5系列MCU的主要特点,使得设计人员能够通过丰富的外设组合开发各类成本敏感型应用,这类应用往往需要以较低的成本实现复杂的代码和高度的功能集成。 全新PIC32MX1/
[单片机]
PIC单片机引脚中断程序设计技巧
所有的中档系列PIC单片机,PORTB端口最高的4个引脚(RB7~RB4)在设为输入模式时,当输入电平由高到低或由低到高发生变化时,可以让单片机产生中断。这就是通常所说的引脚状态变化中断。 在设计引脚中断程序时,有三个需要特别注意的地方。一是,在清除P0RTB中断标志位RBIF之前,必须安排一条必不可少的,以PORTB端口数据寄存器PORTB为源寄存器的读操作指令。放置这一指令的目的有时并不只是为了读取有用的数据,而是为了取消状态变化的硬件信号,以便顺利清除RBIF标志位,为下一次中断做好准备。二是,由于端口PORTB是引脚电子变化中断,即无论引脚出现上升沿还是下降沿都会产生中断请求,所以必须处理好不需要的虚假中断。三是,
[单片机]
基于PIC18F系列单片机的嵌入式系统设计
前 言 嵌入式系统是指以应用为中心,以计算机技术为基础,软、硬件可裁剪,适应应用系统对功能、体积、成本、可靠性、功耗严格要求的专用计算机系统。嵌入式系统是面向应用的,系统的硬件选型和软件开发模式都必须根据具体的应用确定。 永磁无刷直流电动机是电机控制研究领域的热点之一,这与其自身固有的技术优势密切相关:以电子换相取代了有刷直流电动机的机械换相。从根本上革除了普通有刷直流电动机由于电刷换相带来的火花、噪音、高故障率等一系列问题,同时又使系统的性能能够与普通有刷直流电动机相媲美,因此得到了广泛的应用。永磁无刷直流电动机的电子换相离不开电机的转子位置信号,传统的方法是采用霍尔器件或其他位置传感器检测位置信号,这使得系统的维护和制
[嵌入式]
PIC单片机引脚中断程序的设计技巧
1 简 述 所有的中档系列PIC单片机,PORTB端口最高的4个引脚(RB7"RB4)在设为输入模式时,当输入电平由高到低或由低到高发生变化时,可以让单片机产生中断。这就是通常所说的引脚状态变化中断。 在设计引脚中断程序时,有三个需要特别注意的地方。一是,在清除P0RTB中断标志位RBIF之前,必须安排一条必不可少的,以PORTB端口数据寄存器PORTB为源寄存器的读操作指令。放置这一指令的目的有时并不只是为了读取有用的数据,而是为了取消状态变化的硬件信号,以便顺利清除RBIF标志位,为下一次中断做好准备。二是,由于端口PORTB是引脚电子变化中断,即无论引脚出现上升沿还是下降沿都会产生中断请求,所以必须处理好不需要的虚假
[单片机]
PIC16位单片机CAN(1)新建工程测试
昨天焊接了硬件,硬件没有什么问题。起初使用最新的集成开发环境MPLAB X IDE v1.41,XC16编译器。但是新建简单的工程都不行,找不到KIT3。只好放弃。还是使用MPLAB IDE v8.88集成开发环境吧,依然是XC16编译器。 由MPLAB IDE v8.88的工程向导新建一个工程。选择单片机和编译器之后开始写一个IO口程序控制LED看看有没有硬伤。好久不用PIC了,都忘了怎么使用了。 1:添加相应的头文件 2:写配置位(时钟,仿真口等) 3:写测试程序。 总是忘了写配置位,根据文档写完配置位之后LED终于点亮了!! #include p33EP32GP502.h _FICD(ICS_PGD
[单片机]
RS485/422中继器在实际应用中的具体方案
中继器能延长RS485通讯距离5000M RS-485网络的规范之一是1.2公里长度,32个节点数。如果超出了这个限制,那么必须采用RS-485中继器或集线器来拓展传输距离或节点数。 通过利用RS-485中继器或集线器,可以将一个大型485网络分隔成若干个网段。RS-485中继器或集线器就如同RS-485网段之间连接的"桥梁"。通过“桥梁”的扩展来达到更远的通讯距离和连接更多的节点数。 为什么485总线要采用手拉手结构,而不能采用星形结构? 因为星形结构会产生反射信号,从而影响到RS-485通信。总线到每个终端设备的分支线长度应尽量短,一般不要超出5米。分支线如果没有接终端,会有反射信号,对通讯产生较强的干扰,应将
[嵌入式]
波特率自适应的RS485中继器设计
引 言 RS-485收发器采用平衡发送和差分接收,因此具有抑制共模干扰的能力;加上接收用具有高灵敏度,能检测低达200 mV的电压,故传输信号能在千米以外得到恢复。使用RS-485总线,一对双绞线就能实现多站联网,构成分布式系统,且设备简单、价格低廉,能进行长间隔通讯,因而得到了广泛的应用。由于在双绞线上的电平损耗,RS-485标准通讯的最大传输间隔是1 200 m,因此更远间隔的应用中必须使用中继器。网络节点数与所选芯片驱动能力和接收器的输进阻抗有关。RS-485标准规定了最大总线负载为32个单位负载,若应用中总线负载大于32个单位负载则必须使用中继器。 1 RS-485中继器原理 RS-485是半双工方式,两线双向传送
[嵌入式]
PIC实现激光打标设备测控系统的研究与设计
l 引 言 激光是一种与普通光源截然不同的相干光源,由于具有高方向性、高单色性和高能量的特点,自20世纪60年代初出现以来,就备受关注。激光打标系统包括激光打标机、工作台和外部水冷系统3大部分。激光打标机由控制柜和激光打标头组成,并通过系统控制线相连;控制柜包括激光电源、RF、射频驱动器、控制计算机、显示器、主控制板和激光冷却系统。当今激光光刻系统市场,YAG激光打标机在激光标刻系统中占据着绝对统治地位,而YAG激光器都是以氪灯或氙灯来泵浦的。性能良好,工作稳定的激光冷却系统对于YAG激光器尤为重要。 2系统结构原理 冷却系统中冷却的对象是氪灯,被安置在冷却腔体内,该器件价格昂贵,占设备成本的比例很高。不完善的冷却系统设计时
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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