串行通信技术-模拟信号转换接口_第1页
串行通信技术-模拟信号转换接口_第2页
串行通信技术-模拟信号转换接口_第3页
串行通信技术-模拟信号转换接口_第4页
串行通信技术-模拟信号转换接口_第5页
已阅读5页,还剩17页未读, 继续免费阅读

下载本文档

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

文档简介

1、微机原理与应用实验报告6实验 9 串行通信技术10A 模拟信号转换接口实验九串行通信技术1. 了解异步串行通信原理;2. 掌握 MSP430异步串行通信模块及其编程方法;二、实验任务1) 了解 MSP430G2553 实验板USB转串口的通信功能,掌握串口助手的使用( 1 )利用PC机的串口助手程序控制串口,实现串口的自发自收功能为实现 PC 串口的自发自收功能,须现将实验板上的扩展板去下,并将单片机板上的BRXD和 BTXD用杜邦线进行短接,连接图如下所示:PC串口的自收自发功能。/ 发双方是怎么建立起通信的2)思考题:异步串行通信接口的收首先在异步通信中,要求接收方和发送方具有相同的通信参

2、数,即起始位、停止位、波特率等等。 在满足上面条件的情况下,发送方对于每一帧数据按照起始位数据位停止位的顺序进行发送,而接收方则一直处于接受状态,当检测到起始位低电平时,看是采集接下来发送方发送过来的数据,这样一帧数据(即一个字符)传送完毕,然后进行下一帧数据的接受。这样两者之间就建立起了通信。2. 查询方式控制单片机通过板载USB转串口与PC机实现串行通信1 )硬件连接图/ 通信设置/ 时钟设置/ 循环等待接受缓冲器满/ 读接受缓冲器并保存/ 检测发送完毕信号/ 接受完毕信号/ 检测接受完毕信号2) 2) C语言程序采用SMCLK=1.0MHz时,程序如下:#include "io

3、430.h"#include "in430.h"unsigned int i,j,done,count;char string32;void USCIA0_int();void CLOCK_int(); int main( void ) / Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;USCIA0_int();CLOCK_int();while(1)done=0;count=0;for(i=0;i<32;i+)while(IFG2&UCA0RXIFG)=0

4、);stringi=UCA0RXBUF;if(stringi='')done=1;break;count=i;if(done=1)for(j=0;j<=count;j+)while(IFG2&UCA0TXIFG)=0);UCA0TXBUF=stringj;done=0; void USCIA0_int() UCA0CTL1|=UCSWRST;P1SEL|=BIT1+BIT2;P1SEL2|=BIT1+BIT2;UCA0CTL1|=UCSSEL_2+UCRXEIE;UCA0BR1=0;UCA0BR0=104;UCA0MCTL=UCBRS_1;UCA0CTL1&

5、;=UCSWRST;/ 端口设置/ 时钟选择设置(SMCLK)/ 波特率设置void CLOCK_int()if(CALBC1_1MHZ!=0xff)BCSCTL1=CALBC1_1MHZ;DCOCTL=CALDCO_1MHZ;/ 设置时钟为1MHz/采用 smclk1MHZ其 中 SMCLK=1MHz, 波 特 率 采 用 的 是 9600 , 采 用 低 频 波 特 方 式 , 则N=1000000/9600= 104.1666 ,故UCA0BR1=0, UCA0BR0=104, UCBRS=1;#include "io430.h"#include "in43

6、0.h"unsigned int i,j,done,count;char string32;void USCIA0_int();int main( void )/ Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;USCIA0_int();while(1)done=0;count=0;for(i=0;i<32;i+)while(IFG2&UCA0RXIFG)=0);stringi=UCA0RXBUF;if(stringi='')done=1;break;/ 通信设置

7、/ 循环等待接受缓冲器满/ 读接受缓冲器并保存/ 检测发送完毕信号/ 接受完毕信号/ 检测接受完毕信号/ 端口设置/ 时钟选择设置(SMCLK)/ 波特率设置count=i;if(done=1)for(j=0;j<=count;j+)while(IFG2&UCA0TXIFG)=0);UCA0TXBUF=stringj;done=0;void USCIA0_int()UCA0CTL1|=UCSWRST;P1SEL|=BIT1+BIT2;P1SEL2|=BIT1+BIT2;UCA0CTL1|=UCSSEL_1+UCRXEIE;UCA0BR1=0;UCA0BR0=3;UCA0MCTL=

8、UCBRS_3;UCA0CTL1&=UCSWRST;也是采用了低频波特率方式,所以关于波特率设置的相关计算和上面是一样的。( 3)思考:如果在两个单片机之间进行串行通信,应该如何设计连线和编程?由于在上面的连线中将单片机上的P1.2和 BRXD相连, P1.1 和 BTXD相连,所以若要在两个单片机之间进行通信,首先应该将两个单片机的P1.2和 P1.1 交叉相连,并根据上面的程序进行相同的关于端口和波特率相关的设置即可实现两个单片机之间的通信。3. (提高)利用PC机 RS232通信接口与单片机之间完成串行通信( 1 )硬件连接图在实验时,采用了将PC机的串口com1 直接连接至MS

