首页资源分类嵌入式开发MSP430 > MSP430实验指导书

MSP430实验指导书

已有 451617个资源

下载专区

文档信息举报收藏

标    签:430单片机

分    享:

文档简介

430的部分功能例程及实验。

文档预览

目录 目 录............................................................................................................................................... 1 实验一 I/O 使用...............................................................................................................................2 实验二 外部中断使用..................................................................................................................... 4 实验三 时钟模块使用..................................................................................................................... 6 实验四 看门狗使用....................................................................................................................... 10 实验五 看门狗定时器使用........................................................................................................... 11 实验六 Timer0 中断使用.............................................................................................................. 15 实验七 Timer0 捕获模式使用...................................................................................................... 17 实验八 Timer0 比较模式使用(PWM 输出)............................................................................ 19 实验九 PWM 输出实现 D/A.........................................................................................................21 实验十 A/D 转换(单通道单次模式)....................................................................................... 25 实验十一 A/D 转换(多通道单次模式)................................................................................... 28 实验十二 A/D 转换(单通道多次模式)................................................................................... 31 实验十三 A/D 转换(多通道多次模式)................................................................................... 34 实验十四 模拟比较器使用........................................................................................................... 37 1 实验一 I/O 使用 (1)基础知识 I/O 相关寄存器功能如下 符号 功能 使用方法 PxDIR 输入/输出方向寄存器 0:输入; 1:输出 PxIN 输入寄存器 读 PxIN 值 PxOUT 输出寄存器 0:输出低; 1:输出高 PxIFG 中断标志寄存器 0:无中断请求;1:有 PxIES 中断触发沿选择寄存器 0:上升沿; 1:下降沿 PxIE 中断使能寄存器 0:禁止中断; 1:允许 PxSEL 功能选择寄存器 0:IO; 1:第二功能 PxREN 上拉/下拉电阻使能寄存器 0:禁止; 1:使能 (2)例程 //硬件连接:P1.0--LED P1.3--KEY //功能:每次按按键改变 LED 状态,即由亮到灭或者由灭到亮 #include"msp430.h" //包含头文件,系统自动匹配对应芯片的头文件 void delay(unsigned int i) { unsigned int j; for(j=0;j0;buf--) { TA0CCR1=buf; delay(10); } } } (3)作业: 硬件连接:P1.2 连接示波器。 功能:用 Timer_A 产生 PWM,在 P1.2 口产生 1KHz,15%占空比矩形波; 20 实验九 PWM 输出实现 D/A (1)基础知识: RC 低通滤波器上限截止频率: fH = 1 2πRC 。 (2)例程: //硬件连接:P1.2 输出经两级 RC 滤波之后接示波器查看波形。 //R1=R2=10K,C1=C2=3.3nF。 //功能:利用 Timer0 的 PWM 输出实现 8 位 D/A。 #include"msp430.h" //P1.2 输出 #define DCOCLK 0x01 #define LFXT1CLK 0x02 #define DIV_1 0x03 #define DIV_2 0x04 #define DIV_4 0x05 #define DIV_8 0x06 void delay(unsigned int i) { unsigned int j; for(j=0;j0;buf0--) { TA0CCR1=buf0; delay(40); } } //产生锯齿波子函数 void juchibo(void) { unsigned int buf0=0; for(buf0=255;buf0>0;buf0--) { TA0CCR1=buf0; delay(40); } } //产生正弦波子函数 void zhengxianbo(void) { unsigned char table[]= {0,2,4,6,8,11,13,15,17,20, 22,24,26,28,30,33,35,37,39,41, 43,45,47,50,52,54,56,58,60,62, 22 64,65,67,69,71,73,75,77,78,80, 82,83,85,87,88,90,92,93,95,96, 98,99,100,102,103,104,106,107,108,109, 110,111,113,114,115,116,116,117,118,119, 120,121,121,122,123,123,124,124,125,125, 126,126,126,127,127,127,127,127,127,127}; unsigned int buf1=0; unsigned char i=0; for(i=0;i<89;i++) { buf1=(unsigned int)(127-table[i]); TA0CCR1=buf1; delay(40); } for(i=89;i>0;i--) { buf1=(unsigned int)(127-table[i]); TA0CCR1=buf1; delay(40); } for(i=0;i<89;i++) { buf1=(unsigned int)(128+table[i]); TA0CCR1=buf1; delay(40); } for(i=89;i>0;i--) { buf1=(unsigned int)(128+table[i]); TA0CCR1=buf1; delay(40); } } int main(void) { WDTCTL=WDTPW+WDTHOLD; set_dco_f(15,3,0); P1DIR|=0x04; P1SEL|=0x04; TA0CCTL1=OUTMOD_3; TA0CCR0=255; TA0CCR1=0; TA0CTL=TASSEL_2+MC_1; //关看门狗 //设置 DCO 频率大约为 15MHz //P1.2 作输出口 //使能 P1.2 输出 PWM //PWM 置位/复位模式 //计数上限为 255 //计数到 TA0CCR1 时置位 //设置定时器 0 23 while(1) { sanjiaobo(); //调用子函数实现波形产生 } } (3)作业: 硬件连接:P1.2 输出经两级 RC 滤波之后接示波器查看波形。 功能:用 Timer_A 产生 PWM,经 RC 低通滤波,在 P1.2 口产生半圆波形, 如下图: 要求:输出半圆波形的频率为 100Hz。 24 实验十 A/D 转换(单通道单次模式) (1)基础知识: 单通道单次模式: 1.参考电压 SREF_0 Vcc SREF_1 内部参考电压 2.若 SREF_0:跳转步骤(5) 3.选择内部参考电压(默认 1.5V) REF2_5V 2.5V 4.开启内部参考电压 REFON 开启 5.开启 ADC ADC10ON 开启 6.ADC 中断 ADC10IE 允许中断 7.以上设置寄存器 ADC10CTL0 8.选择输入通道 INCH_0A0 INCH_1A1 INCH_2A2 INCH_3A3 INCH_4A4 INCH_5A5 INCH_6A6 INCH_7A7 INCH_10 Temperature sensor 9.ADC 时钟分频 ADC10DIV_0 1/1 ADC10DIV_1 1/2 ADC10DIV_2 1/3 ADC10DIV_3 1/4 ADC10DIV_4 1/5 ADC10DIV_5 1/6 ADC10DIV_6 1/7 ADC10DIV_7 1/8 10.时钟源选择 ADC10SSEL_0 ADC10OSC ADC10SSEL_1 ACLK ADC10SSEL_2 MCLK ADC10SSEL_3 SMCLK 11.设置转换模式 25 CONSEQ_0 单通道单次 12.从(8)到(11)设置寄存器 ADC10CTL1 13.设置 ADC 输入口使能 ADC10AE0=0x01 A0 ADC10AE0=0x02 A1 ADC10AE0=0x04 A2 ADC10AE0=0x08 A3 ADC10AE0=0x10 A4 ADC10AE0=0x20 A5 ADC10AE0=0x40 A6 ADC10AE0=0x80 A7 14.转换结果保存在 ADC10MEM 15.执行一次转换 ADC10CTL0|=(ENC+ADC10SC); while((ADC10CTL0&ADC10IFG)==0); ADC_buf=ADC10MEM; (2)例程: //硬件连接:P1.1--模拟电压输入(0~Vcc) //功能:将输入的模拟电压进行 A/D 转换,结果保存在变量 ADC_buf 中。 #include"msp430.h" unsigned int ADC_buf=0; //定义全局变量,保存 ADC 结果 int main(void) { WDTCTL=WDTPW+WDTHOLD; ADC10CTL0=ADC10ON; //VCC 参考电压 //2.5V 参考电压 // ADC10CTL0=SREF_1+REF2_5V+REFON+ADC10ON; //1.5V 参考电压 // ADC10CTL0=SREF_1+REFON+ADC10ON; ADC10CTL1=INCH_1; //CH=A1 ADC10AE0|=0x02; //enable A1 while(1) { ADC10CTL0|=(ENC+ADC10SC); //开启一次转换 //是否转换完成 while((ADC10CTL0&ADC10IFG)==0); ADC_buf=ADC10MEM; //保存结果 } } (3)作业: 硬件连接:P1.0--模拟电压(经电位器分压得到)(0~2.5V) 26 功能:在程序中设置全局变量(float Voltage),将模拟电压经模数转换之后 换算成电压值,保存在该变量中,在在线调试过程中查看该变量值,并用万用表 测量输入的模拟电压,与单片机计算得到的模拟电压值是否一样(在误差允许范 围内)。 27 实验十一 A/D 转换(多通道单次模式) (1)基础知识: 多通道单次模式: 1.参考电压 SREF_0 Vcc SREF_1 内部参考电压 2.多次转换 MSC 3.若 SREF_0:跳转步骤(6) 4.选择内部参考电压(默认 1.5V) REF2_5V 2.5V 5.开启内部参考电压 REFON 开启 6.开启 ADC ADC10ON 开启 7.ADC 中断 ADC10IE 允许中断 8.以上设置寄存器 ADC10CTL0 9.选择输入通道 INCH_0A0 INCH_1A1 INCH_2A2 INCH_3A3 INCH_4A4 INCH_5A5 INCH_6A6 INCH_7A7 INCH_10 Temperature sensor (选择所用通道的最大数) 10.ADC 时钟分频 ADC10DIV_0 1/1 ADC10DIV_1 1/2 ADC10DIV_2 1/3 ADC10DIV_3 1/4 ADC10DIV_4 1/5 ADC10DIV_5 1/6 ADC10DIV_6 1/7 ADC10DIV_7 1/8 11.时钟源选择 ADC10SSEL_0 ADC10OSC ADC10SSEL_1 ACLK ADC10SSEL_2 MCLK ADC10SSEL_3 SMCLK 28 12.设置转换模式 CONSEQ_1 多通道单次 13.从(9)到(12)设置寄存器 ADC10CTL1 14.设置 ADC 输入口使能 ADC10AE0=0x01 A0 ADC10AE0=0x02 A1 ADC10AE0=0x04 A2 ADC10AE0=0x08 A3 ADC10AE0=0x10 A4 ADC10AE0=0x20 A5 ADC10AE0=0x40 A6 ADC10AE0=0x80 A7 15.设置转换次数 如选择了三个通道,每个通道转换一次则 ADC10DTC10=0x03; 16.设置转换结果保存的起始地址 如:ADC10SA=0x250; 17.执行一次转换过程: ADC10CTL0&=~ENC; while(ADC10CTL1&BUSY); ADC10SA=0x250; ADC10CTL0|=(ENC+ADC10SC); while((ADC10CTL0&ADC10IFG)==0); A2_buf=*(unsigned int *)0x250; A1_buf=*(unsigned int *)0x252; A0_buf=*(unsigned int *)0x254; (2)例程: //硬件连接:P1.0,P1.1,P1.2 分别连接模拟电压输入(0~Vcc) //功能:将输入的模拟电压进行 A/D 转换,三个通道的结果分别保存在变量 //A0_buf,A1_buf,A2_buf 中。 #include"msp430.h" int main(void) { unsigned int A0_buf=0; //定义存储结果的变量 unsigned int A1_buf=0; unsigned int A2_buf=0; WDTCTL=WDTPW+WDTHOLD; //关看门狗 //设置 ADC ADC10CTL0=MSC+SREF_1+REF2_5V+REFON+ADC10ON; ADC10CTL1=INCH_2+CONSEQ_1; //设置 A0,A1,A2 作 AD 输入 ADC10DTC1=0x03; //转换三次(每通道一次) ADC10AE0|=0x07; //使能 A0,A1,A2 输入 29 P2DIR=0xff; while(1) { ADC10CTL0&=~ENC; while(ADC10CTL1&BUSY); ADC10SA=0x250; ADC10CTL0|=(ENC+ADC10SC); while((ADC10CTL0&ADC10IFG)==0); A2_buf=*(unsigned int *)0x250; A1_buf=*(unsigned int *)0x252; A0_buf=*(unsigned int *)0x254; //停止转换 //ADC 模块是否忙 //设置保存的位置 //开始一次转换 //转换是否完成 //读取转换完成的值 //以下三条语句没有任何作用,写在这里是因为如果没有以下语句,编译 //器会认为执行完上面语句之后,A0_buf,A1_buf,A2_buf 三个变量已 //经没有任何作用,将释放该三个变量,即在线仿真调试的时候无法查看 //这三个变量的值,加上以下语句之后,变量所占存储空间不被释放,方 //便调试查看。 P2OUT=(unsigned char)A0_buf; P2OUT=(unsigned char)A1_buf; P2OUT=(unsigned char)A2_buf; } } (3)作业: 无。 30 实验十二 A/D 转换(单通道多次模式) (1)基础知识: 单通道多次模式: 1.参考电压 SREF_0 Vcc SREF_1 内部参考电压 2.多次转换 MSC 3.若 SREF_0:跳转步骤(6) 4.选择内部参考电压(默认 1.5V) REF2_5V 2.5V 5.开启内部参考电压 REFON 开启 6.开启 ADC ADC10ON 开启 7.ADC 中断 ADC10IE 允许中断 8.以上设置寄存器 ADC10CTL0 9.选择输入通道 INCH_0A0 INCH_1A1 INCH_2A2 INCH_3A3 INCH_4A4 INCH_5A5 INCH_6A6 INCH_7A7 INCH_10 Temperature sensor 10.ADC 时钟分频 ADC10DIV_0 1/1 ADC10DIV_1 1/2 ADC10DIV_2 1/3 ADC10DIV_3 1/4 ADC10DIV_4 1/5 ADC10DIV_5 1/6 ADC10DIV_6 1/7 ADC10DIV_7 1/8 11.时钟源选择 ADC10SSEL_0 ADC10OSC ADC10SSEL_1 ACLK ADC10SSEL_2 MCLK ADC10SSEL_3 SMCLK 12.设置转换模式 31 CONSEQ_2 单通道多次 13.从(9)到(12)设置寄存器 ADC10CTL1 14.设置 ADC 输入口使能 ADC10AE0=0x01 A0 ADC10AE0=0x02 A1 ADC10AE0=0x04 A2 ADC10AE0=0x08 A3 ADC10AE0=0x10 A4 ADC10AE0=0x20 A5 ADC10AE0=0x40 A6 ADC10AE0=0x80 A7 15.设置转换次数 如转换 32 次: ADC10DTC10=0x20; 16.设置转换结果保存的起始地址 如:ADC10SA=0x250; 17.开始转换: ADC10CTL0&=~ENC; while(ADC10CTL1&BUSY); ADC10SA=0x250; ADC10CTL0|=ENC+ADC10SC; 18.中断服务程序 #pragma vector=ADC10_VECTOR __interrupt void ADC10_ISR(void) { ADC10CTL0&=~ENC; while(ADC10CTL1&BUSY); ADC10SA=0x250; ADC10CTL0|=ENC+ADC10SC; } 19.转换结果保存在以 ADC10SA 为起始地址的存储空间 (2)例程: //硬件连接:P1.1--模拟电压输入(0~Vcc) //功能:将输入的模拟电压进行 A/D 转换,结果保存在 ADC10SA 为起始地址的 //存储空间中。 #include"msp430.h" int main(void) { WDTCTL=WDTPW+WDTHOLD; //关看门狗 ADC10CTL1=CONSEQ_2+INCH_1; //P1.1 作模拟电压输入 //设置 ADC ADC10CTL0=SREF_1+MSC+REF2_5V+REFON+ADC10ON+ADC10IE; ADC10DTC1=0x20; //转换 20 次 32 ADC10AE0|=0x02; //使能 P1.1 作为 AD 输入 ADC10CTL0&=~ENC; while(ADC10CTL1&BUSY); ADC10SA=0x250; ADC10CTL0|=ENC+ADC10SC; //停止转换 //AD 模块是否为忙 //设置结果存储的位置 //开启一次转换 _EINT(); while(1) {} } //使能总中断 #pragma vector=ADC10_VECTOR __interrupt void ADC10_ISR(void) { asm("nop"); ADC10CTL0&=~ENC; while(ADC10CTL1&BUSY); ADC10SA=0x250; ADC10CTL0|=ENC+ADC10SC; } (3)作业: //ADC 中断服务程序 //AD 完成之后进中断 //停止转换 //AD 模块是否为忙 //设置结果存储的位置 //启动一次转换 硬件连接:P1.0--模拟电压(经电位器分压得到)(0~2.5V) 功能:设置单通道多次转换模式,转换通道为 A0,转换次数为 10。将转换 得到的十个结果,经数字滤波(剔除误差很大的错误值,将其余数值取平均值), 传递给全局变量 ADC_result。并检查是否与万用表量得的电压一致。 33 实验十三 A/D 转换(多通道多次模式) (1)基础知识: 多通道多次模式: 1.参考电压 SREF_0 Vcc SREF_1 内部参考电压 2.多次转换 MSC 3.若 SREF_0:跳转步骤(6) 4.选择内部参考电压(默认 1.5V) REF2_5V 2.5V 5.开启内部参考电压 REFON 开启 6.开启 ADC ADC10ON 开启 7.ADC 中断 ADC10IE 允许中断 8.以上设置寄存器 ADC10CTL0 9.选择输入通道 INCH_0A0 INCH_1A1 INCH_2A2 INCH_3A3 INCH_4A4 INCH_5A5 INCH_6A6 INCH_7A7 INCH_10 Temperature sensor (选择所用通道的最大数) 10.ADC 时钟分频 ADC10DIV_0 1/1 ADC10DIV_1 1/2 ADC10DIV_2 1/3 ADC10DIV_3 1/4 ADC10DIV_4 1/5 ADC10DIV_5 1/6 ADC10DIV_6 1/7 ADC10DIV_7 1/8 11.时钟源选择 ADC10SSEL_0 ADC10OSC ADC10SSEL_1 ACLK ADC10SSEL_2 MCLK 34 ADC10SSEL_3 SMCLK 12.设置转换模式 CONSEQ_3 多通道多次 13.从(9)到(12)设置寄存器 ADC10CTL1 14.设置 ADC 输入口使能 ADC10AE0=0x01 A0 ADC10AE0=0x02 A1 ADC10AE0=0x04 A2 ADC10AE0=0x08 A3 ADC10AE0=0x10 A4 ADC10AE0=0x20 A5 ADC10AE0=0x40 A6 ADC10AE0=0x80 A7 15.设置转换次数 如选择了两个通道,每个通道转换 16 次: ADC10DTC10=0x20; 16.设置转换结果保存的起始地址 如:ADC10SA=0x250; 17.开始转换: ADC10CTL0&=~ENC; while(ADC10CTL1&BUSY); ADC10SA=0x250; ADC10CTL0|=ENC+ADC10SC; 18.中断服务程序 #pragma vector=ADC10_VECTOR __interrupt void ADC10_ISR(void) { ADC10CTL0&=~ENC; while(ADC10CTL1&BUSY); ADC10SA=0x250; ADC10CTL0|=ENC+ADC10SC; } 19.转换结果保存在以 ADC10SA 为起始地址的存储空间 (2)例程: //硬件连接:P1.0,P1.1 连接模拟电压输入(0~Vcc) //功能:将输入的模拟电压进行 A/D 转换,结果保存在 ADC10SA 为起始地址的 //存储空间中。 #include"msp430.h" int main(void) { WDTCTL=WDTPW+WDTHOLD; ADC10CTL1=INCH_1+CONSEQ_3; //设置 ADC //关看门狗 //A0,A1 作模拟输入 35 ADC10CTL0=SREF_1+MSC+REF2_5V+REFON+ADC10ON+ADC10IE; ADC10AE0=0x03; //使能 A0,A1 作模拟输入 ADC10DTC1=0x20; //A0,A1 分别转换 16 次 ADC10CTL0&=~ENC; while(ADC10CTL1&BUSY); ADC10SA=0x250; ADC10CTL0|=ENC+ADC10SC; //停止转换 //AD 模块是否为忙 //设置结果保存的位置 //开启一次转换 _EINT(); while(1) {} } //使能总中断 #pragma vector=ADC10_VECTOR __interrupt void ADC10_ISR(void) { asm("nop"); ADC10CTL0&=~ENC; while(ADC10CTL1&BUSY); ADC10SA=0x250; ADC10CTL0|=ENC+ADC10SC; } (3)作业: //ADC 中断服务程序 //停止转换 //AD 模块是否为忙 //设置结果保存的位置 //开启一次转换 硬件连接:自定。 功能:测量电阻值,用在线仿真查看电阻值大小。 要求:AD 转换模式自定,待测量电阻值大小为 5~10K 欧姆,尽可能提高测 量精度。 36 实验十四 模拟比较器使用 (1)基础知识: 模拟比较器设置: 1.设置内部参考电压连接(默认连接比较器负端) CARSEL 连接比较器正端 2.参考电压值 CAREF_0 外部参考电压 CAREF_1 0.25*Vcc CAREF_2 0.50*Vcc CAREF_3 二极管电压 3.打开比较器 CAON 打开 4.中断触发沿(默认上升沿触发) CAIES 下降沿触发 5.中断允许 CAIE 中断允许 6.以上设置寄存器 CACTL1 7.若电压输入连接比较器正端: CACTL2=P2CA0; CA0 CACTL2=P2CA4; CA1 CACTL2=P2CA0+P2CA4; CA2 若电压输入连接比较器负端: CACTL2=P2CA1; CA1 CACTL2=P2CA2; CA2 CACTL2=P2CA1+P2CA2; CA3 CACTL2=P2CA3; CA4 CACTL2=P2CA1+P2CA3; CA5 CACTL2=P2CA2+P2CA3; CA6 CACTL2=P2CA1+P2CA2+P2CA3; CA7 8. 若 比 较 器 正 端 电 压 > 负 端 电 压 则 CACTL2 的 CAOUT 位 置 位 , 反 之 CACTL2 的 CAOUT 位复位。即可用以下语句判断: if(CACTL2&CAOUT) {} (2)例程: //硬件连接:P1.1--模拟电压输入 //功能:若输入的模拟电压<0.25Vcc,则 LED 灭;反之,LED 亮。 #include"msp430.h" int main(void) { WDTCTL=WDTPW+WDTHOLD; P1DIR|=0x01; //关看门狗 //P1.0 作输出口 37 CACTL1=CARSEL+CAREF_1+CAON; //-comp=0.25Vcc CACTL2=P2CA4; //+comp=CA1 while(1) { if(CACTL2&CAOUT) //若 CA1>0.25Vcc P1OUT|=0x01; //LED 亮 else P1OUT&=~0x01; //否则 LED 灭 } } (3)作业: 硬件连接:自定。 功能:测量电容值。 要求:电容值范围为 100nF~1uF。尽可能提高精度。 38

Top_arrow
回到顶部
EEWORLD下载中心所有资源均来自网友分享,如有侵权,请发送举报邮件到客服邮箱bbs_service@eeworld.com.cn 或通过站内短信息或QQ:273568022联系管理员 高进,我们会尽快处理。