1、编者寄语:假期出参加 TI 竞赛,把所有的程序都写出来了,或许有些你没看懂,欢迎加扣 273948017 咨询,430 爱好者一个,作为新手从我这里学起把!或许我有些不好的地方,望大家谅解!/简单输出流水灯程序#include “msp430g2553.h“unsigned int i=8000;int main( void )/ Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;/看门狗不解释P1DIR=BIT6+BIT0;/设置 p1 输出while(1)/可以多加一些灯P1OUT=BIT0;whil
2、e(i-);/P1.0 灯亮P1OUT=BIT6;while(i-);/P1.6 灯亮/独立按键程序/p1.0 为 led,p1.3 为按键#include “msp430g2553.h“int main( void )/ Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;/看门狗不解释P1DIR=BIT0;/P1.0 为 led,显示按键起作用P1OUT=BIT0+BIT3;/P1IN 低电平跳转P1REN=BIT3;/上拉电阻,缺了好像不能用while(1)if(P1IN/led 亮else P1OU
3、T=BIT3;/led 灭P1 口中断#include unsigned char flag=0; /任务标志void Iint_Port1(void); /函数声明void main(void) WDTCTL=WDTPW+WDTHOLD; /关闭看门狗Iint_Port1(); /初始化 p1.0_EINT(); /开总中断允许while(1)LPM3; /进入低功耗模式 3,I/O 口中断可将其唤醒if(!flag) P1OUT=BIT0; /中断服务程序else if(flag) P1OUT=BIT6; /其他任务#include unsigned char flag=0; /任务标志v
4、oid Iint_Port1(void); /函数声明void main(void) WDTCTL=WDTPW+WDTHOLD; /关闭看门狗Iint_Port1(); /初始化 p1.0_EINT(); /开总中断允许while(1)LPM3; /进入低功耗模式 3,I/O 口中断可将其唤醒if(!flag) P1OUT=BIT0; /中断服务程序else if(flag) P1OUT=BIT6; /其他任务#pragma vector=PORT1_VECTOR_interrupt void Port_1(void) P1IFG=0; /多源中断,需靠软件清除 P1IFGflag=1; /置
5、任务标志_BIC_SR_IRQ(LPM3_bits); /将 CPU 从睡眠模式唤醒void Iint_Port1(void) P1DIR|=BIT0+BIT6;P1OUT=BIT0; P1DIR /设置为输入方向P1SEL /设置为普通 I/O 口功能P1IES|=BIT3; /选择下降沿触发P1IE|=BIT3; /打开中断允许P1IFG=0; /P1IES 的切换可能使 P1IFG 置位,需清除 P1IFG=0; /多源中断,需靠软件清除 P1IFGflag=1; /置任务标志_BIC_SR_IRQ(LPM3_bits); /将 CPU 从睡眠模式唤醒void Iint_Port1(vo
6、id) P1DIR|=BIT0+BIT6;P1OUT=BIT0; P1DIR /设置为输入方向P1SEL /设置为普通 I/O 口功能P1IES|=BIT3; /选择下降沿触发P1IE|=BIT3; /打开中断允许P1IFG=0; /P1IES 的切换可能使 P1IFG 置位,需清除/ 端口 1 的中断服务历程 #pragma vector=PORT1_VECTOR _interrupt void Port_1(void) P2OUT = 0x01; / P1.0 状态翻转 P1IFG / P1.4 中断标志清零 /ADC#include “io430.h“#define uint unsig
7、ned int #define uchar unsigned charuint ad;void delayl(uint n)uint j,k;for(j=n;j0;j-)for(k=100;k0;k-);void dis(uint x,uint y,uint z)P1DIR=0xff;P1OUT=0x00;P2OUT=0x07;P2OUT|=BIT3;P1OUT=x;P2OUTdelayl(1);P2OUT|=BIT0;P1OUT=y;P2OUTdelayl(1);P2OUT|=BIT1;P1OUT=z;P2OUTdelayl(1);P2OUT|=BIT2;P2OUTvoid adc() ui
8、nt i,j=10;P1DIR=0x00;P1REN=0xff;P1OUT=0x00;/P2OUT/for(i=511;i0;i-)P2OUT=BIT1;while(j-);ad=P1IN;P1REN=0x00;int main( void )uint x,y,z;/ Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;P2DIR=0xff;P2OUT=0x07;P2REN=0x07;while(1)/ad=345;adc(); x=ad/100;y=ad/10%10;z=ad%10;dis(x,y,z);
9、比较器 a比较器 A 模块 以下图可以看出比较器 A 的结构大概可以分 4 部分构成,分别为模拟输入,比较器 A 核心,低通虑波器,基准电压部分和中断部分组成。首先,整个比较器 A 的工作必需由 CAON 位置为 1 时才能工作的,此位属 CACTL1 控制寄存器。单片机上电时此位是为 0 的,也就是说比较器是不工作的。以下大概讲述几个部分电路的功能和一些相关信息。模拟输入电路:外部模拟引脚信号 CA0,CA1(正负端)可以分别由 P2CA0,P2CA1 位控制开或关。经过软件的设置可以分别与内部的几个基准电压进行比较(0.5VCC,0.25VCC, 三极管门值电压)或外部其中的电压进行比较。
10、应用的硬件比较可以分为以下三种组合:两个外部引脚输入信号进行比较其中一个外部引脚信号与内部的 0.5VCC 或 0.25VCC 比较其中一个外部引脚信号与内部基准电压比较参考电压发生器参考电压电路是可以由 CARSEL,CARERF0,CARERF1 位来控制电压的产生。通过软件设置可以选择几种电压输出到比较器的输入中作为比较,当然此参考电压也可以通过单片机的引脚往外部提供参考电压之用。比较器 A 核心比较器 CAON 位控制开关,CAEX 位控制位控制方向。低通虑波器低通虑波器只需一个 CAF 位来控制此虑波器的功能开与关。此虑波器功能是用于消除比较器输出信号的毛剌,以保证信号的质量和中断请
11、求的可靠性。中断请求比较器 A 模块是具有中断功能的,如比较器功能 CAIE 中断允许开了,在 CAIF 信号产生时将生产中断(当然 GIE 要为 1 时)。比较器 A 模块是具有中断独立向量的,是一个单独的中断,CUP 接受请求后会硬件自动清除中断标志位 CAIFG。比较器模块相关寄存器说明CACTL1 比较器控制寄存器 1CAEX: 控制内部比较器 A 的输入信号和输出信号的方向CARSEL:控制内部参考电压加到比较器 A 的正输入端还是负输入端 由结构图可以看出,CAEX,CARSEL 在不同设置时,比较器 A 输入端的所加的参考电压是有不同的.请参考以下列表:- CARSEL CAEX
12、 参考电压接入端0 0 内部参考源加到比较器的正端0 1 内部参考源加到比较器的负端 1 0 内部参考源加到比较器的负端 1 1 内部参考源加到比较器的正端CAREF1, CAREF0 选择参考源:0 使用外部参考1 选择 0.25VCC 为参考电压2 选择 0.5VCC 为参考电压3 选择二极管电压为参考电压,须参见具体 IC 的资料CAON: 控制比较器 A 的打开与关闭0 关闭比较器工作1 打开比较器工作CAIES: 中断边沿触发模式选择0 上升沿使中断标志 CAIFG 置位1 下降沿使中断标志 CAIFG 置位CAIE:比较器中断允许0 禁止中断1 允许中断CAIFG: 比较器中断标志
13、0 没有中断请求1 有中断请求标志信号CACTL2 比较器控制寄存器 2P2CA1:控制输入端 CA10 外部引脚信号不与比较器 A 连接1 外部引脚信号与比较器 A 连接P2CA0:控制输入端 CA00 外部引脚信号不与比较器 A 连接1 外部引脚信号与比较器 A 连接CAF: 选择比较器输出端是否经过 RC 低通滤波器0 开通 RC 低通滤波器1 直通信号CAOUT: 比较器 A 输出的信号0 CA0 小于 CA11 CA0 大于 CA1CAPD 端口禁止寄存器比较器 A 模块的输入输出与 IO 口共用引脚,可以控制 IO 端口输入缓冲器的通断开关.CAPD 控制位初始化为 0,则端口输入
14、缓冲器有效.当相应位为 1 时,端口输入缓冲器无效。程序范例:#include void main (void)WDTCTL = WDTPW + WDTHOLD; / 停止 WDTCAPD |= 0x08; / 断开与 IO 端口输入CACTL2 = P2CA0; / 设置 P2.3 为+compCCTL0 = CCIE; / CCR0 允许中断TACTL = TASSEL_2 + ID_3 + MC_2; / SMCLK/8,计数模式_EINT(); / 开总中断while (1) / 循环CACTL1 = 0x00; / 没有参考电压_BIS_SR(LPM0_bits); / 进入 LPM
15、0CACTL1 = CAREF0 + CAON; / 0.25*Vcc=P2.3, 比较器开_BIS_SR(LPM0_bits); / 再次进入 LPM0CACTL1 = CAREF1 + CAON; / 0.5*Vcc=P2.3, 比较器开_BIS_SR(LPM0_bits); / 再次进入 LPM0CACTL1 = CAREF1 + CAREF0 + CAON; / 0.55V on P2.3,比较器开_BIS_SR(LPM0_bits); / 再次进入 LPM0/ Timer A0 interrupt service routine#pragma vector=TIMERA0_VECTO
16、R_interrupt void Timer_A (void)_BIC_SR_IRQ(LPM0_bits); /退出 LMP0 模式定时器中断#include “msp430g2553.h“#include int i;void main(void)WDTCTL = WDTPW + WDTHOLD; / Stop WDTP1DIR |= 0x01; / P1.0 outputCCTL0 = CCIE; / CCR0 interrupt enabledCCR0 = 50000;TACTL = TASSEL_2 + MC_2; / SMCLK, contmodei=0;_BIS_SR(LPM0_b
17、its + GIE); / Enter LPM0 w/ interrupt/ Timer A0 interrupt service routine#pragma vector=TIMER0_A0_VECTOR_interrupt void Timer_A (void)if(i20)P1OUT = 0x01; / Toggle P1.0/CCR0 += 50000; / Add Offset to CCR0i=0;i+; /7528#include unsigned int i=1;void xie()P1DIR |= 0xff; / P1.0 outputP2DIR|=0x07; P2OUT/
18、选中 DACAP1OUT=i;P2OUT|=0x01;/选中 DACBP1OUT=i;P2OUT|=0x02;/禁止写入P2OUT|=0x04;/void main(void)WDTCTL = WDTPW + WDTHOLD; / Stop WDTxie();while(1)P1DIRP1REN=BIT3;P1OUT|=BIT3;if(!(P1INP1OUT=BIT6;/按键中断#include void main(void)WDTCTL = WDTPW + WDTHOLD; / Stop watchdog timerP1DIR |= 0x01; / Set P1.0 to output di
19、rectionP1OUT = 0x08; / P1.3set, else resetP1REN |= 0x08; P1IE |= 0x08; / P1.3 interrupt enabledP1IES |= 0x08; / P1.3 Hi/lo edgeP1IFG / P1.3 IFG cleared_BIS_SR(LPM4_bits + GIE); / Enter LPM4 w/interrupt/ Port 1 interrupt service routine#pragma vector=PORT1_VECTOR_interrupt void Port_1(void)P1OUT = 0x
20、01; / P1.0 = toggleP1IFG / P1.4 IFG cleared /1602#include “io430.h“#include “in430.h“#define uint unsigned int#define uchar unsigned char uchar table=“kaigeshuaiqi“;uchar table1=“hello welcome“;uint m=1;void delay(uint z)uint i,j;for(i=z;i0;i-)for(j=100;j0;j-);void write_com(uchar com) /写入P2OUT /LCD
21、 选择输入命令P1OUT=com; /向 P0 口输入命令delay(5); /延时P2OUT|=BIT5; /打开 LCD 使能delay(5); /一个高脉冲P2OUT /关闭 LCD 使能void write_data(uchar date)P2OUT|=BIT4; /设置为输入数据P1OUT=date; /将数据赋给 P0 口delay(5); /延时P2OUT|=BIT5; /置高delay(5); /高脉冲P2OUT /置低完成高脉冲void init()P2OUT write_com(0x38); /设置 16x2 显示 5x7 点阵,8 位数据接口write_com(0x0c)
22、; /设置开始显示不显示光标write_com(0x06); /写一个字符后地址指针加 1write_com(0x01); /显示清零数据指针清零void dis(uint x)uint y,z,k;y=x/100;z=x/10%10;k=x%10;write_com(0x86); /将数据指针第一行第一个字处,write_data(y+0);write_data(z+0);write_data(k+0);delay(100);int main( void )uint num;/ Stop watchdog timer to prevent time out resetWDTCTL = WDT
23、PW + WDTHOLD;P1DIR=0xff;P2DIR=0xff;P2OUTwhile(1)init();write_com(0x84); /将数据指针第一行第一个字处,for(num=0;num999)num=0;/while(1)for(num=0;num#include “lcd12864.h“#include “lcd12864.c“unsigned char const t=“床前明月光, “举头望明月, “凝是地上霜。 “低头思故乡。 “ ;void main()WDTCTL = WDTPW + WDTHOLD;P1DIR|=0xff;P2DIR|=0xff;P2SEL=0;i
24、o_init();lcd_init ();chn_disp1(t);/Write_Num(0x86,767,0);while(1);*LCD12864 程序程序说明:本程序为带字库的 LCD12864 驱动程序,选择 LCD12864 的串口工作模式。利用本程序 LCD12864 可显示汉字、数字和数组。*/ MSP430G2433 LCD12864/ +-+ +-+/ | | | |/ | | | | / | | | RS|-VCC/ | P2.6|R/W |/ | P2.7|CLK | / | | | | / | | | RST|-VCC/ | | | |/ | | | PSB|-GND/
25、 | | | | / +-+ +-+/*#include “msp430G2553.h“#include “LCD12864.h“unsigned int Disp_Tab8;/* 名 称:io_init(void)* 功 能:LCD12864 所用的 IO 口初始化* 入口参数:无* 出口参数:无*/void io_init(void)P2SEL P2DIR |= BIT6+BIT7;/P1OUT =0;P1SEL = 0xFF;/P1SEL|=BIT6;P1DIR = 0;/* 名 称:wr_lcd(uchr func,uchr data)* 功 能:往 LCD12864 写入一个字节。f
26、unc=comm,则写入的是命令;func=commdat,则写入的是数据* 入口参数:func 和 data* 出口参数:无*/void wr_lcd(uchr func,uchr data)uchr i,i1,i3,i2,CF;SID_H;for(i=0;i=0;i-) /拆分数字if(i=(5-point) /小数点DispBuffi=.;elseDispBuffi=(Num%10)+0x30;Num/=10;for(i=0;i#define uint unsigned int uint j=1000,k,p,m;uint x=0x04,0x01,0x08,0x10,0x20,0x80,
27、0x02,0x80,0x20,0x10,0x08,0x01,0x04,0x25,0x8c,0x16,0x25,0x8c,0x16,0x8c,0x25,0x16,0x8c,0x25,0x16,/50xBf,0xBf,0xBf,0xBf,0xBf,0X80,0X20,0X10,0X08,0X01,0X02,0X02,0X80,0X20,0X10,0X08,0X01,0X02,0X02,0X80,0X20,0X10,0X08,0X01,0X02,/100X04,0X04,0X04,0XFF,0XFF,0XFF,0XFF,0XFF,0X04,0X04,0X04,0X1D,0X04,0X04,0X04,
28、0XB4;uint y=0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,/50xfe,0xfb,0xfd,0xfb,0xfe,0XFE,0XFE,0XFE,0XFE,0XFE,0XFE,0XFB,0XFB,0XFB,0XFB,0XFB,0XFB,0XFB,0XFD,0XFD,0XFD,0XFD,0XFD,0XFD,0XFD,/100XFD,0XFB,0XFE,0XFE,0XFB,0XFD,0XF
29、B,0XFE,0XFE,0XFB,0XFD,0XFD,0XFE,0XFB,0XFD,0XFD;void delayl(uint i)uint j,k;for(j=i;j0;j-)for(k=100;k0;k-);void main(void)uint i;WDTCTL = WDTPW + WDTHOLD; / Stop watchdog timerP1DIR |= 0xff;P2DIR=0x07;/ Set P1.0 to output direction/ P1.3set, else resetP2REN |= 0; P2IE |= BIT3+BIT5+BIT4; / P1.3 interr
30、upt enabledP2IES |= BIT3+BIT5+BIT4; / P1.3 Hi/lo edgeP2IFG / P1.3 IFG cleared_BIS_SR(GIE);while(1)for(i=0;iunsigned int i=200;void main(void)WDTCTL = WDTPW + WDTHOLD; / Stop WDTP1DIR |= 0x05; P1OUT |= 0x08;P1REN |= 0x08; P1IE |= 0x08; / P1.3 interrupt enabledP1IES |= 0x08; TACTL = TASSEL_1 + MC_1; /
31、 P1.3 Hi/lo edgeP1IFG / P1.3 IFG cleared/ P1.2 and P1.3 outputP1SEL |= 0x04; / P1.2 and P1.3 TA1/2 optionsCCR0 = 512-1; / PWM PeriodCCTL1 = OUTMOD_7; / CCR1 reset/setCCR1 = i; / CCR1 PWM duty cycle/ ACLK, up mode/ Set P1.0 to output direction/ P1.3set, else reset_BIS_SR(LPM3_bits + GIE); / Enter LPM
32、4 w/interrupt/ Port 1 interrupt service routine#pragma vector=PORT1_VECTOR_interrupt void Port_1(void)P1OUT = 0x01;i=i-10;if(i=0)i=200; / P1.0 = toggleP1IFG CCR1 = i; / P1.4 IFG cleared/ACLK = TACLK = 32768, MCLK = SMCLK = DCO = 1.048576MHz/1602#include “msp430g2553.h“#define uint unsigned int#defin
33、e uchar unsigned char uchar table=“kaigeshuaiqi“;uchar table1=“hello welcome“;uint m=1;uint num;void ad(void);void delay(uint z)uint i,j;for(i=z;i0;i-)for(j=100;j0;j-);void write_com(uchar com) /写入P1OUT /LCD 选择输入命令P2OUT=com; /向 P0 口输入命令delay(5); /延时P1OUT|=BIT0; /打开 LCD 使能delay(5); /一个高脉冲P1OUT /关闭 LC
34、D 使能void write_data(uchar date)P1OUT|=BIT1; /设置为输入数据P2OUT=date; /将数据赋给 P0 口delay(5); /延时P1OUT|=BIT0; /置高delay(5); /高脉冲P1OUT /置低完成高脉冲void init()P1OUT write_com(0x38); /设置 16x2 显示 5x7 点阵,8 位数据接口write_com(0x0c); /设置开始显示不显示光标write_com(0x06); /写一个字符后地址指针加 1write_com(0x01); /显示清零数据指针清零void dis(uint x)uint
35、 y,z,k;P1DIR=0xff;P2DIR=0xff;P2SEL=0;y=x%1000/100;z=x/10%10;k=x%10;write_com(0x86); /将数据指针第一行第一个字处,write_data(y+0);write_data(.);write_data(z+0);write_data(k+0);delay(100);int main( void )double j;/ Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;while(1)ad();j=num*350.0/1024;d
36、is(j);void delayl(uint n)uint j,k;for(j=n;j0;j-)for(k=100;k0;k-);void ad()WDTCTL = WDTPW + WDTHOLD; / Stop WDTADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE; / ADC10ON, interrupt enabledADC10CTL1 = INCH_4; / input A1ADC10AE0 |= 0x10; / PA.1 ADC option selectP1DIR=0x00; / Set P1.0 to output directionP2DI
37、R=0xff;for (;ADC10MEM unsigned int start,end;unsigned char overflow;void main (void)WDTCTL = WDTPW+WDTHOLD; /关闭看门狗定时器P1DIR = BIT0+BIT4; /设置 P1.0 方向为输出P1SEL = BIT2; /设置 P1.2 端口为功能模块使用 TACTL = TASSEL0+TACLR+TAIE+MC1; /定时器 A 时钟信号选择 ACLK,同时设置定时器 A 计数模式为连续增计模式CCTL1 = MC0+SCS+CAP+CCIE; /输入上升沿捕获,CCI0A 为捕获信
38、号源_EINT(); /中断允许while(1); /LOOP #pragma vector=TIMERA1_VECTOR /定时器 A 中断处理_interrupt void timer_a(void)switch(TAIV) /向量查询 case 2: /捕获中断if(CCTL1 /更变设置为下降沿触发start=TAR; /记录初始时间overflow=0; /溢出计数变量复位else if (CCTL1 /更变设置为上升沿触发end=TAR; /用 start,end,overflow 计算脉冲宽度 break;case 10: /定时器溢出中断overflow+;break; /溢出
39、计数加 1default:break; /74hc164#include “msp430g2553.h“#define uchar unsigned char#define uint unsigned intuint y=5;void xie(uchar x) uchar m,n; for(m=0;m#define uchar unsigned char#define uint unsigned intvoid main()WDTCTL=WDTPW+WDTHOLD;BCSCTL1 = CALBC1_1MHZ;DCOCTL =CALDCO_1MHZ;P1SEL |=BIT1+BIT2;P1SEL
40、2 |=BIT1+BIT2;UCA0CTL1 |=UCSSEL_2;UCA0BR0=104;UCA0BR1=0;UCA0MCTL =UCBRS0;UCA0CTL1 IE2 |=UCA0RXIE;_bis_SR_register(LPM0_bits+GIE);#pragma vector=USCIAB0RX_VECTOR_interrupt void uart()while(!(IFG2 UCA0TXBUF = UCA0RXBUF;/两路 PWM#includevoid main() WDTCTL = WDTPW + WDTHOLD; P2DIR |= BIT0+BIT1+BIT4;P2SEL
41、|= BIT0+BIT1+BIT4;TA1CCR0 |=250; TA1CCTL1 |= OUTMOD_7;TA1CCR1 |= 150; TA1CCTL2 |=OUTMOD_7; TA1CCR2 |=75; TA1CTL = TASSEL_1 + MC_1;while(1);/案件 PWM#includevoid main(void)WDTCTL=WDTPW+WDTHOLD; /停止看门狗P1DIR |=BIT6; /设 P1.6 为输出P1SEL |=BIT6; /设 P1.6 为模块功能TACTL=TASSEL_2+MC_1; /时钟源选择 smCLK 定时器 A 增计数模式TACCR0
42、=8000; /装入 PWM 周期值,周期越小,我们看到的不亮的时间就越短,相当于没有作用,就像交流电一样,TACCTL1=OUTMOD_7; /设 CCR1 输出单元为复位/置位输出模式TACCR1=1000; /装入 CCR1PWM 的占空值,改变占空比改变电压大小,调速P1REN=BIT3;P1DIRP1IE=BIT3;P1IES=BIT3;P1IFG=0X00;_EINT();while(1);#pragma vector=PORT1_VECTOR_interrupt void Port_1(void)unsigned int i; /定义延时常数for(i=8000;i0;i-); /延时,消抖if (P1IFG /低电平时间不变elseTACCR1=TACCR1+1000;/如果 P1.0 的按键确实是按下了一次,则低电平时间增长一次,P4.0 的发光亮度增强一次P1IFG=0X00; /清除按键中断标志/按键扫描#includeunsigned int i,j,a,b=5000;int KEY() P1DIR |= 0X07; P1REN=0xf8;P1SEL =0;for( i=0;ivoid main(void)volatile unsigned int i;WDTCTL = WDTPW + WDTHOLD;P1DIR |= BIT0 + BIT4; /设置