




已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
51单片机实现的485通讯程序#ifndef _485_C_#define _485_C_#include #include #define unsigned char uchar#define unsigned int uint/* 通信命令 */#define _ACTIVE_ 0x01 / 主机询问从机是否存在#define _GETDATA_ 0x02 / 主机发送读设备请求#define _OK_ 0x03 / 从机应答#define _STATUS_ 0x04 / 从机发送设备状态信息#define _MAXSIZE 0x08 / 缓冲区长度#define _ERRLEN 12 / 任何通信帧长度超过12则表示出错uchar dbuf_MAXSIZE; / 该缓冲区用于保存设备状态信息uchar dev; / 该字节用于保存本机设备号sbit M_DE = P10; / 驱动器使能,1有效sbit M_RE = P11; / 接收器使能,0有效void get_status(); / 调用该函数获得设备状态信息,函数代码未给出void send_data(uchar type, uchar len, uchar *buf); / 发送数据帧bit recv_cmd(uchar *type); / 接收主机命令,主机请求仅包含命令信息void send_byte(uchar da); / 该函数发送一帧数据中的一个字节,由send_data()函数调用void main()uchar type;uchar len;/* 系统初始化 */P1 = 0xff; / 读取本机设备号dev = (P12);TMOD = 0x20; / 定时器T1使用工作方式2TH1 = 250; / 设置初值TL1 = 250;TR1 = 1; / 开始计时PCON = 0x80; / SMOD = 1SCON = 0x50; / 工作方式1,波特率9600bps,允许接收ES = 0; / 关闭串口中断IT0 = 0; / 外部中断0使用电平触发模式EX0 = 1; / 开启外部中断0EA = 1; / 开启中断/* 主程序流程 */while(1) / 主循环 if(recv_cmd(&type) = 0) / 发生帧错误或帧地址与本机地址不符,丢弃当前帧后返回 continue; switch(type) case _ACTIVE_: / 主机询问从机是否存在 send_data(_OK_, 0, dbuf); / 发送应答信息,这里buf的内容并未用到 break; case _GETDATA_: len = strlen(dbuf); send_data(_STATUS_, len, dbuf); / 发送设备状态信息 break; default: break; / 命令类型错误,丢弃当前帧后返回 void READSTATUS() interrupt 0 using 1 / 产生外部中断0时表示设备状态发生改变,该函数使用寄存器组1get_status(); / 获得设备状态信息,并将其存入dbuf指向的存储区,数据最后一字节置0表示数据结束/* 该函数接收一帧数据并进行检测,无论该帧是否错误,函数均会返回* 函数参数type保存接收到的命令字* 当接收到数据帧错误或其地址位不为0时(非主机发送帧),函数返回0,反之返回1*/bit recv_cmd(uchar *type)bit db = 0; / 当接收到的上一个字节为0xdb时,该位置位bit c0 = 0; / 当接收到的上一个字节为0xc0时,该位置位uchar data_buf_ERRLEN; / 保存接收到的帧uchar tmp;uchar ecc = 0;uchar i;M_DE = 0; / 置发送禁止,接收允许M_RE = 0;/* 接收一帧数据 */i = 0;while(!c0) / 循环直至帧接收完毕 RI = 0; while(!RI); tmp = SBUF; RI = 0; if(db = 1) / 接收到的上一个字节为0xdb switch(tmp) case 0xdd: data_bufi = 0xdb; / 0xdbdd表示0xdb ecc = ecc0xdb; db = 0; break; case 0xdc data_bufi = 0xc0; / 0xdbdc表示0xc0 ecc = ecc0xc0; db = 0; break; default return 0; / 帧错误,返回 i+; switch(tmp) / 正常情况 case 0xc0: / 帧结束 c0 = 1; break; case 0xdb: / 检测到转义字符 db = 1; break; default: / 普通数据 data_bufi = tmp; / 保存数据 ecc = ecctmp; / 计算校验字节 i+; if(i = _ERRLEN) / 帧超长,错误,返回 return 0;/* 判断帧是否错误 */if(i4) / 帧过短,错误,返回 return 0;if(ecc != 0) / 校验错误,返回 return 0;if(data_buf0 != dev) / 非访问本机命令,错误,返回 return 0;*type = data_buf1; / 获得命令字return 1; / 函数成功返回/* 该函数发送一帧数据帧,参数type为命令字、len为数据长度、buf为要发送的数据内容 */void send_data(uchar type, uchar len, uchar *buf)uchar i;uchar ecc = 0; / 该字节用于保存校验字节M_DE = 1; / 置发送允许,接收禁止M_RE = 1;send_byte(dev); / 发送本机地址ecc = dev;send_byte(type); / 发送命令字ecc = ecctype;send_byte(len); / 发送长度ecc = ecclen;for(i=0; ilen; i+) / 发送数据 send_byte(*buf); ecc = ecc(*buf); buf+;send_byte(ecc); / 发送校验字节TI = 0; / 发送帧结束标志SBUF = 0xc0;while(!TI);TI = 0;/* 该函数发送一个数据字节,若该字节为0xdb,则发送0xdbdd,若该字节为0xc0则,发送0xdbdc */void send_byte(uchar da)switch(da) case 0xdb: / 字节为0xdb,发送0xdbdd TI = 0; SBUF = 0xdb; while(!TI); TI = 0; SBUF = 0xdd; while(!TI) TI = 0; break; case 0xc0: / 字节为0xc0,发送0xdbdc TI = 0; SBUF = 0xdb; while(!TI); TI = 0; SBUF = 0xdc; while(!TI) TI = 0; break; default: / 普通数据则直接发送 TI = 0; SBUF = da; while(!TI); TI = 0;#endifRS-232接口实现计算机和单片机通信程序作者:佚名来源:本站原创点击数:更新时间:2008年07月10日 【字体:大 中 小】/此程序通过RS-232接口来完成计算机和单片机通信(程序已用p18f458试验板上调试通过)/程序的调试可以用串口调试助手V2.1辅助完成,此程序可在 下载/此程序首先发送测试数据55H,再通过中断实现数据的接收和发送#includep18f458.hvoidInterruptHandlerHigh(void);/初始化程序voidinitial()SPBRG=0X19;/选择传输波特率为9600bpsTXSTA=0X04;/选择异步高速方式传输8位数据RCSTA=0X80;/允许同步串行口工作TRISC=0X80;/将RC7,RC6设置为输入,断绝与外接电路的连接TXSTAbits.TXEN=1;/发送允许RCSTAbits.CREN=1;/接受数据允许PIE1bits.RCIE=1;/接收中断使能INTCON=0XC0;/总中断和外围中断允许/高优先级中断向量#pragma code InterruptVectorHigh=0x08voidInterruptVectorHigh (void) _asm goto InterruptHandlerHigh /跳到中断程 _endasm/高优先级中断服务程序#pragma code#pragma interrupt InterruptHandlerHighvoidInterruptHandlerHigh ()while(PIR1bits.RCIF=1)/若接收中断标志不为1,则为误操作,返回TXREG=RCREG;/将接收到的数据放入发送寄存器,并启动发送 /主程序main()initial();/系统初始化TXREG=0X55;/发送数据55H进行测试for(;);-汇编语言版本的RS-232接口实现计算机和单片机通信程序-;此程序通过RS-232接口来完成计算机和单片机通讯(程序以在p18f458试验板上调通);本单片机程序由提供;此程序首先发送测试数据55H,再通过中断实现数据的接收和发送;程序的调试可以用串口调试助手V2.1辅助完成LIST P=18f458 INCLUDE P18f458.INCORG0x00GOTOMAINORG0x08GOTOINTSERVEORG0X30;*中断服务子程序*INTSERVEBTFSSPIR1,RCIF;接收中断标志为1?GOTOERR_RE;误操作,返回 MOVFRCREG,0;否则,将接收到的数据通过W寄存器MOVWFTXREG ;放入发送寄存器,并启动发送 ERR_RENOPRETFIE;*初始化程序*INITIALNOP MOVLW0X19;选择传输波特率为9600bps MOVWFSPBRG MOVLW0X04;选择异步高速方式传输8位数据 MOVWFTXSTA MOVLW0X80;允许同步串行口工作 MOVWFRCSTA MOVLW0X80;将RC7,RC6设置为输入,断绝与外接电路的连接 MOVWFTRISCBSFTXSTA,TXEN;发送允许BSFRCSTA,CREN;接受数据允许BSF PIE1,RCIE;接收中断使能MOVLW0XC0;总中断和外围中断允许MOVWFINTCONRETURN;*主程序* MAIN NOP CLRWDTCALLINITIAL MOVLW0X55;发送数据55H进行测试 MOVWFTXREGLOOP GOTOLOOP END两片51单片机互相通信的串行通信程序(一个发送程序,一个接收程序)2007-05-27 08:27;系统晶振是 11.0592 MHz;51单片机发送单片机程序;此程序用Proteus仿真通过;此程序在硬件上测试通过;2007-05-27;附有简化电路图;为了使初学者能看懂,程序与图尽可能的简单扼要;实验现象为,发送端的P1口的哪个键被接下,接收端的哪个灯对应着亮;如果把两个单片机的T和R通过无线模块(如基于MCP2120芯片的模块)来扩充,便可做成无线通信 ORG 0000H AJMP START ORG 0040HSTART: MOV SP,#60H MOV SCON,#50H ;串口 方式 1 MOV TMOD,#20H ;T1 方式2 MOV TL1,#0FDH ;波特率 9600 的常数 MOV TH1,#0FDH SETB TR1 mov r5,#00hWAIT: mov p1,#0ffh mov a ,p1 mov r5,a lcall delay ;读键盘,这里去抖动,还要加几句话 mov a ,p1 nop CJNE A,5,WAIT ;是否有键输入 MOV SBUF,a ;串口输出键盘输入的值 NOPSS: JBC TI,WAIT ;是否发送完毕 SJMP SSDELAY: ;延时子程序 PUSH 0 ;保存现场 PUSH 1 MOV 0,#06HDELAY1: MOV 1,#0H DJNZ 1,$ DJNZ 0,DELAY1 POP 1 ;恢复现场 POP 0 RET END;系统晶振是 11.0592 MHz;51单片机接收单片机程序;此程序用Proteus仿真通过;此程序在硬件上测试通过;2007-05-27;附有简化电路图;为了使初学者能看懂,程序与图尽可能的简单扼要;实验现象为,发送端的P1口的哪个键被接下,接收端的哪个灯对应着亮;如果把两个单片机的T和R通过无线模块(如基于MCP2120芯片的模块)来扩充,便可做成无线通信 ORG 0000H AJMP START ORG 0040HSTART: MOV SCON,#50H ;串口 方式 1 MOV TMOD,#20H ;T1 方式 2 MOV TL1,#0FDH ;波特率 9600 的常数 MOV TH1,#0FDH SETB TR1 WAIT: JBC RI,DIS_REC ;是否接收到数据 sjmp waitDIS_REC: MOV A,SBUF ;读串口接收到的数据 mov p1,a SJMP wait end51单片机串行口通信程序设计例子时间:2009-03-06 17:13来源:未知 作者:牛牛 点击: 768次串行口方式0应用编程 8051单片机串行口方式0为移位寄存器方式,外接一个串入并出的移位寄存器,就能扩展一个并行口。 单片机串行口通信程序设计硬件连接图 例:用8051单片机串行口外接CD4094扩展8位并行输出口,如图所示,8位并行口的各位都接一个发光二极管 串行口方式0应用编程 8051单片机串行口方式0为移位寄存器方式,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025贵州安顺市紫云苗族布依族自治县利源融资担保有限责任公司招聘1人模拟试卷及答案详解(夺冠)
- 2025年湖南娄底市城市发展控股集团有限公司外派人员选聘模拟试卷附答案详解(突破训练)
- 2025广西河池市教师招聘中小学幼儿园教师565人考前自测高频考点模拟试题及答案详解(必刷)
- 2025安徽安庆职业技术学院招聘33人考前自测高频考点模拟试题及答案详解(新)
- 2025河南新乡市碳汇计量检测中心招聘模拟试卷及答案详解(典优)
- 2025黑龙江鸡西市中级人民法院招聘临时聘用人员2人考前自测高频考点模拟试题及答案详解(网校专用)
- 2025北京市高校毕业生到农村从事支农工作招聘473人模拟试卷及答案详解(各地真题)
- 2025北京华商电力产业发展有限公司2025年搞笑毕业生招聘29人(第三批)考前自测高频考点模拟试题带答案详解
- 2025安徽合力股份有限公司校园招聘考前自测高频考点模拟试题附答案详解
- 2025贵州机电职业技术学院第十三届贵州人才博览会引进人才15人模拟试卷附答案详解(典型题)
- 小学科学教学仪器配备标准
- 中医护理技术的质量与安全管理
- 证据法学-证明标准课件
- 质量管理程序文件汇总
- (完整版)高考英语考纲3500词汇表
- 国家开放大学电大《课程与教学论》形考任务3试题及答案
- 商务英语口语900句
- 辽宁省沈阳市基层诊所医疗机构卫生院社区卫生服务中心村卫生室名单目录信息
- 锅炉空预器清洗方案
- 药敏试验结果的解读
- DB14∕T 1319-2021 公路工程标准工程量清单及计量规范
评论
0/150
提交评论