www.Microcontrol.cn 微控设计网 中国MSP430单片机专业网站Simpo PDF Password Remover Unregistered Version - http://www.simpopdf.comwww.Microcontrol.cn 微控设计网 P4OUT=seg[i++]; // 则数码管字型数组下标加1,选择相应的七段字型从 // P4口输出 if (i>9) //如果i大于9,则使i=0 i=0; } } char Key_Pressed(void) //按键函数 { unsigned int i; //声明变量i while(!(P1IN&BIT0)); //当P1输入寄存器P1IN的第0位为0时,开始while循环 for(i=0;i<8000;i++);//延时一段时间,消除按键抖动 if (!(P1IN&BIT0)) //如果P1输入寄存器P1IN的第0位还是0,则返回1,表示按键按下 return 1; else //否则认为按键未按下,返回0 return 0; } 使用AD单通道多次转换,采集P6.0输入的模拟电压值(变化范围:0~3.3V),转换为数字量。建立二维数组和通过顺序查表的方法得出采集回来的电压值。然后通过数码管显示当前电压值,显示跟随输入的模拟电压的变化。由于只有两位数码管,故显示电压值精确到小数点后一位,如当前输入电压2.37V,则显示2.4V。可用万用表检测显示是否准确。 #include \声明库 void Init(void);//声明初始化函数 interrupt [ADC_VECTOR]void ADC12(void); //声明AD转换中断函数 unsigned int Result; 声明变量 unsigned int Table[4][10] = { {0x040,0x0BC,0x138,0x1B4,0x230, 0x2AC , 0x328 , 0x3A4 , 0x420 ,0x49C }, { 0x518 , 0x594 , 0x610 , 0x68C , 0x708 , 0x784 , 0x800, 0x87C , 0x8F8,0x974 }, { 0x9F0 , 0xA6C , 0xAE8 , 0xB64 , 0xBE0 , 0xC5C , 0xC08 , 0xD54 , 0xDD0,0xE4C }, { 0xEC8 , 0xF44 , 0xFC0 , 0xFFF } }; //该数组元素用于与AD转换的电压数值相比较,如果某个数组元素稍大于等于AD转换后的电压数 //值,则将此元素输出 void main(void) //主函数 { P4DIR = 0XFF; //P4口设置为输出 P5DIR = 0XFF; //P5口设置为输出 Init(); //调用初始化函数 _EINT(); //使能中断 ADC12CTL0 |= ENC+ADC12SC; //设置转换控制寄存器ADC12CTL0,ENC=0x002使转换允许位为1, //意味着可以启动转换,同时ADC12TL0中的低电平位可以被修改。 //ADC12SC=0x001使采样/转换控制位为1,如果采样信号SAMPCON由 //采样定时器产生(SHP=1),则ASC12SC=1将产生一次转换 while (1); //无限次的while循环 } void Init(void) //初始化函数 { WDTCTL = WDTPW+WDTHOLD; //关看门狗 P6SEL |= 0x01; // 设置P6口的P6.0引脚为外围模块AD转换器的模拟信号输入引脚 ADC12CTL0 &= ~ENC; //复位转换允许位 ADC12CTL0 = ADC12ON + SHT0_2 + REFON + REF2_5V; // Turn on and set up ADC12 //设置转换控制寄存器ADC12CTL0,ADC12ON=0x010,使ADC12内核工作 //SHT0_2=2*0x100,确定采样周期为4×tADC12CLK×4 //REFON=0x020,内部参考电压打开 //REF2_5V=0x040,选择内部参考电压发生器的电压为2.5V ADC12CTL1 = SHP + CONSEQ_2 ; // 设置AD转换控制寄存器ADC12CTL1 Page 6 of 21 基于模拟前端信号处理与控制技术的专业论坛、网站 例9:将P6口输入的模拟电压AD转换后,从P4、P5口连接的数码管输出。 基于模拟前端信号处理与控制技术的专业论坛、网站www.Microcontrol.cn 微控设计网 中国MSP430单片机专业网站Simpo PDF Password Remover Unregistered Version - http://www.simpopdf.comwww.Microcontrol.cn 微控设计网 // SHP=0x0200 设置SAMPON来自采样定时器,采样信号上升沿触发采样 //CONSEQ_2=2*2 设置工作模式为单通道、多次转换模式 ADC12MCTL0 = SREF_0; //设置通道0的转换存储控制寄存器ADC12MCTL0, //SREF_0=0*0x10 选择参考电压为VR+=AVCC,VR-=AVSS ,因此输入模拟信号 //范围是3.3V~0V。 ADC12IE |= BIT0; //设置中断允许寄存器ADC12IE,将第0位置1,使通道A0转换后产生中断 } interrupt[ADC_VECTOR] void ADC12 (void) //AD转换中断函数 { unsigned char seg_7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //声明无小数点显示的数码管七段字型码数组 unsigned char seg_8[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //声明有小数点显示的数码管七段字型码数组 unsigned i,j; //声明变量数据类型 ADC12CTL0 &= ~ENC; //设置AD转换控制寄存器ADC12CTL0,ENC=0x002,~ENC=0xFFD,停止AD转换 for ( i=0 ; i<4 ;i++) //扫描Table数组行下标 { for (j=0; j<10; j++) //扫描Table数组列下标 { if (ADC12MEM0<=Table[i][j]) goto xxx; //如果Table数组元素大于转换数值,则转到标号xxx } } xxx: {P4OUT = seg_7[j]; //P4口输出 P5OUT = seg_8[i]; } //P5口输出 ADC12CTL0 |= ENC+ADC12SC; // 使能再次转换 } 例10: 模拟比较器实验 接电位器于端口P2.3,用来输入模拟电压值(0~3.3V)。参考电压选取0.5VCC,待测电压由P2.3端输入,如果待测电压大于参考电压,P1.0端口的LED点亮,反之熄灭。 注意:顺时针调节电位器,输入的模拟电压值增大。 #include void main (void) { WDTCTL=WDTPW+WDTHOLD; P3DIR |= BIT0; //P3口的第0引脚为输入 CACTL1 =CARSEL + CAREF1 + CAON;//设置控制寄存器CACTL1, //CARSEL=0x40,设置内部参考电压,当CAEX=0时参考电平加在(-)端 //CAREF1=0x20,选择0.5×VCC作为参考电压 //CAON=0x08, 打开比较器 CACTL2 = P2CA0; //设置控制寄存器CACTL2, //P2CA0=0x04,设置外部引脚信号连接在比较器输入端 while (1) //无限次循环 { if ((CACTL2 & CAOUT )== CAOUT) //CAOUT=0x01,如果比较器输出为1 //若CACTL2寄存器的第0位为1,则表示输入电压 //大于参考电压 P3OUT &= ~BIT0; //则P3的第0引脚输出低电平,相连的发光二极管亮 else P3OUT |= BIT0; //否则,P3的第0引脚输出高电平,相连的发光二极管灭 } } 例11: MSPF149的UART向PC机的RS232串口发送字符串。 单片机UART以9600波特率,8个数据位,无校验位,1个停止位。单片机上电后连续向PC发送字符串,利用串口调试助手可以显示发送的内容。需要发送其他英文会话可以改变Data[]数组内容。 Page 7 of 21 基于模拟前端信号处理与控制技术的专业论坛、网站 基于模拟前端信号处理与控制技术的专业论坛、网站www.Microcontrol.cn 微控设计网 中国MSP430单片机专业网站Simpo PDF Password Remover Unregistered Version - http://www.simpopdf.comwww.Microcontrol.cn 微控设计网 #include void Init(void);//声明初始化函数 char Data[20]=\发送的字符串 void main(void) { unsigned int i; WDTCTL = WDTPW + WDTHOLD; Init(); //调用初始化函数 while(1) //无限次循环 { for(i=0;i<=20;i++) { TXBUF0=Data[i]; //向缓冲器送入待发送数据 while((UTCTL0&0x01)==0); //发送缓冲器有待发数据时,UTCTL0的第0位复位,进入等待 } } } void Init(void) { UCTL0 &= ~SWRST; //USART控制寄存器UCTL0,SWRST=0x01,~SWRST=0xFE,将 //UCTL0寄存器的第0位复位后,USART才能重新被允许 UCTL0 =0X10; //UCTL0的第4位置1,设置数据长度为8位,第5位为0,设置1位停止位 UBR00 = 0x03; //使用32768Hz晶体,波特率为9600 UBR10 = 0x00; UMCTL0 = 0x4A; UTCTL0 = 0X10; //发送控制寄存器,第4位置1,选择辅助时钟ACLK1 ME1 |= UTXE0 ; //设置模块允许寄存器ME1,UTXE0=0x80,设置ME1的第7位为1, //使USART模式发送允许 P3SEL|=BIT4; //P3口选择寄存器的第4位置1,选择外围模块 P3DIR|=BIT4; //P3口方向寄存器的第4位置1,选择输出 } 例12: MSP430F149的USART接受PC键盘输入的数值并显示。 在串口调试助手中的发送区选中:“十六进制发送”和“自动发送”,以十六进制形式,以字节为单位输入某个数字,如03,这样单片机会接受到,送到数码管显示该数字。若连续输入“030205”,单片机其实是接受到了来自PC的以9600波特率,8个数据位,一个停止位的无校验位的字符串,显示器瞬间显示了3、2、5,看到的是最后的数字5。 #include void Init(void); void main (void) { P4DIR=0XFF; //P4口为输出 WDTCTL=WDTPW+WDTHOLD; Init(); _EINT(); while(1); //无限次循环,等待接收中断 } void Init(void) //初始化函数 { UCTL0 &=~SWRST; UCTL0 |=CHAR; //8位数据,1位停止位 UBR00 = 0X03;//9600波特率,32kHz时钟 UBR01 = 0X00; UMCTL0 =0X4A; Page 8 of 21 基于模拟前端信号处理与控制技术的专业论坛、网站 基于模拟前端信号处理与控制技术的专业论坛、网站www.Microcontrol.cn 微控设计网 中国MSP430单片机专业网站Simpo PDF Password Remover Unregistered Version - http://www.simpopdf.comwww.Microcontrol.cn 微控设计网 UTCTL0 |= SSEL0; //SSEL0=0x10,选择辅助时钟ACLK ME1 |= UTXE0+URXE0;//模块允许寄存器ME1 //UTXE0=0x80 发送允许 //URXE0=0x40 接收允许 P3SEL |= BIT4+BIT5; //P3口第4、5引脚供外围模块使用 P3DIR |=BIT4+BIT5; //P3口的第4、5位为输出 IE1 |=URXIE0; //中断允许寄存器IE1,第6位为1,使能接收中断,URXIE0=0x40 } interrupt [UART0RX_VECTOR] void UART0RX (void) //接收中断函数 { unsigned char seg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; unsigned int x=0; { x=RXBUF0; //将接收缓冲器的内容送x, P4OUT=seg[x]; //再送P4口显示 } } 例13: RS232串口通信接收发送数字 发送:从单片机P1、P2口输入按键信号, PC机RS232C口接收。 接收:PC机由RS232C口发送数字时,P4口连接的数码管显示。需要发送十六进制数,例如,十进制数3,应该发送03。 #include void Init(void);//声明初始化函数 void Delay(void);声明延迟函数 void main(void) //主函数 { P1DIR=0X00; //设置P1口方向寄存器P1口作为输入 P1IES=0X00; //设置P1口中断边沿选择寄存器,置1为下跳沿,置0为上跳沿 P1IE=0XFF; //设置P1中断使能寄存器,置1为允许中断,置0为禁止中断 P2DIR=0X00;//设置P2口方向寄存器,置0为输入,置1为输出 P2IES=0X00;//设置P2口中断边沿选择寄存器,置1为下跳沿,置0为上跳沿 P2IE=0XFF; //设置P2中断使能寄存器,置1为允许中断,置0为禁止中断 P4DIR=0XFF; //设置P4口方向寄存器,使P4口为输出 WDTCTL = WDTPW + WDTHOLD; //关看门狗 Init(); //调用初始化函数 _EINT(); //调用C编译器内部函数使能中断 _BIS_SR(LPM1_bits); //调用C编译器内部对状态寄存器某位置位的函数, //LPM_bits=SCG0+CPUOFF, // SCG0=0x0040,进入LPM1低功耗工作模式 // CPUOFF=0x0010 关闭CPU,唤醒所有允许的中断 _NOP(); //调用C编译器内部空操作函数 } void Init(void) //初始化函数 { UCTL0 &= ~SWRST; //USART控制寄存器UCTL0,SWRST=0x01,~SWRST=0xFE,将 //UCTL0寄存器的第0位复位后,USART才能重新被允许 UCTL0 =0X10; //8位数据,1位停止位 UBR00 = 0x03; //9600波特率,32kHz时钟 UBR10 = 0x00; UMCTL0 = 0x4A; UTCTL0 = 0X10; //发送控制寄存器,第4位置1,选择辅助时钟ACLK1 ME1 |= UTXE0+URXE0; //模块允许寄存器ME1 //UTXE0=0x80 发送允许 //URXE0=0x40 接收允许 P3SEL |= BIT4+BIT5; //P3口第4、5引脚供外围模块使用 Page 9 of 21 基于模拟前端信号处理与控制技术的专业论坛、网站 基于模拟前端信号处理与控制技术的专业论坛、网站www.Microcontrol.cn 微控设计网 中国MSP430单片机专业网站Simpo PDF Password Remover Unregistered Version - http://www.simpopdf.comwww.Microcontrol.cn 微控设计网 P3DIR |=BIT4+BIT5; //P3口的第4、5位为输出 IE1 |=URXIE0; //中断允许寄存器IE1,第6位为1,使能接收中断,URXIE0=0x40 } interrupt[PORT1_VECTOR]void PORT1(void) //P1口中断函数 { if(P1IFG&BIT0) //如果中断标志寄存器的第0位为1,则延迟一段时间 {Delay(); //调用延迟函数 if(P1IFG&BIT0)//若如果中断标志寄存器的第0位还为1 {TXBUF0=0X30; //向USART的发送缓冲器送数字“0” P1IFG&=~BIT0;} //清除中断标志 } //如下部分只是向USART发送缓冲器所送数字不同 else if(P1IFG&BIT1) {Delay(); if(P1IFG&BIT1) {TXBUF0=0X31; P1IFG&=~BIT1;}} else if(P1IFG&BIT2) {Delay(); if(P1IFG&BIT2) {TXBUF0=0X32; P1IFG&=~BIT2;}} else if(P1IFG&BIT3) {Delay(); if(P1IFG&BIT3) {TXBUF0=0X33; P1IFG&=~BIT3;} } else if(P1IFG&BIT4) {Delay(); if(P1IFG&BIT4) {TXBUF0=0X34; P1IFG&=~BIT4;}} else if(P1IFG&BIT5) {Delay(); if(P1IFG&BIT5) {TXBUF0=0X35; P1IFG&=~BIT5;}} else if(P1IFG&BIT6) {Delay(); if(P1IFG&BIT6) {TXBUF0=0X36; P1IFG&=~BIT6;}} else if(P1IFG&BIT7) {Delay(); if(P1IFG&BIT7) {TXBUF0=0X30; P1IFG&=~BIT7;}} } interrupt[PORT2_VECTOR]void PORT2(void) //P2口中断函数 { if(P2IFG&BIT0) {Delay(); if(P2IFG&BIT0) {TXBUF0=0X37; P2IFG&=~BIT0;} } Page 10 of 21 基于模拟前端信号处理与控制技术的专业论坛、网站 基于模拟前端信号处理与控制技术的专业论坛、网站