msp430程序模块

更新时间:2024-04-02 19:12:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

1、时钟初始化

/*msp430f169时钟初始化*/ void Init_bas_clk() {unsigned int i;

BCSCTL1 &=~XT2OFF;//开高速晶振

//BCSCTL1 |= XTS; 此项不要设置,因为单片机LFXT1外接32768Hz不是高速晶振

BCSCTL2 |=SELM_2+DIVM_1+SELS+DIVS_3;//MCLK选择高速晶振,两分频,SMCLK选择高速晶振8分频

do /*起振需在寄存器设置之后*/ {

IFG1 &= ~OFIFG; // 清除振荡器失效标志 for(i = 0Xff;i > 0;i--); // 稳定时间

} while((IFG1 & OFIFG)!= 0); // 如果振荡器失效标志存在

IFG1 &=~OFIFG; // 清除振荡器失效标志 }

2、ADC12初始化

A1、/*ADC12序列通道多次转换*/

void Init_ADC12_SequenceChannelSequenceConvert(void) {

P6SEL|=0x0f;//选择通道A0~A3

ADC12CTL0 &=~ENC;//在ENC=0时修改寄存器值

ADC12CTL0 |=ADC12ON+MSC;//打开ADC12设置MSC(多次转换时必须设置)

ADC12CTL1 |=ADC12SSEL_0+CONSEQ_3+CSTARTADD_0+SHP;

ADC12MCTL0 |=SREF_0+INCH_0; // 参考电压:V+=AVcc,V-=AVss ADC通道:A0

ADC12MCTL1 |=SREF_0+INCH_1; // 参考电压:V+=AVcc,V-=AVss ADC通道:A1

ADC12MCTL2 |=SREF_0+INCH_2; // 参考电压:V+=AVcc,V-=AVss ADC通道:A2

ADC12MCTL3 |=SREF_0+INCH_3+EOS; // 参考电压:V+=AVcc,V-=AVss ADC通道:A3

ADC12IE=0x08; // 中断允许 只开最后一个通道中断 _EINT(); //开总中断

ADC12CTL0 |=ENC+ADC12SC; // 转换使能开始转换 }

A2、/*ADC12中断向量设置 */

#pragma vector = ADC_VECTOR

__interrupt void ADC12_IRQ(void) {

value0[count]=ADC12MEM0;/*数组value已经定义过*/ value1[count]=ADC12MEM1; value2[count]=ADC12MEM2; value3[count]=ADC12MEM3; count++;

if(count==10) {

flag=1; count=0;

ADC12CTL0 &=~ENC; } }

B1、// ADC12单通道多次转换

void Init_adc(void) {

P6SEL=BIT4; //通道A4 // ADC12控制寄存器设置

// 对于多次转换需要设置MSC

ADC12CTL0 = ADC12ON + SHT0_2 + MSC;

// CONSEQ_2表示当前模式为单通道多次转换, 转换地址为ADC12MCTL4 ADC12CTL1 = ADC12SSEL_0 + SHP + CONSEQ_2 + CSTARTADD_4; // 转换通道设置

ADC12MCTL4 = SREF_0 + INCH_4 + EOS; // 参考电压:V+=Vref+,V-=AVss ADC通道:A4 // 中断允许

ADC12IE = 0x0010; _EINT(); // 启动转换

ADC12CTL0 |= ENC + ADC12SC; // 转换使能开始转换 }

B2、/*单通道多次转中断设置*/

// ADC12中断向量

#pragma vector = ADC_VECTOR __interrupt void ADC12_IRQ(void) {

value[i]=ADC12MEM4; i++;

if(i==10)

{

i=0; flag=1;

for( j=0;j<=9;j++) {

temp +=value[j]; }

XV=(unsigned long)(temp/10); XV=(unsigned long)(XV*3300/4095); Disp_ShuZhi(0x94,XV); ADC12CTL0 &=~ENC; } }

C1、/*单通道单次转换*/

void Init_ADC() {

P6SEL=BIT0; //通道A0 ADC12CTL0 &=~(ENC); // ADC12控制寄存器设置

// 内核开启, 启动内部基准, 选择2.5V基准, 设置采样保持时间 ADC12CTL0 = ADC12ON + REFON + REF2_5V + SHT0_2;

// 时钟源为内部震荡器, 出发信号来自采样定时器, 转换地址为ADC12MCTL4

ADC12CTL1 = ADC12SSEL_0 + SHP + CSTARTADD_4;//选择时钟ADC12OSC内部时钟,若选择其他时钟则在两次转换之间需要翻转ENC

//脉冲采样模式ADC12SC自动复位

// 转换通道设置

ADC12MCTL4 = SREF_1 + INCH_0; // 参考电压:V+=Vref+,V-=AVss ADC通道:A0

// 启动转换

ADC12CTL0 |= ENC + ADC12SC; // 转换使能开始转换

while((ADC12IFG & 0x0010) == 0); // 软件查询中断标志, 等待转换结束 }

3、DAC初始化

void Init_DAC() {

ADC12CTL0=REF2_5V+REFON; //使用内部参考电压2.5V // 效验DAC

DAC12_0CTL |= DAC12CALON; // 启动效验

DAC

while((DAC12_0CTL & DAC12CALON) != 0){_NOP();} // 等待效验完成

// 控制寄存器设置

// 选择输入缓冲器中速中电流,输出缓冲器中速中电流,12位DAC,满电压输出为内基准,自动更新数据

DAC12_0CTL = DAC12AMP_5 + DAC12IR + DAC12LSEL_0; //输入缓冲器中速中电流,输出缓冲器中速中电流 DAC12的满量程为参考电压 DAC12_0CTL |= DAC12SREF_1;//参考电压选择 Vref+

DAC12_0CTL |= DAC12ENC; // 启动DAC模块(DAC12LSEL_0时此句可以省)

DAC12_0DAT = start; // 初始化电压 1V 0db }

4、键盘模块

#define Const 100

unsigned char key_Flag,key_Pressed; unsigned int key_val;

void delay_ms(int t) //延时 当tm=750,Const=198时延时1S {

//while(t) t--; int j,k;

for(j=0;j

for(k=0;k

void Init_Keypad(void) {

P5DIR = 0xf0; //P5.0~P5.3设置为输入状态, P5.4~P5.7设置为输出状态

key_Flag = 0; key_Pressed = 0; key_val=0; }

void Check_Key() {

P5DIR=0xf0;

unsigned int k,row,col,shuchu,jianzhi=0; k=0x08;

shuchu=0x8f;

for(row=0;row<=3;row++) //*********************扫描行****************

{

P5OUT=~shuchu;

for(col=0;col<=3;col++) //****************扫描哪一列有键按下*********** {

if((P5IN&k)==0x00) //有键按下,延时、消抖 delay_ms(1);

if((P5IN&k)==0x00) //再次检测,有键按下,检测键值 {

key_val=jianzhi+col; return ; }

k=k>>1; }

shuchu=shuchu>>1; jianzhi=jianzhi+4; k=0x08; } }

void Key_Event() {

P5OUT=0x00;

if ((key_Pressed == 0x00)&&((P5IN&0x0f) < 0x0f)) //如果有键按下 {

key_Pressed = 1; // 如果有按键按下,设置key_Pressed标识 delay_ms(120); //消除抖动

Check_Key(); // 调用check_Key(),获取键值 }

else if ((key_Pressed == 1)&&((P5IN & 0x0f) == 0x0f)) //如果按键已经释放 {

key_Pressed = 0; // 清除key_Pressed标识 key_Flag = 1; // 设置key_Flag标识 } else {

_NOP(); } }

键盘调用

Init_Keypad();//初始化

Key_Event(); //Key事件监测 Check_Key();

if(key_Flag==1) {

K=key_val; }

本文来源:https://www.bwwdw.com/article/lddr.html

Top