www.Microcontrol.cn 微控设计网 中国MSP430单片机专业网站Simpo PDF Password Remover Unregistered Version - http://www.simpopdf.comwww.Microcontrol.cn 微控设计网 else if(P2IFG&BIT1) {Delay(); if(P2IFG&BIT1) {TXBUF0=0X38; P2IFG&=~BIT1;}} else if(P2IFG&BIT2) {Delay(); if(P2IFG&BIT2) {TXBUF0=0X39; P2IFG&=~BIT2;}} else if(P2IFG&BIT3) {Delay(); if(P2IFG&BIT3) {TXBUF0=0X30; P2IFG&=~BIT3;}} else if(P2IFG&BIT4) {Delay(); if(P2IFG&BIT4) {TXBUF0=0X30; P2IFG&=~BIT4;}} else if(P2IFG&BIT5) {Delay(); if(P2IFG&BIT5) {TXBUF0=0X30; P2IFG&=~BIT5; }} else if(P2IFG&BIT6) {Delay(); if(P2IFG&BIT6) {TXBUF0=0X30; P2IFG&=~BIT6;} } else if(P2IFG&BIT7) {Delay(); if(P2IFG&BIT7) {TXBUF0=0X30;P2IFG&=~BIT7;} } } void Delay(void) //延迟函数 { unsigned long i; for(i=500;i>0;i--); } 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口显示,需要PC机发送十六进制数, } //例如数字3,必须输入03 //若要十进制,需要改成P4OUT=seg[x-0x30] 9.2 简单控制类单片机程序 例1: 定时控制程序 说明:彩灯类程序例 Page 11 of 21 基于模拟前端信号处理与控制技术的专业论坛、网站 基于模拟前端信号处理与控制技术的专业论坛、网站www.Microcontrol.cn 微控设计网 中国MSP430单片机专业网站Simpo PDF Password Remover Unregistered Version - http://www.simpopdf.comwww.Microcontrol.cn 微控设计网 #include interrupt[TIMERA0_VECTOR] void Timer_A (void); unsigned data1; void main (void) { unsigned x1,y1; unsigned char seg[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; WDTCTL= WDTPW + WDTHOLD; //设置看门狗控制寄存器,关看门狗 TACTL = TASSEL0 + TACLR; // 设置定时器A控制寄存器, // TASSEL0=0x0100,选择辅助时钟ACLK, // TACLR=0x0004,清除定时器A计数器 CCTL0 = CCIE; //设置捕获/比较控制寄存器,CCIE=0x0010,使能捕获比较中断 CCR0 =16384; //设置捕获/比较寄存器,初始值为16384,对于32768Hz的频率,相当于0.5s P3DIR =0XFF; //P3为输出 TACTL |= MC0; //设置定时器A控制寄存器,MC0=0x0010,使计数模式为增计数 _EINT(); //使能中断,这是一个C编译器支持的内部过程。 //p4初始化 P4DIR=0XFF; P5DIR=0XFF; while(1) //无限次while循环 { x1=data1; //个位 y1=data1/10; //十位 P4OUT=seg[x1]; //显示个位 P5OUT=seg[y1]; //显示十位 //如下是彩灯变化部分,可以按照data1的值,设定多种显示模式 if( data1==0) P3OUT=0XFF; if(data1==1) P3OUT=0X00; if( data1==2) P3OUT=0X55; } } //定时中断 interrupt[TIMERA0_VECTOR] void Timer_A (void) //定时器A的CC0中断处理程序 //TIMERA0_VECTOR=6*2,等于基地址0xFFE0+12=0xFFEC { //P3OUT ^= BIT7; //将P3.7引脚取反,就是使发光二极管闪烁 data1++; if (data1>=3) data1=0; } 例2. 按键中断显示程序 说明:P1、2口按键中断后,P4、5口输出按键值keyvaluep1、keyvaluep2显示数字的例子。 #include void delay(int v); unsigned keyvaluep1; unsigned keyvaluep2; //unsigned v; void main (void) { unsigned seg[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; WDTCTL= WDTPW + WDTHOLD; //设置看门狗控制寄存器,关看门狗 //p3初始化 P3DIR =0XFF; //P3为输出 //p4初始化 Page 12 of 21 基于模拟前端信号处理与控制技术的专业论坛、网站 char 基于模拟前端信号处理与控制技术的专业论坛、网站www.Microcontrol.cn 微控设计网 中国MSP430单片机专业网站Simpo PDF Password Remover Unregistered Version - http://www.simpopdf.comwww.Microcontrol.cn 微控设计网 P4DIR=0XFF; //P4为输出 P5DIR=0XFF; //P5为输出 P1DIR=0x00; // P1口为输入 P2DIR=0x00; // P2 口为输入 P1IFG=0x00; //清除P1口的中断标志 P2IFG=0x00; //清除P2口的中断标志 P1IES=0xff; //设置P1口中断是下降沿触发 P2IES=0xff; //设置P2口中断是下降沿触发 P1IE=0xff; //允许P1口中断 P2IE=0xff; //允许P2口中断 _EINT(); //使能中断,这是一个C编译器支持的内部过程。 while(1) //无限次while循环 { P4OUT=seg[keyvaluep1]; //显示个位 P5OUT=seg[keyvaluep2]; //显示十位 } } void delay(int v) //延时子程序 { while(v!=0) v--; } //以下是port1的中断服务程序 interrupt[PORT1_VECTOR] void PORT1 (void) { unsigned temp1; //局部变量:? //temp暂时存放端口的中断标志寄存器中的值 //temp暂时存放端口的中断标志寄存器中的值 delay(2666); // 消除抖动延时 if ((P1IN&0xff)!=0xff) //如果有键按下 { temp1=P1IFG; //temp1记录中断标志 switch(temp1) { case 1: keyvaluep1=0;break; case 2: keyvaluep1=1;break; case 4: keyvaluep1=2;break; case 8: keyvaluep1=3;break; case 16: keyvaluep1=4;break; case 32: keyvaluep1=5;break; case 64: keyvaluep1=6;break; case 128: keyvaluep1=7;break; //default: keyvaluep1=0;break; } } P1IFG=0X00; //清除中断标志,返回主程序 } //以下是port2的中断服务程序 interrupt[PORT2_VECTOR] void PORT2 (void) { unsigned char temp1; delay(2666); if ((P2IN&0xff)!=0xff) { temp1=P2IFG; switch(temp1) { case 1: keyvaluep2=8;break; case 2: keyvaluep2=9;break; case 4: keyvaluep2=10;break; Page 13 of 21 基于模拟前端信号处理与控制技术的专业论坛、网站 基于模拟前端信号处理与控制技术的专业论坛、网站www.Microcontrol.cn 微控设计网 中国MSP430单片机专业网站Simpo PDF Password Remover Unregistered Version - http://www.simpopdf.comwww.Microcontrol.cn 微控设计网 case 8: keyvaluep2=11;break; case 16: keyvaluep2=12;break; case 32: keyvaluep2=13;break; case 64: keyvaluep2=14;break; case 128: keyvaluep2=15;break; //default: keyvaluep2=0;break; } } P2IFG=0X00; } 例3. 90延时开关程序 说明:当按键P1.0第一次按下时,P3.0和P3.1连接的发光二极管亮,当第二次按下时,一个发光管灭,90秒后全灭。P4、5口输出时间值。 #include interrupt[TIMERA0_VECTOR] void Timer_A (void); interrupt[PORT1_VECTOR] void PORT1 (void) ; void delay(int v); //延时子程序 unsigned data1; unsigned keyvaluep1; void main (void) { unsigned state; unsigned x1,y1; unsigned char seg[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; WDTCTL= WDTPW + WDTHOLD; //设置看门狗控制寄存器,关看门狗 TACTL = TASSEL0 + TACLR; // 设置定时器A控制寄存器, // TASSEL0=0x0100,选择辅助时钟ACLK, // TACLR=0x0004,清除定时器A计数器 CCTL0 = CCIE; //设置捕获/比较控制寄存器,CCIE=0x0010,使能捕获比较中断 CCR0 =16384; //设置捕获/比较寄存器,初始值为16384,对于32768Hz的频率,相当于0.5s TACTL |= MC0; //设置定时器A控制寄存器,MC0=0x0010,使计数模式为增计数 _EINT(); //使能中断,这是一个C编译器支持的内部过程。 P3DIR =0XFF; //P3为输出 P4DIR=0XFF;//P4为输出 P5DIR=0XFF;//P5为输出 P1DIR=0x00; // P1口为输入 P2DIR=0x00; // P2 口为输入 P1IFG=0x00; //清除P1口的中断标志 P2IFG=0x00; //清除P2口的中断标志 P1IES=0xff; //设置P1口中断是下降沿触发 P2IES=0xff; //设置P2口中断是下降沿触发 P1IE=0xff; //允许P1口中断 P2IE=0xff; //允许P2口中断 state=0; keyvaluep1=7; P3OUT=0XFF; while(1) //无限次while循环 { x1=data1; //个位 y1=data1/10; //十位 P4OUT=seg[x1]; //显示个位 P5OUT=seg[y1]; //显示十位 if( state==0 && keyvaluep1==0 ) {P3OUT=0XFC; state=1; keyvaluep1=7;} if(state==1 && keyvaluep1==0) {P3OUT=0XFE; Page 14 of 21 基于模拟前端信号处理与控制技术的专业论坛、网站 基于模拟前端信号处理与控制技术的专业论坛、网站www.Microcontrol.cn 微控设计网 中国MSP430单片机专业网站Simpo PDF Password Remover Unregistered Version - http://www.simpopdf.comwww.Microcontrol.cn 微控设计网 state=2; keyvaluep1=7; data1=0;} if( state==2 && data1==15)//data1应该为90s {P3OUT=0XFF; state=0; keyvaluep1=7; } } interrupt[TIMERA0_VECTOR] void Timer_A (void) //定时器A的CC0中断处理程序 //TIMERA0_VECTOR=6*2,等于基地址0xFFE0+12=0xFFEC { //P3OUT ^= BIT7; //将P3.7引脚取反,就是使发光二极管闪烁 data1++; if (data1>=91) data1=0; } void delay(int v) //延时子程序 { while(v!=0) v--; } //以下是port1的中断服务程序 interrupt[PORT1_VECTOR] void PORT1 (void) { unsigned temp1; //局部变量://temp暂时存放端口的中断标志寄存器中的值 delay(2666); // 消除抖动延时 if ((P1IN&0xff)!=0xff) //如果有键按下 { temp1=P1IFG; //temp1记录中断标志 switch(temp1) { case 1: keyvaluep1=0;break; case 2: keyvaluep1=1;break; case 4: keyvaluep1=2;break; case 8: keyvaluep1=3;break; case 16: keyvaluep1=4;break; case 32: keyvaluep1=5;break; case 64: keyvaluep1=6;break; case 128: keyvaluep1=7;break; //default: keyvaluep1=0;break; } } P1IFG=0X00; //清除中断标志,返回主程序 } 例4. 乡村小路交叉大路的交通灯程序 说明:小路有传感器p1.0,有车时,两路按照时间交换红绿灯,无车时,大路一直绿灯,小路绿灯时,若无车立即向小路红灯、大路绿灯转换。 #include interrupt[TIMERA0_VECTOR] void Timer_A (void); void Key(void); void delay(int v); //延时子程序 unsigned data1;//全局变量,用于传递时间信值 unsigned data2; //全局变量,用于传递计满数就停止计数的时间值 unsigned kk; void main (void) { unsigned state; unsigned x1,y1; Page 15 of 21 基于模拟前端信号处理与控制技术的专业论坛、网站 基于模拟前端信号处理与控制技术的专业论坛、网站