历史上的今天
返回首页

历史上的今天

今天是:2025年01月08日(星期三)

正在发生

2018年01月08日 | 多机通信的从机程序

2018-01-08 来源:eefocus

/* multi_s.c */ 
/* 多机通信的从机部分 */ 
#ifndef __MULTI_S_C__ 
#define __MULTI_S_C__ 

#include  
#include  

#define __MAX_LEN_ 64    // 数据最大长度 

#define _MHz_ 11    // 设置 单片机 使用的晶振频率(11.0592MHz) 

/* 以下为程序协议中使用的握手信号 */ 
#define __SUCC_ 0x0f    // 数据传送成功 
#define __ERR_ 0xf0    // 数据传送错误 

void init_serial();    // 串口初始化 
unsigned char recv_data(unsigned char *buf);    // 接收数据 
void Beep_ok();    // 蜂鸣表示数据接收ok,该函数代码未给出 

void main() 

    char buf[__MAX_LEN_]; 
    unsigned char i = 0; 
    unsigned char tmp = 0xff; 
    unsigned char addr;    // 保存本机地址 

    /* 从P1口读取本机地址 */ 
    P1 = 0xff; 
    addr = P1; 
     
    /* 串口初始化 */ 
    init_serial();    // 初始化串口 
    EA = 0;    // 关闭所有中断 

    /* 进入设备应答阶段 */ 
    while(1) 
    { 
        SM2 = 1;    // 只接收地址帧 
        /* 如果接收到的地址帧不是本机地址,则继续等待 */ 
        tmp = addr-1; 
        while(tmp != addr) 
        { 
            RI = 0; 
            while(!RI); 
            tmp = SBUF; 
            RI = 0; 
        } 
        /* 发送应答信号,并做好接收数据的准备 */ 
        TI = 0; 
        TB8 = 0;    // 主机不检测该位 
        SBUF = addr; 
        while(!TI); 
        TI = 0; 
        SM2 = 0;    // 允许接收数据信息 
        /* 数据接收 */ 
        tmp = 0xff; 
        while(tmp == 0xff)    // 如果数据校验失败则重新接收数据 
        { 
            tmp = recv_data(buf);    // 校验失败返回0xff,检测到地址帧则返回0xfe,接收成功则返回0 
        } 
        if(tmp == 0xfe)    // 在数据接收过程中,如果发现地址帧,则重新开始整个接收过程 
            continue; 
        Beep_ok();    // 蜂鸣表示数据接收成功     
    } 


/* 初始化串口 */ 
void init_serial() 

    TMOD = 0x20;    //定时器T1使用工作方式2 
    TH1 = 250;    // 设置初值 
    TL1 = 250; 
    TR1 = 1;    // 开始计时 
    PCON = 0x80;    // SMOD = 1 
    SCON = 0xd0;    //工作方式3,9位数据位,波特率9600bps,允许接收 


/* 接收数据,注意该函数使用buf指向的缓冲区保存数据,在数据末尾使用’\0’表示数据结束 
 * 返回值为0,数据校验成功,返回值为0xfe,接受过程中接收到地址帧,返回值为0xff,数据校验失败   
 */ 
