单片微机原理与接口技术-基于STC15系列单片机(第3版)9 STC15F2K60S2单片机的串行口 例题_第1页
单片微机原理与接口技术-基于STC15系列单片机(第3版)9 STC15F2K60S2单片机的串行口 例题_第2页
单片微机原理与接口技术-基于STC15系列单片机(第3版)9 STC15F2K60S2单片机的串行口 例题_第3页
单片微机原理与接口技术-基于STC15系列单片机(第3版)9 STC15F2K60S2单片机的串行口 例题_第4页
单片微机原理与接口技术-基于STC15系列单片机(第3版)9 STC15F2K60S2单片机的串行口 例题_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

PAGEPAGE195第9章STC15F2K60S2单片机的串行口例题例9.1设单片机采用11.059MHz的晶振,串行口工在方式1,波特率为2400位/秒。请编程设置相关寄存器。解:从表9.1可知,当波特率为2400位/秒时,(T1x12)=0,(SMOD)=0,(TH1)=(TL1)=F4H。单片机复位时,(T1x12)=0,(SMOD)=0,故不需对T1x12和SMOD操作。编程如下:MOVTMOD,#20H;T1设置为方式2定时模式MOVTL1,#0F4HMOVTH1,#0F4H;设置定时/计数器T1的初始值SETBTR1;启动T1,产生波特率为2400位/秒的移位脉冲信号STC实用小工具:波特率计算器如图9.20、图9.21分别为单片机采用11.059MHz的晶振,1T,串行口工在方式1,波特率为9600位/秒的设置与自动生成的汇编语言和C语言对应的波特率子程序和波特率子函数。图9.20波特率发生器参数设置与生成的波特率子程序(汇编格式)图9.21波特率发生器参数设置与生成的波特率子程序(C格式)例9.2使用2块74HC595芯片扩展16位并行口,外接16只发光二极管,电路连接图见图9.22所示。利用它的串入并出功能,把发光二极管从右向左依次点亮,并不断循环之(16位流水灯)。图9.22串口方式0扩展输出口解:74595和74164功能相仿,都是8位串行输入转并行输出移位寄存器。74164的驱动电流(25mA)比74595(35mA)的要小。74595的主要优点是具有数据存储寄存器,在移位的过程中,输出端的数据可以保持不变。这在串行速度慢的场合很有用处,数码管没有闪烁感。而且74595具有级联功能,通过级联能扩展更多的输出口。Q0~Q7是并行数据输出口,即存储寄存器的数据输出口,Q7'是串行输出口用于连接级联芯片的串行数据输入端DS,ST_CP是存储寄存器的时钟脉冲输入端(低电平锁存),SH_CP是移位寄存器的时钟脉冲输入端(上升沿移位),/OE是三态输出使能端,/MR是芯片复位端(低电平有效,低电平时移位寄存器复位),DsS是串行数据输入端。设16位流水灯数据存放在R2和R3中,汇编参考程序如下:MOVSCON,#00H;设置串行口1为同步移位寄存器方式CLRES;禁止串口1中断CLRP1.0SETBCMOVR2,#0FFH;设置流水灯初始数据MOVR3,#0FEH;设置最右边的LED灯亮MOVR4,#16LOOP:MOVA,R3MOVSBUF,A;启动串行发送JNBTI,$;等待发送结束信号CLRTI;清除TI标志,为下一字节发送做准备MOVA,R2MOVSBUF,A;启动串行发送JNBTI,$;等待发送结束信号CLRTI;清除TI标志,为下一次发送做准备SETBP1.0;移位寄存器数据送存储锁存器NOPCLRP1.0MOVA,R3;16位流水灯数据RLCAMOVR3,AMOVA,R2RLCAMOVR2,ALCALLDELAY;插入轮显间隔DJNZR4,LOOP1SETBCMOVR2,#0FFH;设置流水灯初始数据MOVR3,#0FEH;设置最右边的LED灯亮MOVR4,#16LOOP1:SJMPLOOP;循环DELAY:…;延时程序,具体由同学自己确定延时时间及编程例9.3编制程序,使甲、乙双方单片机能够进行通信。要求:将甲机内部RAM20H~27H单元的数据依次发送给乙机,并实时显示发送数据;乙机接收后存放在内部RAM70H~77H中,并实时显示接收到的数据。发送、接收双方均采用LED灯显示,低电平驱动。解:设晶振频率为11.0592MHZ,数据传输波特率为2400。甲机发送程序汇编语言参考程序如下:ORG 0000H MOVTMOD,#20H;设置定时器T1,设置串行口的波特率 MOVTL1,#0F4H MOVTH1,#0F4H SETBTR1 MOVSCON,#40H;设置串行口工作在方式1 MOVR0,#20H;设置串行发送缓冲区首址 MOVR7,#08H;设置串行发送的字节数START: MOVA,@R0;取发送数据 MOVSBUF,A;启动串行发送MOVP1,A;实时显示发送数据Check_TI: JBCTI,UART_Byte_Send_End;查询串行发送结束标志 LJMPCheck_TIUART_Byte_Send_End: INCR0;数据指针指向下一个发送数据 MOVR3,#05H;设置串行发送间隔 LCALLDELAY DJNZR7,START;判断串行发送是否结束 SJMP$DELAY: MOVR4,#100;延时子程序,延时时间=(R3)×10msDELAY1: MOVR5,#200DELAY2: NOP NOP DJNZR5,DELAY2 DJNZR4,DELAY1 DJNZR3,DELAY RET ENDC51参考程序如下:#include<reg52.h>unsignedcharbdatainter_ram[8]={0,1,2,3,4,5,6,7};设置发送数据/*延时子函数*/voiddelay(unsignedchari){ unsignedcharx,y,z; //延时函数,大约1ms for(z=i;z>0;z--) for(y=11;y>0;y--) for(x=195;x>0;x--);}/*串行口中断子函数*/voidserial_initial(void) //串口初始化程序{ TMOD=0x20; //实用8位定时器,自动重装计数值 TH1=0xf4; TL1=0xf4; //设置TH1和TL1为0xf4,波特率是2400 TR1=1; SCON=0x40; //设定串口为方式1}voidSend_Byte(unsignedcharx) //串口发送一个字节的程序{ SBUF=x;//启动串口发送 P1=x;//实时显示发送数据 while(TI==0); TI=0;}/*主函数*/voidmain(void){ unsignedcharcount; serial_initial(); for(count=0;count<8;count++) //把指定片内RAM数值发送到目标单片机 { Send_Byte(inter_ram[count]); delay(200); //发送间隔,以便看清楚数据 } while(1);}乙机接收程序汇编语言参考程序如下:ORG 0000H MOVTMOD,#20H;设置定时器T1,设置串行口的波特率 MOVTL1,#0F4H MOVTH1,#0F4H SETBTR1 MOVSCON,#40H;设置串行口的工作的工作方式 MOVR0,#70H;设置串行接收缓冲区首址 MOVR7,#08H;设置串行接收的字节数 SETBREN;启动串行接收Check_RI: JBCRI,UART_Byte_Receive_End;查询串行接收结束标志 LJMPCheck_RIUART_Byte_Receive_End: MOVA,SBUF;取串行接收数据 MOV@R0,A;存串行接收数据 CPLA MOVP0,A;串行接收数据送显示 INCR0 DJNZR7,Check_RI;判断串行发送是否结束 SJMP$ ENDC51参考程序如下:#include<reg51.h>#include<intrins.h>unsignedcharxdatarecdata[8];//定义接收存储数组unsignedchar*mydata;/*串行口中断子函数*/voidserial_initial(void) //串口初始化程序{ TMOD=0x20; //实用8位定时器,自动重装计数值 TH1=0xf4; TL1=0xf4; //设置TH1和TL1为0xf4,波特率是2400 TR1=1; SCON=0x40; //设定串口为方式1 REN=1; //允许串行接收数据}/*主函数*/voidmain(void){ unsignedchari; serial_initial(); //调用串口初始化函数 mydata=recdata; for(i=0;i<8;i++) { while(RI==0); RI=0; //清空接收标志 *mydata=SBUF;//存储接收数据 P1=SBUF; //送往P1口显示 mydata++//指向下一个存储单元 _nop_(); _nop_(); _nop_(); } while(1);}例9.4编程将甲机片内60H~6FH单元的数据块从串行口发送,在发送之前将数据块长度发送给乙机,当发送完16个字节后,再发送一个累加校验和。乙机接收甲机发送的数据,并存入以0000H开始的扩展RAM数据存储器中,首先接收数据长度,接着接收数据,当接收完16个字节后,接收累加和校验码,进行校验。数据传送结束后,根据校验结果向甲机发送一个状态字,00H表示正确,FFH表示出错,出错则甲机重发。解:定义双机串行口方式1工作,晶振为11.059MHz,波特率2400。定时器T1按方式2工作,经计算或查表得到定时器预置值为0F4H,SMOD=0,T1x12=0。(1)发送子程序参考如下:ORG 0000HMOVTMOD,#20H;设置定时器1为方式2 MOVTL1,#0F4H;设置预置值 MOVTH1,#0F4H SETBTR1;启动定时器1 MOVSCON,#50H;设置串行口为方式1,允许接收START: MOVR0,#60H;设置数据指针 MOVR5,#10H;设置数据长度 MOVR4,#00H;累加校验和初始化 MOVSBUF,R5;发送数据长度Check_TI_0: BCTI,UART_Send_Data_LOOP;等待发送 LJMPCheck_TI_0UART_Send_Data_LOOP: MOVA,@R0;读取数据 MOVSBUF,A;发送数据 ADDA,R4 MOVR4,A;形成累加和 INCR0;修改数据指针Check_TI_1: JBCTI,UART_Send_Data_Byte_End;等待发送一帧数据 LJMPCheck_TI_1UART_Send_Data_Byte_End:DJNZR5,UART_Send_Data_LOOP;判断数据块是否发送完 MOVSBUF,R4;发送累加校验和Check_TI_2: BCTI,Check_RI;等待发送 LJMPCheck_TI_2Check_RI: BCRI,UART_Receive_End;等待乙机回答 LJMPCheck_RIUART_Receive_End: MOVA,SBUF;接收乙机数据 JZRight;00H,发送正确,返回 AJMPSTART;发送出错,重发Right: RET(2)接收子程序接收采用中断方式。设置两个标志位(7FH,7EH位)来判断接收到的信息是数据块长度、数据还是累加校验和。接收参考程序如下:ORG 0000H LJMP MAIN;转初始化程序 ORG 0023H LJMP Serial_ISR;转串行口中断程序 ORG 0100HMAIN: MOVTMOD,#20H;设置定时器1为方式2 MOVTL1,#0F4H;设置预置值 MOVTH1,#0F4H SETBTR1;启动定时器1 MOVSCON#50H;串行口初始化 SETB7FH;置长度标志位为1 SETB7EH;置数据块标志位为1 MOV31H,#00H;规定扩展RAM的起始地址,31H存高8位 MOV30H,#00H;30H存低8位 MOV40H,#00H;清累加和寄存器 SETBEA;开放串行口1中断 SETBES SJMP$;模拟一个用户程序Serial_ISR:CLREA;关中断 CLRRI;清中断标志 PUSHA;保护现场 PUSHDPH PUSHDPL JB7FH,Data_Length;判断是数据块长度吗? JB7EH,Data;判断是数据块吗?SUM: MOVA,SBUF;接收校验和 CJNZA,40H,Error_Mark;判断接收是否正确 MOVA,#00H;二者相等,正确,向甲机发送00H MOVSBUF,ACheck_TI_Ok: JNBTI,Check_TI_Ok CLRTI SJMPExit_Serial_ISR;发送完,转到退出中断Error_Mark: MOVA,#0FFH;二者不相等,错误,向甲机发送FFH MOVSBUF,ACheck_TI_Error: JNBTI,Check_TI_Error CLRTI SJMPAgain_Receive;接收有错,转重新开始Data_Length: MOVA,SBUF;接收长度 MOV41H,A;长度存入41H单元 CLR7FH;清长度标志位 SJMPExit_Serial_ISR;退出中断Data: MOVA,SBUF;接收数据 MOVDPH,31H;存入片外RAM MOVDPL,30H MOVX@DPTR,A INCDPTR;修改片外RAM的地址 MOV31H,DPH MOV30H,DPL ADDA,40H;形成累加和,放在40H单元 MOV40H,A DJNZ41H,Exit_Serial_ISR;判断数据块是否接收完CLR7EH;接收完,清数据块标志位 SJMPExit_Serial_ISRAgain_Receive: SETB7FH;接收出错,恢复标志位,重新开始接收 SETB7EH MOV31H,#00H;恢复扩展RAM起始地址 MOV30H,#00H MOV40H,#00H;累加和寄存器清零Exit_Serial_ISR: POPDPL;恢复现场 POPDPH POPA SETBEA;开中断 RETI;返回C51程序由同学自己编程完成。例9.5设系统晶振频率为11.0592MHZ,以4800bit/s的波特率进行通信。主机:向指定从机(如10#从机)发送指定位置为起始地址(如扩展RAM0000H)的若干个(如10个)数据,发送空格(20H)作为结束;从机:接收主机发来的地址帧信息,并与本机的地址号相比较,若不符合,仍保持SM2=1不变;若相等,则使SM2清零,准备接收后续的数据信息,直至接收完到空格数据信息位置,并置位SM2。解:主机和从机的程序流程图如图9.26所示。图9.26例9.5主机与从机程序流程图主机程序汇编语言参考程序如下:ADDRT EQU 0000HSLAVE EQU 10 ;从机地址号NUMBEREQU10ORG 0000H LJMP Main_Send ;主程序入口地址 ORG 0023H LJMP Serial_ISR ;串行口中断入口地址 ORG 0100HMain_Send:MOVSP,#60H MOVSCON,#0C0H ;串行口方式3 MOVTMOD,#20H ;置T1工作方式2 MOVTH1,#0FAH ;置4800波特率的时间常数 MOVTL1,#0FAH MOVDPTR,#ADDRT ;置数据地址指针 MOVR0,#NUMBER;设置发送数据字节数 MOVR2,#SLAVE ;从机地址号→R2 SETBTR1 ;启动T1 SETBES ;开放串行口1中断 SETBEA SETBTB8 ;置位TB8,作为地址帧信息特征 MOVA,R2 ;发送地址帧信息 MOVSBUF,A SJMP$ ;等待中断;串行口中断服务程序:Serial_ISR: CLR TI ;清发送中断标志 CLR TB8 ;清TB8位,为发送数据帧信息作准备 MOVXA,@DPTR ;发送一个数据字节 MOVSBUF,A INC DPTR ;修改指针 INC R0 DJNZR0,Exit_Serial_ISR ;判数据字节是否发送完 CLR ESJNBTI,$;检测最后一个数据发送结束标志CLRTIMOVSBUF,#20H;数据发送完毕后,发结束代码20HExit_Serial_ISR:RETI ENDC51参考程序如下:#include<REG51.H>//包含8052单片机寄存器定义文件unsignedcharxdataADDRT[10]; //设置保存数据的扩展RAM单元unsignedcharSLAVE=10; //设置从机地址号的变量unsignedcharnum=10,*mypdata;//设置要传送数据的字节数/*发送中断服务子函数*/voidSerial_ISR(void)interrupt4{ TI=0; TB8=0; SBUF=*mypdata; //发送数据 mypdata++; //修改指针 num--; if(num==0){ES=0;while(!TI==0);TI=0;SBUF=0x20;}}/*主函数*/voidmain(void){ SCON=0xC0; TMOD=0x20; TH1=0xFA; TL1=0xFA; mypdata=ADDRT; TR1=1; ES=1; EA=1; TB8=1; SBUF=SLAVE; //发送从机地址 while(1); //等待中断}从机程序汇编语言参考程序如下:ADDRR EQU 0000HSLAVE EQU 10 ;从机地址号,依各从机的地址号进行设置ORG 0000H LJMP Main_Receive ;从机主程序入口地址 ORG 0023H LJMP Serial_ISR ;串行口中断入口地址 ORG 0100HMain_Receive:MOVSP,#60H MOVSCON,#0F0H ;串行口方式3,SM2=1,REN=1,接收状态 MOVTMOD,#20H ;置T1为工作方式2 MOVTH1,#0FAH ;置4800波特率相应的时间常数 MOVTL1,#0FAH MOVDPTR,#ADDRR ;置数据地址指针 SETBTR1 ;启动T1 SETBES ;开放串行口中断1 SETBEA ; SJMP$ ;等待中断;从机接收中断服务程序Serial_ISR:CLRRI ;清接收中断标志 MOVA,SBUF ;取接收信息 MOVC,RB8 ;取RB8(信息特征位)→C JNC UAR_Receive_Data ;RB8=0为数据帧信息,转UAR_Receive_Data XRLA,#SLAVE ;RB8=1为地址帧信息,与本机地址号SLAVE相异或JZAddress_Ok ;地址相等,则转Address_Ok LJMPExit_Serial_ISR ;地址不相等,则转中断返回Address_Ok:CLRSM2 ;清SM2,为后面接收数据帧信息作准备 LJMPExit_Serial_ISR ;中断返回UAR_Receive_Data:MOVX@DPTR,A ;接收的数据→数据缓冲区 INCDPTR ;修改地址指针 CJNZA,#20H,Exit_Serial_ISR ;判断接收数据是否为结束代码20H,不等继续 SETBSM2 ;全部接收完,置SM2=1Exit_Serial_ISR:RETI ;中断返回 ENDC51参考程序如下:unsignedcharxdataADDRR[10];unsignedcharSLAVE=10,rdata,*mypdata;/*接收中断服务子函数*/voidSerial_ISR(void)interrupt4{ RI=0; rdata=SBUF; //将接收缓冲区的数据保存到rdata变量中 if(RB8) //RB8为1说明收到的信息是地址 { if(rdata==SLAVE) //如果地址相等,则SM2=0 SM2=0; } else //接收到的信息是数据 { *mypdata=rdata; mypdata++; if(rdata==0x20)//所有数据接收完毕,令SM2=1,为下一次接收地址信息作准备 SM2=1; }}/*主函数*/voidmain(void){ SCON=0xF0; TMOD=0x20; TH1=0xFA; TL1=0xFA; mypdata=ADDRR; TR1=1; ES=1; EA=1; while(1); //等待中断}例9.6将PC机键盘的输入发送给单片机,单片机收到PC机发来的数据后,回送同一数据给PC机,并在屏幕上显示出来。PC端采用串口调试程序进行数据发送与接收数据并显示,请编写单片机通信程序。解:通信双方约定:波特率为2400;信息格式为8个数据位,1个停止位,无奇偶校验位。设系统晶振频率为11.0592MHZ。汇编语言参考程序如下:ORG 0000H LJMP MAIN;转初始化程序ORG 0023HLJMP Sirial

温馨提示

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

评论

0/150

提交评论