历史上的今天
返回首页

历史上的今天

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

正在发生

2018年01月08日 | 多机通信的主机部分程序

2018-01-08 来源:eefocus

多机通信的主机部分程序

/* multi_m.c */ 
/* 多机通信的主机部分 */ 
#ifndef __MULTI_M_C__ 
#define __MULTI_M_C__ 

#include  
#include 

 

#define __MAX_LEN_ 64    // 数据最大长度 
#define _MHz_ 11    // 设置 单片机 使用的晶振频率(11.0592MHz) 

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

void init_serial();    // 串口初始化 
void send_data(unsigned char *buf);    // 发送数据 
void delay10ms(unsigned int count);    // 延时子程序(10ms) 

void main() 

    char buf[__MAX_LEN_]; 
    unsigned char i = 0; 
    unsigned char tmp; 
    unsigned char addr;    // 该字节用于保存要通信的从机地址 

    /* 为缓冲区赋初值 */ 
    P0 = 0xff; 
    while(P1 != 0)    // 每隔100ms从P0口读取,若读取到0则表明数据采集结束 
    { 
        *(buf+i) = P0; 
        delay10ms(10);    // 延时100ms 
        P0 = 0xff; 
        i++; 
    } 
    *(buf+i) = 0;    // 缓冲区最后一个字节为0表示数据结束 
    /* 读要访问的分机地址 */ 
    P0 = 0xff; 
    addr = P0; 
    /* 串口初始化 */ 
    init_serial();    // 初始化串口 
    EA = 0;    // 关闭所有中断 

    /* 发送地址帧并接收应答信息,如果接收的信号与发送的地址信息不同,则重新发送地址帧 */ 
    tmp = addr-1; 
    while(tmp != addr) 
    { 
        /* 发送从机地址 */ 
        TI = 0; 
        TB8 = 1;    // 发送地址帧 
        SBUF = addr; 
        while(!TI); 
        TI = 0; 
        /* 接收从机应答 */ 
        RI = 0; 
        while(!RI); 
        tmp = SBUF; 
        RI = 0; 
    } 
    /* 发送数据并接收校验信息,如果接收的信号为0FH,表示从机接收成功,否则将重新发送该组数据 */ 
    tmp = __ERR_; 
    while(tmp != __SUCC_) 
    { 
        send_data(buf);    // 发送数据 
        RI = 0; 
        while(!RI); 
        tmp = SBUF; 
        RI = 0; 
    } 
    while(1);    // 程序结束,进入死循环 


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

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


