51单片机实现的485通讯程序_第1页
51单片机实现的485通讯程序_第2页
51单片机实现的485通讯程序_第3页
51单片机实现的485通讯程序_第4页
51单片机实现的485通讯程序_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、51单片机实现的485通讯程序#ifndef _485_C_#define _485_C_#include vreg51 h>#include vstring h>#define unsigned char uchar#define unsigned int uint/*通信命令*/#define _ACTIVE_ 0x01/主机询问从机是否存在#define _GETDATA_ 0x02/主机发送读设备请求#define _0K_ 0x03/ 从机应答#define _STATUS_ 0x04/从机发送设备状态信息#define _MAXSIZE 0x08/ 缓冲区长度#defi

2、ne _ERRLEN 12/任何通信帧长度超过 12则表示出错uchar dbuf_MAXSIZE; /该缓冲区用于保存设备状态信息 uchar dev; /该字节用于保存本机设备号sbit M_DE = P1A0;/驱动器使能,1有效sbit M_RE = P1A1;/接收器使能,0有效void get_status(); /调用该函数获得设备状态信息,函数代码未给出void send_data(uchar type, uchar len, uchar *buf); / 发送数据帧bit recv_cmd(uchar *type); /接收主机命令,主机请求仅包含命令信息void send_

3、byte(uchar da); /该函数发送一帧数据中的一个字节,由send_data(函数调用void main()uchar type;uchar len;/*系统初始化*/P1 = 0xff; /读取本机设备号dev = (P1>>2);TMOD = 0x20; /定时器T1使用工作方式2TH1 = 250;/设置初值TL1 = 250;TR1 = 1;/开始计时PCON = 0x80;/ SMOD = 1SCON = 0x50; /工作方式1,波特率9600bps,允许接收ES = 0;/关闭串口中断IT0 = 0;/外部中断0使用电平触发模式EX0 = 1;/开启外部中断

4、0EA = 1; II开启中断/*主程序流程*1while(1) II 主循环if(recv_cmd(&type) = 0) II发生帧错误或帧地址与本机地址不符,丢弃当前帧后返回continue;switch(type)case _ACTIVE_:II主机询问从机是否存在send_data(_0K_, 0, dbuf); II发送应答信息,这里 buf的内容并未用到break;case _GETDATA_:len = strlen(dbuf);send_data(_STATUS_, len, dbuf); II 发送设备状态信息break;default:令类型错误,丢弃当“”返回v

5、oid READSTATUS() interrupt 0 using 1 II产生外部中断0时表示设备状态发生改变,该函数使用寄存器组1get_status(); /获得设备状态信息,并将其存入 dbuf指向的存储区,数据最后一字节置0表示数据结束/*该函数接收一帧数据并进行检测,无论该帧是否错误,函数均会返回*函数参数type保存接收到的命令字*当接收到数据帧错误或其地址位不为0时(非主机发送帧),函数返回 0,反之返回1*/bit recv_cmd(uchar *type)bit db = 0; /当接收到的上一个字节为 0xdb时,该位置位bit c0 = 0; /当接收到的上一个字节为

6、 0xc0时,该位置位uchar data_buf_ERRLEN; / 保存接收至曲勺帧uchar tmp;uchar ecc = 0;uchar i;M_DE = 0;/置发送禁止,接收允许/*接收一帧数据*/i = 0;while(!c0) /循环直至帧接收完毕RI = 0;while(!RI);tmp = SBUF;RI = 0;if(db = 1)/接收到的上一个字节为 0xdbswitch(tmp)case 0xdd:data_bufi = 0xdb; / 0xdbdd 表示 0xdbecc = eccA0xdb;db = 0;break;case 0xdcdata_bufi = 0

7、xc0;/ 0xdbdc表示 0xc0ecc = eccA0xc0;db = 0;break;defaultreturn 0; II帧错误,返回i+;switch(tmp) II 正常情况case 0xc0:II帧结束c0 =1;break;case 0xdb:II检测到转义字符db = 1;break;default: II普通数据data_bufi=tmp; II保存数据ecc = eccAtmp; II计算校验字节i+;if(i = _ERRLEN) II帧超长,错误,返回return 0;/*判断帧是否错误*/if(i<4) II帧过短,错误,返回return 0;if(ecc

8、!= 0) II校验错误,返回return 0;if(data_buf0 != dev) II非访问本机命令,错误,返回return 0;*type = data_buf1; II 获得命令字return 1; II函数成功返回I*该函数发送一帧数据帧,参数type为命令字、len为数据长度、buf为要发送的数据内容*Ivoid send_data(uchar type, uchar len, uchar *buf)uchar i;uchar ecc = 0; II该字节用于保存校验字节M_DE = 1; II置发送允许,接收禁止M_RE = 1;send_byte(dev); II发送本机地

9、址ecc = dev;send_byte(type); / 发送命令字ecc = eccAtype;send_byte(len); / 发送长度ecc = eccA|en;for(i=0; ivlen; i+)/ 发送数据send_byte(*buf);ecc = eccA(*buf);buf+;send_byte(ecc); /发送校验字节TI = 0;/发送帧结束标志SBUF = 0xc0;while(!TI);TI = 0;/*该函数发送一个数据字节,若该字节为0xdb,则发送Oxdbdd,若该字节为0xc0则,发送Oxdbdc */void send_byte(uchar da)swi

10、tch(da)case 0xdb: II 字节为 0xdb,发送 OxdbddTI = 0;SBUF = 0xdb;while(!TI);TI = 0;SBUF = 0xdd;while(!TI)TI = 0;break;case 0xc0:/ 字节为 0xc0,发送 0xdbdcTI = 0;SBUF = 0xdb;while(!TI);TI = 0;SBUF = 0xdc;while(!TI)TI = 0;break;default: II普通数据则直接发送TI = 0;SBUF = da;while(!TI);TI = 0;#endifRS-232接口实现计算机和单片机通信程序作者:佚名

11、 来源:本站原创 点击数: 更新时间:2008年07月10日【字体:大中小51M多脸单片机学习开发系统include "p18f458h"下载:/www.Sqhei. comP1/此程序通过RS-232接口来完成计算机和单片机通信(程序已用f458试验板上调试通过)/程序的调试可以用"串口调试助手V2.1"辅助完成,此程序可在htt/此程序首先发送测试数据 55H,再通过中断头现数据的接收和发送oid InterruptHandlerHigh(void);/初始化程序oid initial()SPBRG=0X19;TXSTA=0X04;RCSTA=0X8

12、0;TRISC=0X80;/选择传输波特率为9600bps/选择异步咼速万式传输8位数据/允许同步串行口工作/将RC7,RC6设置为输入,断绝与外接电路的连接TXSTAbits.TXEN=1; / 发送允许RCSTAbits.CREN=1; / 接受数据允许PIE1bits.RCIE=1; /接收中断使能INTCON=0XC0; /总中断和外围中断允许/咼优先级中断向量pragma code lnterruptVectorHigh=0x08 oid InterruptVectorHigh (void)asm goto InterruptHandlerHigh II 跳到中断程endasm7高优

13、先级中断服务程序pragma code pragma interrupt InterruptHandlerHigh则为误操作,返,并启动发送oid InterruptHandlerHigh ()while(PIR1bitsRCIF=1) II若接收中断标志不为 1,TXREG=RCREG; II将接收到的数据放入发送寄存器7主程序ain()initial。;II系统初始化TXREG=0X55; II发送数据55H进行测试for(;); 汇编语言版本的 RS-232接口实现计 算机和单片机通信程序;此程序通过RS-232接口来完成计算机和单片机通讯 (程序以在pl f458试验板上调通);本单片

14、机程序由http:/www.51heicom提供;此程序首先发送测试数据55H,再通过中断实现数据的接收和发送;程序的调试可以用"串口调试助手V2.1"辅助完成LIST P=18f458INCLUDE "P18f458INC"ORG 0x00GOTO MAINORG 0x08GOTO INTSERVEORG 0X30*NTSERVEGOTO ERR REMOVF RCREG,MOVWF TXREGRR RE NOPRETFIE*NITIAL NOPMOVWF SPBRGMOVLW0X04 ;MOVWFTXSTAMOVLW0X80 ;MOVWFRCSTAM

15、OVLW0X80 ;MOVWFTRISCBSF TXSTA , TXEN孔*孔*中断服务子程序BTFSS PIR1 , RCIF ;接收中断标志为1?;误操作,返回0 ;否则,将接收到的数据通过 W寄存器;放入发送奇存器,并启动发送初始化程序MOVLW 0X19 ;的连接选择传输波特率为9600bps选择异步高速方式传输8位数据允许同步串行口工作将RC7 , RC6设置为输入,断绝与外接电路;发送允许BSF RCSTA , CREN ;接受数据允许BSF PIE1 , RCIE ;接收中断使能MOVLW 0XC0 ;总中断和外围中断允许MOVWF INTCONRETURN;*-主 稈序 *MA

16、IN NOPCLRWDTCALL INITIALMOVLW 0X55 ;发送数据55H进行测试MOVWF TXREGLOOPGOTO LOOPEND两片51单片机互相通信的串行通信程序(一个发送程序,一个接收程序)2007-05-27 08:27;系统晶振是11.0592 MHz;51单片机发送单片机程序;此程序用Proteus仿真通过;此程序在硬件上测试通过;2007-05-27;附有简化电路图;为了使初学者能看懂,程序与图尽可能的简单扼要;实验现象为,发送端的P1 口的哪个键被接下,接收端的哪个灯对应 着亮;如果把两个单片机的T和R通过无线模块(如基于 MCP212芯片的 模块)来扩充,便

17、可做成无线通信ORG0000HAJMPSTARTORG0040HSTART:MOVSP,#60HMOVSCON,#50H串口方式1MOVTMOD,#20H;T1方式2MOVTL1,#0FDH波特率9600的常数MOVTH1,#0FDHSETBTR1movr5,#00hWAIT:movp1,#0ffhmova ,p1movr5,a读键Icall delay;盘,这里去抖动,还要加几句话mova ,p1nopCJNEA,5,WAIT;是否有键输入MOVSBUF,a; 串口输出键盘输入的值NOPSS:JBCTI,WAIT; 是否发送完毕SSSJMPDELA Y:延时子程序010,#06H1,#0H1

18、,$0,DELA Y110PUSH; 保存现场PUSHMOVDELA Y1: MOVDJNZDJNZPOP; 恢复现场POPRETEND;系统晶振是11.0592 MHz;51单片机接收单片机程序;此程序用Proteus仿真通过 ;此程序在硬件上测试通过;2007-05-27;附有简化电路图;为了使初学者能看懂,程序与图尽可能的简单扼要;实验现象为,发送端的P1 口的哪个键被接下,接收端的哪个灯对应 着亮;如果把两个单片机的T和R通过无线模块(如基于 MCP212芯片的 模块)来扩充,便可做成无线通信ORG0000HAJMPSTARTORG0040HSTART:MOVSCON,#5OH串口方式

19、1MOVTMOD,#2OH;T1方式2MOVTL1,#0FDH波特率9600的常数MOVTH1,#0FDHSETBTR1WAIT:JBCRI,DIS_REC;是否接收到数据sjmpwaitDIS_REC:MOVA,SBUF;读串口接收到的数据movp1,aSJMPwaitend51单片机串行口通信程序设计例子时间:2009-03-06 17:13 来源:未知 作者:牛牛 点击:768次串行口方式0应用编程8051单片机串行口方式0为移位寄存器方式,外接一个串入并出的移位寄存器,就能扩展一个并行口。单片机串行口通信程序设计硬件连接图例:用8051单片机串行口外接口。CD4094扩展8位并行输出口,如图所示,8位并行口的各位都接一个 发光二极管串行口方式0应用编程8051单片机串行口方式0为移 ,外接一个串入并出的移位寄存器,就能扩展一个并行www.DPJ<单片机串行口通信程

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论