为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

串口通信

2011-07-15 8页 doc 42KB 20阅读

用户头像

is_324841

暂无简介

举报
串口通信基于单片机串行口红外通信的设计 多费率电能表是我国目前节约用电和计划用电政策下不可缺少的电能计量产品,多费率电能表的通信接口一般兼有红外接口和RS485接口。红外通信具有直观、操作简便、可靠性高等优点,是电能表中使用最为普遍的一种通信方式,是电能表和掌机之间实现抄表、编程、校时、数据管理等功能的有效手段。采用新茂单片机SSU7301(51系列)、日本光电子公司的红外发射管SE303和红外接收管PIC12043,以及单片机串行口、2个定时器/计数器可以有效地实现红外通信功能。 1 红外通信原理 红外通信是利用波长为900nm~1...
串口通信
基于单片机串行口红外通信的设计 多费率电能表是我国目前节约用电和用电政策下不可缺少的电能计量产品,多费率电能表的通信接口一般兼有红外接口和RS485接口。红外通信具有直观、操作简便、可靠性高等优点,是电能表中使用最为普遍的一种通信方式,是电能表和掌机之间实现抄表、编程、校时、数据管理等功能的有效手段。采用新茂单片机SSU7301(51系列)、日本光电子公司的红外发射管SE303和红外接收管PIC12043,以及单片机串行口、2个定时器/计数器可以有效地实现红外通信功能。 1 红外通信原理 红外通信是利用波长为900nm~1000nm的红外波作为信息的载体,发射装置把二进制信号经过高频调制后发送出去,接收装置把接收的红外高频信号进行解调为原来信息的一种通信传输方式。其中调制方式有脉宽调制(通过改变脉冲宽度调制信号PWM)和脉时调制(通过改变脉冲串之间时间间隔调制信号PPM)两种,本文采用PPM脉时调制方式。 2 串行口红外通信硬件设计 多费率电能表的红外发射和红外接收电路主要包括新茂单片机SSU7301、日本光电子公司的红外发射管SE303和红外接收管PIC12043,以及驱动三极管8550、电阻和电容,红外通信硬件原理图见图1。 2.1 红外发射硬件设计 红外发射是利用单片机SSU7301的串行数据发送口TXD(P3.1)控制驱动三极管BG1进行二进制数据“0”和“1”的传输(数据由串行发送缓冲器SBUF中送出),以及利用P3.4口控制驱动三极管BG2进行高频38.4kHz调制(高频驱动信号由定时器/计数器T0的方式2自动重装模式产生),从而可靠地实现了红外发射管D1在传输数据“0”时进行高频红外发射和数据“1”时被截止的发射功能。状态关系见表1,波形见图2。 2.2 红外接收硬件设计 红外接收是利用红接收管PIC12034收到高频信号输出低电平确定为数据“0”,而没收到高频信号输出高电平确定为数据“1”的方式经过解调,把数据通过单片机SSU7301的串行数据接收口RXD(P3.0)进行串行方式接收(接收数据存储在串行口缓冲器SBUF中)。 3 红外通信软件设计 DL/T645-1997《多功能电能表通信》中电能表的红外载波频率为38kHz±1kHz;初始速率为1200 bps;通信的字节格式为8位二进制码D0~D7,传输时加上一个起始位(0),一个偶校验位P和一个停止位(1),共11位,传输时先传低位,后传高位,传输序列见图3。根据以上要求,本设计中红外载波频率采用38.4kHz,波特率为1200bps,串行口采用模式3为9位异步通信方式,加1位起始位和1位结束位,传送一个字节数据为11位。 3.1 红外载波和定时器/计数器T0设置 红外载波频率f2为38.4kHz,当定时器/计数器T0模式控制器TMOD中C/T=0和M1M0=10时,SSU7301的定时器/计数器T0设置成模式2方式。此时,TL0和TH0预置成1个可以自动重装的8位的定时器/计数器。用软件将TL0和TH0预置相同的初值后,当TL0计数值增1溢出时,一方面使TF0置1,申请中断;另一方面产生的溢出脉冲将TH0的数据值自动打入到TL0中去,不需要用软件对TL0重新置初值。系统的晶振f1为11.0592MHz,则TL0和TH0的初值计算如下: f2=38.4kHz 得T=1/f2=1/38.4k≈26×10-6=26 μs 所以高频调制反转的周期TC=T/2=26/2=13μs 即定时器/计数器T0的初值TL0=TH0=28-(TC×f1)/12=256-(13×10-6×11.0592×106)/12=256-11.9808≈244=0F4H 在定时器/计数器T0的中断服务程序中只用两条指令即可实现高频调制,即 CPL P3.4和RETI。 3.2 串行口和定时器/计数器T1波特率发生器设置 串行口采用模式3为9位异步通信方式,波特率为1200bps。由串行口控制寄存器SCON的操作模式选择位SM0、SM1都置1设置为模式3,当定时器/计数器T1模式控制器TMOD中C/T=0和M1M0=10时,SSU7301的定时器/计数器T1设置成模式2方式作为波特率发生器,其波特率表示为: 波特率=(T1的溢出率)/ n 当SMOD=0时,n=32;当SMOD=1时,n=16,(本设计中SMOD=0)则 波特率=(T1的溢出率)×2SMOD / 32 T1的溢出率=(f1/12)/(28-T1初值) 得:波特率=(T1的溢出率)×2SMOD / 32 =[(f1/12)/(28- T1初值)] ×2SMOD / 32 得:定时器/计数器T1初值 TL1=TH1=28-(f1×2SMOD )/(12×32×波特率) =256-(11.0592×106)/( 12×32×1200) =256-24=232=0E8H 3.3 程序设计 根据以上两点参数的设置,51系列单片机SSU7301的汇编语言程序设计如下: ;以下为参数设置程序 MOV TMOD, #22H ;定时器/计数器T0方式2自动重装模式用于PWM38.4KHZ调 ;制用 , 定时器/计数器T1方式2自动重装模式用于串行口通讯波特率发生器 MOV TH1,#0E8H ;波特率1200时,定时器/计数器T1自动重装初值 MOV TL1,#0E8H MOV TH0,#0F4H ;38.4KHz高频频调制时, 定时器/计数器T0自动重装初值 MOV TL0,#0F4H SETB ET0 ; 定时器/计数器T0溢出中断允许位 SETB TR1 ; 定时器/计数器T1开始定时控制位 SETB TR0 ; 定时器/计数器T0 开始定时控制位 MOV PCON,#00H ;SMOD为0不倍增模式 MOV SCON,#0D0H ;串行口设置为模式3,允许接收 SETB ES ;串行口允许中断 SETB EA ;开总中断允许位 ;以下为定时器/计数器T0中断溢出服务程序 ORG 000BH; 定时器/计数器T0中断入口地址 T0SERVE:CPL P3.4 ; 定时器/计数器T0定时取反P3.4口进行高频调制 RETI ;中断返回 ;以下为串行口中断服务程序,以接收一个字节数据为例,多字节以此类推 ORG 0023H;串行口中断入口地址 SENDSERVE:NOP NOP MOV A,SBUF ;把接收缓冲器的数据送到A寄存器 … ;进行数据处理及其它功能操作 RETI ;中断返回 ;以下为串行口发送程序,以发送一个字节数据为例, 多字节以此类推 COMSEND: MOV A,#DATAH ;把数据送到A寄存器 MOV C,P ;根据A中数据产生的偶校验位送到进位标志位 MOV TB8,C ;送偶校验位到发送的第9位数据 MOV SBUF,A ;送数据到发送缓冲器 JNB TI,$ ;以查询方式等待发送结束 CLR TI ;清发送中断标志位 … ;继续发送或其它功能操作 RET 子程序返回 4 结束语 本设计的最大特点在于省略了脉冲振荡器,而仅仅利用多费率电能表上所带单片机的串行口和2个定时器/计数器,这不仅使多费率电能表在硬件设计上更加简单、成本更加低廉,而且在软件上也更加方便、可靠。同时这种红外通信方式也可以应用在带串行口和定时器/计数器的单片机应用领域。 51单片机与串口通信(含代码) 串口调试 1. 发送:向总线上发命令 2. 接收:从总线接收命令,并分析是地址还是数据。 3. 定时发送:从内存中取数并向主机发送. 经过调试,以上功能基本实现,目前可以通过上位机对单片机进行实时控制。 程序如下: //这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收 //和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样的 #i nclude #i nclude #i nclude #define INBUF_LEN 4 //数据长度 unsigned char inbuf1[INBUF_LEN]; unsigned char checksum,count3 , flag,temp,ch; bit read_flag=0; sbit cp=P1^1; sbit DIR=P1^2; int i; unsigned int xdata *RAMDATA; /*定义RAM地址指针*/ unsigned char a[6] ={0x11,0x22,0x33,0x44,0x55,0x66} ; void init_serialcomm(void) { SCON=0x50; //在11.0592MHz下,设置串行口波特率为9600,方式1,并允许接收 PCON=0x00; ES=1; TMOD=0x21; //定时器工作于方式2,自动装载方式 TH0=(65536-1000)%256; TL0=(65536-1000)/256; TL1=0xfd; TH1=0xfd; ET0=1; TR0=1; TR1=1; // TI=0; EA=1; // TI=1; RAMDATA=0x1F45; } void serial () interrupt 4 using 3 { if(RI) { RI=0; ch=SBUF; TI=1; //置SBUF空 switch(ch) { case 0x01 :printf("A"); TI=0;break; case 0x02 :printf("B"); TI=0;break; case 0x03 :printf("C"); TI=0;break; case 0x04 :printf("D"); TI=0;break; default :printf("fg"); TI=0;break; } } } //向串口发送一个字符 void timer0() interrupt 1 using 3{ // char i; flag++; TH0=0x00; TL0=0x00; if(flag==10) {// cp=!cp; // for(i=0;i<6;i++) P2=0x25; TI=1; temp=*RAMDATA; printf("%c",temp); TI=0; // RAMDATA--; flag=0; } } //主程序 main() { init_serialcomm(); //初始化串口 //向6264中送数据 { *RAMDATA=0x33; } while(1) { *RAMDATA=0x33;; } } 调试过程中遇到的问: 1. 发送过程:在发送时必须保证TI=1:即发送缓冲器为空,否则将导致数据发不出去,如果想强制发送可以用:TI=1.具体发送数据:利用printf(“akjdfaklfj”);函数直接发送即可。 2. 接收过程:在接收时多选用中断方式,这样可以节约CPU的时间,提高效率,
/
本文档为【串口通信】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索