/* 发送数据 */ 
void send_data(unsigned char *buf) 

    unsigned char len;    // 保存数据长度 
    unsigned char ecc;    // 保存校验字节 
     
    len = strlen(buf);    // 计算要发送数据的长度 
    ecc = len;    // 开始进行校验字节计算 
    /* 发送数据长度 */ 
    TI = 0;     
    TB8 = 0;    // 发送数据帧 
    SBUF = len;    // 发送长度 
    while(!TI); 
    TI = 0; 
    /* 发送数据 */ 
    for(i=0; i    { 
        ecc = ecc^(*buf);    // 计算校验字节 
        TB8 = 0;    // 发送数据帧 
        SBUF = *buf;    // 发送数据 
        buf++; 
        while(!TI); 
        TI = 0; 
    } 
    /* 发送校验字节 */ 
    TB8 = 0;    // 发送数据帧 
    SBUF = ecc;    // 发送校验字节 
    while(!TI); 
    TI = 0; 


/* 延时10ms,精度较低,参数count为延时时间 */ 
void delay10ms(unsigned int count) 

    unsigned int i, k; 
    unsigned char j; 
    unsigned int tmp; 
    tmp = (int)((100*_MHZ_)/12); 

    for(i=0; i        for(j=0; j<100; j++) 
            for(k=0; k

#endif


推荐阅读

史海拾趣

昆泰(CHRONTEL)公司的发展小趣事

1987年,昆泰迈出了全球扩张的步伐,在伦敦开设了分支机构,开始服务于欧洲客户。此后,昆泰不断拓宽其业务领域,不仅局限于数据处理,还涉足药物研发、临床试验等多个领域。这一系列的举措使昆泰的业务范围迅速扩大,成为全球CRO行业的领军企业。

Equinox公司的发展小趣事

在稳步发展健身业务的同时,Equinox还在不断探索新的领域。例如,公司推出了精品酒店品牌Equinox Hotels,将健身与旅游相结合;同时,Equinox还积极进军健康食品、健康科技等领域,以实现多元化的发展战略。未来,Equinox将继续秉承“健康、活力、高品质”的品牌理念,为全球消费者提供更优质的服务和体验。

Diamond SA公司的发展小趣事

在电子行业的初期,Diamond SA公司以其卓越的技术研发能力脱颖而出。公司创始人对半导体技术的深入研究,引领了一场技术革命。他们成功开发出一种新型的芯片设计,大大提高了电子设备的性能和效率。这一创新技术迅速在市场上获得了认可,Diamond SA公司也因此逐渐崭露头角。

DCX-CHOL Enterprises公司的发展小趣事

随着公司规模的扩大和市场竞争的加剧,DCX-CHOL Enterprises意识到品质管理的重要性。公司投入大量资源提升生产线自动化水平,引进先进的品质检测设备,并建立了严格的质量管理体系。这些措施有效地提高了产品的品质稳定性和可靠性,赢得了客户的信赖。同时,公司还注重员工培训和技能提升,培养了一支高素质、专业化的技术和管理团队。

China Semiconductor Corp公司的发展小趣事

为了进一步提升竞争力,CSC开始着手进行产业链整合。公司通过与上下游企业的深度合作,形成了紧密的产业链协同关系。这不仅降低了生产成本,提高了生产效率,还使得CSC能够更好地把握市场动态和技术趋势,为公司的持续发展提供了有力保障。

All Sensors公司的发展小趣事

All Sensors公司的创始人Dennis被誉为美国硅谷的传奇人物。在70年代,Dennis在硅谷成功发明了全球第一颗压力传感器,这一创新不仅奠定了All Sensors在传感器领域的领先地位,也为整个电子行业带来了新的技术革命。这颗传感器的诞生,标志着All Sensors正式踏上了传感器技术的研发之路,为后续的发展奠定了坚实的基础。

问答坊 | AI 解惑

Simple socket server 例程 的调试问题

最近在用Cyclone III FPGA Development Kit 这个板子在调Simple Socket Sever这个例程,但是好多天了一直不能调通,网线没有问题,IP设置也没有问题,程序运行显示初始化也成功了,但是一直ping 不通 。希望有经验的朋友能给予一些指点,先谢谢了! ...…

查看全部问答>

嵌入式的软件什么样得较好

我用quartus ii ,但是软件功能受限制(网络版的),会出现许多莫名其妙得问题 哪位高手指点一下…

查看全部问答>

VS2005+CE60下调试程序怎么不能直接下载到NANDFLASH里面去(EVC+CE50可以)?必须加CSIDL_XXX这样的前缀?NANDFLASH这样加

VS2005+CE60下调试程序怎么不能直接下载到NANDFLASH里面去(EVC+CE50可以)?必须加CSIDL_XXX这样的前缀?NANDFLASH这样加前缀还是不行啊。…

查看全部问答>

[免费下载]一个PLC梯形图到C语言的转换工具,欢迎指正!

不知道有人用过PLC没有,这是我们开发的一个梯形图逻辑到C语言的转换器,对于一些纯粹的位逻辑控制算法,可能有些帮助。同时,网站上也有一些PLC的使用教程和开发资料,希望对大家有用。         项目介绍[http://www ...…

查看全部问答>

DM9000传输速率问题

目前用dm9000网卡做视频传输,遇到如下情况: 视频带宽30kb/s,发现传输一会后网卡就断网了,以后就连接不上了,除非硬件重启后才能恢复。 换用usb无线网卡没有出现这个问题,而且效果很好。 因此断定是dm9000网卡驱动的问题,请问是什么原因,是 ...…

查看全部问答>

如何读取连续内存中数据??

已知连续内存中分别存放的是几个不同的变量值,这些变量值时刻变化,如何将这些变量值读取出来呢?写到*.txt文件中。 如x存放在内存地址为0x08000002中,y在0x08000004中,z在0x08000006中,如何将x,y,z保存到test.txt文件中。…

查看全部问答>

VxWorks大侠看过来,谢谢~

大家好,我在使用tornado 2.2帮助时遇到了一个问题,想请教一下。 我在tornado界面下选择菜单“Help”—— >“Manuals index”,出现“Tornado online manuals”界面,在其tag上选择“Index”,输入要查找的内容“tffsDrv”,然后按下“Display” ...…

查看全部问答>

FPGA学习的一些误区

转载自网络,作者不详。 我常年担任多个有关FPGA学习研讨的QQ群管理员,长期以来很多新入群的菜鸟们总是在重复的 问一些非常简单但是又让新手困惑不解的问题。作为管理员经常要给这些菜鸟们普及基础知识,但是非常不幸的是很多菜鸟怀着一种浮躁的 ...…

查看全部问答>

请教, 精密整流电路问题

请教各位大侠,我的精密整流电路输出正负不对称, 当输入1V时,输约1.5V, 输入2V, 输出约为2.5V.输入负电压时, 输出与输入相等.  运放用的是 ADTL082A, 正负15V   二极管 SK101AW 不好意思, 图怎么贴不上去呀.…

查看全部问答>

【在线视频】飞凌S3C6410开发板学习指导视频第一季

本文转引自 飞凌嵌入式 OK6410资料专区    目前,ARM11开发板的开发学习教程逐渐丰富起来,但专门针对某块ARM11开发板的视频几乎没有。为了更好的让用户学会使用OK6410,我们准备了这套教学视频,力图使用户更快的入门,加快嵌入式学习 ...…

查看全部问答>