9、P430F149的孔型 D9 连接器上,G2553单片机的输出引脚P1.1 和 P1.2分别与 F149 单片机上的URXD1 和 UTXD1相连接,连接图如下所示:2) C语言程序9600bps、无校验、8 位数据位、先低后高、一个停止位时,所采用的程序和任务2 中相同,这里不再赘述。8 位数据位、先低后高、一个停止位时,由于采用外38400bps、无校验、部晶振已经不能够产生这样高的波特率,所以采用SMCK=1MHz的时钟,所采用的程序只需将任务二中关于时钟选择和时钟设置的相关部分进行修改即可,具体程序见下面所示:#include "io430.h"#include &

10、quot;in430.h"unsigned int i,j,done,count;char string32;void USCIA0_int();void CLOCK_int();int main( void )/ Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD;USCIA0_int();CLOCK_int();while(1)done=0;count=0;for(i=0;i<32;i+)/ 循环等待接受缓冲器满/ 读接受缓冲器并保存/ 检测发送完毕信号/ 接受完毕信号while(IF

11、G2&UCA0RXIFG)=0);stringi=UCA0RXBUF;if(stringi='')done=1;break;count=i;if(done=1)/ 检测接受完毕信号for(j=0;j<count;j+)while(IFG2&UCA0TXIFG)=0);UCA0TXBUF=stringj;done=0;void USCIA0_int()UCA0CTL1|=UCSWRST;P1SEL|=BIT1+BIT2;P1SEL2|=BIT1+BIT2;/端口设置UCA0CTL1|=UCSSEL_2+UCRXEIE;/时钟选择设置UCA0BR1=0;UCA

12、0BR0=1;/ 波特率设置UCA0MCTL=UCBRF_10+UCBRS_0+UCOS16;UCA0CTL1&=UCSWRST;void CLOCK_int()if(CALBC1_1MHZ!=0xff)BCSCTL1=CALBC1_1MHZ;/采用 smclk1MHZDCOCTL=CALDCO_1MHZ;( 3)思考题:设计单片机与PC机进行串行通信时,硬件设计有哪些需要注意的事项?首先最基本的是,单片机和PC机上所选择的通信协议应该是一致的,然后可以选择多种路径,其中包括USB,串口等。另外需要注意的是要统一两者之间的逻辑电平,如果电平不同,则需要在中间加入电平转换电路。4. (提

13、高)中断方式控制串行通信的收发( 1 )硬件连接图由于只是将接收和发送改为了中断实现,其他功能并没有改变,所以这里的硬件连接图和任务 2 中的是相同的,这里不再重复。( 2) C语言程序#include "io430.h"#include "in430.h"unsigned int i,j,done,count;char string32;void USCIA0_int();int main( void )/ Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD;US

14、CIA0_int();i=0;j=0;done=0;IE2|=UCA0RXIE;_EINT();while(1)if(done=1)IE2|=UCA0TXIE;elseIE2&=UCA0TXIE; void USCIA0_int()UCA0CTL1|=UCSWRST;P1SEL|=BIT1+BIT2;P1SEL2|=BIT1+BIT2;/端口设置UCA0CTL1|=UCSSEL_1+UCRXEIE;/时钟选择设置UCA0BR1=0;UCA0BR0=3;/ 波特率设置UCA0MCTL=UCBRS_3;UCA0CTL1&=UCSWRST;#pragma vector=USCIAB0

15、RX_VECTOR/接收中断子程_interrupt void UCA0RX_ISR()stringi=UCA0RXBUF;if(stringi='')done=1;count=i;i=0; i+;#pragma vector=USCIAB0TX_VECTOR/发送中断子程_interrupt void UCA0TX_ISR()if(j<count)UCA0TXBUF=stringj;j+; elsedone=0;j=0;( 3)思考题:发送中断的允许位是否可以一直处于打开(允许)状态?为什么?发送中断的允许位不能够一直处于打开状态,因为当发送缓冲器为空时,发送中断标志位

16、就会被置位,向系统发出中断请求,从而转去执行发送中断子程。而当无法送内容时和刚发送完内容后发送缓冲器都处于空的状态,若发送中断允许位一直打开,在没有接受完毕进入发送时就会不断地向系统发出中断请求,从而导致系统不能正常。所以, 发送中断允许为应该在接受完毕准备发送时打开,发送完毕后立即关闭。三、实验中遇到的问题和解决办法1. 在任务二中使用SMCLK完成通信时,最开始始终无法完成通信,后来发现是由于SMCLK的时钟频率并不是刚好的1MHz,所以后来通过利用示波器测量实际的频率,重新计算产生波特率的相关的参数解决了问题;2. 对于利用中断完成任务二的要求中,起初无法完成通信,后来发现是中断中由于在