unsigned char recv_data(unsigned char *buf) 

    unsigned char len;    // 该字节用于保存数据长度 
    unsigned char ecc;    // 该字节用于保存校验字节 
    unsigned char i,tmp; 
    /* 接收数据长度 */ 
    RI = 0; 
    while(!RI); 
    if(RB8 == 1)    // 若当前接收为地址帧则返回0xfe 
        return 0xfe; 
    len = SBUF; 
    RI = 0; 
    /* 使用len的值为校验字节ecc赋初值 */ 
    ecc = len; 
    /* 接收数据 */ 
    for(i=0; i    { 
        while(!RI); 
        if(RB8 == 1)    // 若当前接收为地址帧则返回0xfe 
            return 0xfe;         
        *buf = SBUF;    // 接收数据 
        ecc = ecc^(*buf);    // 进行字节校验 
        RI = 0; 
        buf++; 
    } 
    *buf = 0;    // 表示数据结束 
    /* 接收校验字节 */ 
    while(!RI); 
    if(RB8 == 1)    // 若当前接收为地址帧则返回0xfe 
        return 0xfe; 
    tmp = SBUF; 
    RI = 0; 
    /* 进行数据校验 */ 
    ecc = tmp^ecc; 
    if(ecc != 0)    // 校验失败 
    { 
        *(buf-len) = 0;    // 清空数据缓冲区 
        TI = 0;    // 发送校验失败信号 
        TB8 = 0; 
        SBUF = __ERR_; 
        while(!TI); 
        TI = 0; 
        return 0xff;    // 返回0xff表示校验错误 
    } 
    TI = 0;    // 校验成功 
    TB8 = 0; 
    SBUF = __SUCC_; 
    while(!TI); 
    TI = 0; 
    return 0;    // 校验成功,返回0 


#endif


推荐阅读

史海拾趣

Deutsch公司的发展小趣事

在竞争激烈的电子行业中,品质控制和品牌建设至关重要。Deutsch公司深知这一点,因此始终将品质控制和品牌建设作为公司的重要任务。公司建立了严格的质量管理体系,确保产品的每一个细节都符合高标准。同时,通过精心策划的品牌推广活动,Deutsch公司的品牌形象逐渐深入人心。这些努力不仅提升了公司的市场地位,也增强了客户对公司的忠诚度。

Dynachip Corp公司的发展小趣事

Dynachip Corp公司成立于21世纪初,最初是由几位在半导体领域有深厚背景的科学家和工程师共同创立的。他们在大学实验室里共同研发出了一种新型的芯片技术,这种技术具有更高的集成度和更低的能耗。凭借这一创新技术,Dynachip Corp公司正式成立,并开始了从实验室到市场的转化过程。他们积极与投资者接洽,筹集资金,并建立了生产线,将这一技术转化为实际产品。

CWIND公司的发展小趣事

在电子行业的早期阶段,CWIND公司以其卓越的技术研发能力脱颖而出。公司创始人张先生带领一支由资深工程师组成的团队,针对当时市场上电子产品普遍存在的功耗高、性能不稳定等问题,进行了深入研究。经过数月的努力,他们成功研发出了一款低功耗、高性能的芯片,这款芯片在市场上迅速获得了认可,为CWIND公司打开了市场的大门。随着技术的不断迭代和更新,CWIND逐渐在电子行业中建立了自己的技术壁垒。

DeLorme公司的发展小趣事

DeLorme公司成立于20世纪80年代初,当时正值全球定位系统(GPS)技术快速发展的时期。创始人XXX和XXX看到了GPS技术在户外导航领域的巨大潜力,于是决定投身这一领域。然而,创业初期他们面临了资金短缺、技术瓶颈和市场接受度低等多重挑战。他们通过不断的技术创新、优化产品设计和积极的市场推广,逐渐赢得了消费者的认可,并在行业内树立了良好的口碑。

GS Yuasa Battery Sales UK Ltd.公司的发展小趣事

进入21世纪后,DeLorme公司凭借其在GPS技术领域的深厚积累,不断推出具有创新性的产品。其中,一款集成了GPS、电子罗盘和高度计等多功能的户外导航设备在市场上引起了广泛关注。这款产品不仅具有高精度、高可靠性的特点,还具备了用户友好的界面设计和人性化的操作体验。通过这款产品,DeLorme公司进一步巩固了其在户外导航领域的领先地位。

FTCAP Fischer & Tausche Capacitor Group公司的发展小趣事

近年来,随着智能手机和移动互联网技术的快速发展,传统的GPS导航设备市场受到了巨大冲击。面对这一行业变革,DeLorme公司及时调整战略方向,将重心转向智能导航应用软件的开发和推广。他们通过与智能手机厂商的合作,将自己的导航软件集成到手机系统中,为用户提供更加便捷、高效的导航服务。同时,他们还积极探索新的商业模式和市场机会,为公司的未来发展奠定了坚实基础。

问答坊 | AI 解惑

谁有 ACD资料

谁有ACD 资料啊…

查看全部问答>

IGBT短路失效机理

IGBT负载短路下的几种后果 (1) 超过热极限:半导体的本征温度极限为250℃,当结温超过本征温度,器件将丧失阻断能力,IGBT负载短路时,由于短路电流时结温升高,一旦超过其热极限时,门级保护也相应失效. (2) 电流擎住效应:正常工作电流下,IGBT由于薄 ...…

查看全部问答>

无线信号 高手进

我在这招了半天也莫有找到我要的答案,发个帖看看有没有高手给我支支招。 关于无线信号如何检测的问题,方法越具体越多越好。。。用示波器的话说明具体的用法。我琢磨很久了,奈何能力有限。。。…

查看全部问答>

proteus 的键盘在哪

单个的键(不是开关) 和 矩阵键盘…

查看全部问答>

条码手持终端应用程序开发!!!

条码手持终端应用程序开发!!! 本人在条码行业有多年的工作经验,一直从事条码手持终端应用程序的开发 开发过多种设备: CASIO DT900,DT300,DTX10; Cipher 711 ; SYMBOL MC50,MC1000,PPT8800; Intermec 700系列 有需要的请联系本人 QQ:6 ...…

查看全部问答>

急!!!如何在PC机上实现对单片机的控制(用VC++6.0编程)

小弟正在想弄一个在PC机上实现对单片机的控制,但不知道从哪个方面入手? 希望各位达人给予小弟一些指点.发个程序给小弟参考参考(用C语言编写的)…

查看全部问答>

正式入手STM8S103K3

经历了很多推销的宣传,今天买了10片样品,准备把以前ATMEL8的东西都移植过来. 有几个问题,一直没搞明白: 1. STM8S103K3会不会象ATMEL那样,1000元就能把代码都读出来?STM8S103K3的     解密难度有多大? 2. 以前一直用ICC和KEIL开 ...…

查看全部问答>

2812程序烧到片内flash中运行,能否用CCS和仿真器观察内部变量

2812程序烧到片内flash中运行,能否用CCS和仿真器观察内部变量, 调试电机程序,使用仿真器容易跑飞,希望能烧到flash中运行,同时也希望能像在ccs里仿真一样观察几个关键变量,听有的工程师说是能实现的,希望有能得到指点?…

查看全部问答>

用io口控制k9k8G08U0A写不进去数(急)

这是个试验程序,就是把整页写入同一个数据,,另外ID什么都可以读出来,,个人感觉数据是可以读出来的,,但读出来的全是FF,2112个FF后是64个0x15,我把读命令改错的话,读出来的是那个输入的数据,说明内部没把数据读出来,这是不是说明FF读出来 ...…

查看全部问答>

有源电力滤波器的控制技术的实现

在整个APF中基准电流的产生方法是核心环节,只有产生正确的基准电流信号才能很好的补偿谐波和无功电流。当只是补偿谐波电流时只需获取负载电流中的谐波分量即可,当补偿谐波及无功时除了要获取谐波电流信号外还需获取基波电流中的无功分量。基准电 ...…

查看全部问答>