17、赋值完一次之后,先使i 进行了加1 ,然后才判断对应的字符是否是 ,所以单片机一直没有 发送到 PC机上内容。实验十模拟信号转换接口1. 了解模 /数转换的工作原理,掌握 MSP430单片机内ADC10模 /数转换模块的控制和应用。1. 模 /数转换器ADC10的编程控制1 )硬件连接图2)程序设计思路首先需要利用示波器测量单片机板上的Vcc 的大小,确定数/模转换公式中的参考电压ADC 的一些设置采用默认值即可,通过2.2 和 2.8 进L1 灯的亮灭。3) C语言程序#include "io430.h"#include "in430.h"unsign

18、ed buffer32;unsigned int i,sum;float vin;int main( void )/ Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;P1SEL&=BIT1;P1SEL2&=BIT1;P1DIR|=BIT1;P1OUT|=BIT1;ADC10AE0|=BIT0;ADC10CTL0&=ENC;ADC10CTL1|=INCH_0;ADC10CTL0|=ADC10ON+ENC; while(1)/P1.1 设置为GPIO用来控制L1/ 允许 A0 管脚模

19、拟输入/ 禁止ADC10转换/采样通道为A0/ 给内核供电允许转换/ 主循环sum=0;for(i=0;i<4;i+)/ 软件启用采样ADC10CTL0|=ADC10SC;while(ADC10CTL0&ADC10IFG)=0);bufferi=ADC10MEM;sum=sum+bufferi;/ 通过公式计算出测量的电压值vin=(sum/4)*3.5/1023);if(vin>2.80)P1OUT&=BIT1;if(vin<2.20)P1OUT|=BIT1;4)思考题:如果模拟信号从P1.5 输入,应该如何编程?若模拟信号从P1.5 输入只需将允许管脚模拟

20、输入和采样通道的选择进行修改即可,其他的不用改变。并在硬件上使模拟信号从P1.5 输入即可。需要修改的指令如下所示:ADC10AE0|=BIT0;/允许 A0管脚模拟输入ADC10CTL1|=INCH_0;/ 采样通道为A02. (提高)改用中断的方式实现任务1( 1 )硬件连接图硬件连接图任务一中相同,所以在这里不再给出。2) C语言程序#include "io430.h"#include "in430.h"unsigned buffer32;unsigned int i=0,sum;float vin;int main( void )/ Stop w

21、atchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;P1SEL&=BIT1;P1SEL2&=BIT1;P1DIR|=BIT1;P1OUT|=BIT1;ADC10AE0|=BIT0;ADC10CTL0&=ENC;ADC10CTL1|=INCH_0;ADC10CTL0|=ADC10ON+ENC;ADC10CTL0|=ADC10IE;_EINT();ADC10CTL0|=ADC10SC;sum=0;while(1)/ 允许 A0 管脚模拟输入/ 禁止 ADC10转换/采样通道为A0/ 给内核供电允许转

22、换/ 打开总控位/ 软件启动转换if(vin>2.80)P1OUT&=BIT1;if(vin<2.20)P1OUT|=BIT1;ADC10CTL0|=ADC10SC;/ 软件启动转换#pragma vector=ADC10_VECTOR /中断子程_interrupt void ADC10_ISR()bufferi=ADC10MEM;sum=sum+bufferi;i+;if(i=4)vin=(sum/4)*3.5/1023);sum=0;i=0; 3.(提高)制作数字电压表( 1 )硬件连接图( 2)程序设计思路其中最基本的任务和上面两个任务中完成方式相同,在这里需要改进

23、的就是将测得的电压值进行数码管显示,只需要利用之前实验中设计的数码管显示模块就可以了。( 3) C语言程序 #include "io430.h"#include "in430.h"unsigned buffer32;unsigned int i=0,sum;unsigned char NUM_tab10=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;int vin;float vin1;void seg(int number);int main( void )/ Stop watchdog timer

24、 to prevent time out resetWDTCTL = WDTPW + WDTHOLD;P1SEL&=(BIT0+BIT1+BIT2+BIT3);P1SEL2&=(BIT0+BIT1+BIT2+BIT3);P1DIR|=(BIT0+BIT1+BIT2+BIT3);P2SEL=0;P2SEL2=0;P2DIR=0xff;ADC10AE0|=BIT5;/允许 A0管脚模拟输入(改为BIT5)ADC10CTL0&=ENC;/ 禁止ADC10转换ADC10CTL1|=INCH_5;/采样通道为A0(改为INCH_5)ADC10CTL0|=ADC10ON+ENC; /给内核供电允许转换ADC10CTL0|=ADC10IE;_EINT();ADC10CTL0|=ADC10SC;sum=0;while(1)seg(vin);ADC10CTL0|=ADC10SC;#pragma vector=ADC10_VECTOR_interrupt void ADC10_ISR()bufferi=ADC10MEM;sum=sum+bufferi;i+;if(i=4)vin1=100*(sum/4)*3.4962/1023);vin=(

温馨提示

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

评论

0/150

提交评论