/******************************************************************************
函数功能:基于定时器捕获功能的测量频率
*******************************************************************************/
#include"msp430x16x.h"
#include "GB2312.h"
#include "lcd.h"
/******************************函数声明*************************************************/
void jiemian(void);
void init_port(void);
void Clock_Init();
void CAP_Init();
void Init_DAC12();
void D_G_DAC12(uchar doit);
void ADC12_Init();
void Display_freq(int f);
void menu(void);
void Display_Value(int val);
/***************************变量定义*******************************************/
static unsigned int str[2]={0};
static unsigned int cap[10]={0};
static unsigned int count = 0;
static unsigned int temp= 0;
static long int Count_sum =0;
static unsigned int overflow= 0;
static unsigned int m = 0,n =0;
#define Num_of_Results 100
static float A0sum=0.0;
static unsigned int index = 0; //中断服务程序中的静态变量
static float A0results[Num_of_Results]; //保存ADC A0通道的转换结果的静态数组
static unsigned int A0value=0;
static unsigned int flag = 0;
/*=============================================================================
颜色的宏定义 blue_greenred ; black ; green ; white ; blue ; yellow ; purple */
/*================================主函数========================================*/
void main()
{
WDTCTL = WDTPW + WDTHOLD; //关看门狗
Clock_Init(); //单片机时钟初始化
init_port(); //单片机端口初始化
LCD_Init(); //液晶初始化
delay_ms(100);
// jiemian();
menu();
Init_DAC12(); //初始化DAC12
D_G_DAC12(100); //打开DAC12通道1
ADC12_Init();
CAP_Init();
_EINT();
while(1);
}
/*==================================TA的初始化设置=========================================
函数名称: void CAP_Init()
函数功能:定时器A捕获设置,用于捕获上升沿
函数参数:
=========================================================================================*/
void CAP_Init()
{
TBCCR0 = 50000; //定时40ms
TBCCTL0 |=CCIE;
TBCTL |=TBSSEL1 + ID_3 + MC_1+TBCLR;//选择8M-SMCLK时钟,8分频
TACCTL1 |= CM0 + SCS + CCIS_0 + CAP +CCIE;//上升沿触发,同步模式 shi能中断
TACTL |=TASSEL1 + ID_3 + MC1;//选择8M-SMCLK时钟,8分频
}
#pragma vector=TIMERB0_VECTOR
__interrupt void Timer_B0 (void)
{
//TACCTL1 &= ~CCIE;
flag = 1;
}
/*==================================TA的中断服务程序=========================================
函数名称: Timer_AISR
函数功能: 定时器A中断服务子函数,捕获待测信号上升沿
函数参数:
=========================================================================================*/
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A (void)
{
switch (TAIV) //向量查询
{
case 2: //捕获中断
str[temp]=TACCR1;
temp++;
if(temp == 2)
{
temp=0;
count =str[1]-str[0];
cap[m]=count;
m++;
if(m==4)
{
m=0;
Count_sum=0;
for(n=0;n<4;n++)
{
Count_sum += cap[n];
}
Count_sum=Count_sum/4;
Count_sum=(int)(1000000/Count_sum);
Display_freq(Count_sum);
}
}
break;
case 4:
break;
case 10: //定时器溢出中断
overflow++; //溢出次数
break;
default:
break;
}
}
/*================================================================
函数名称: init_port(void)
函数功能: 430单片机IO口初始化
函数参数:
=================================================================*/
void init_port(void)
{
P4DIR=0XFF; //(P3/P4控制液晶的锁存器???)
P3DIR = 0XFF;
P1DIR &=~ BIT2; //设置P1.2为输入
P1SEL |= BIT2; //设置P1.2为模块功能,即捕获源
P6SEL |= 0x03; // P6.0 P6.1为ADC通道输入 其中6.为 峰峰值测量通道 6.为波形采集通道
}
/**********************************
函数功能:
初始化DAC12
特点:
只用单通道1,由P6.7输出
***********************************/
void Init_DAC12()
{
/****************设置ADC12参考电压***********************/
ADC12CTL0 = REF2_5V + REFON;//参考电压为2.5V + 打开内部参考电压源
/****************设置DAC12通道1*************************/
DAC12_1CTL = DAC12IR + DAC12AMP_7 + DAC12ENC + DAC12LSEL_1;//满量程为参考电压,中速度/电流输出,12位分辨率,Vref+为参考电压
DAC12_1CTL |= DAC12CALON;//自动校准DA输出
/*****************等待校准结束**************************/
while(DAC12_1CTL & DAC12CALON == DAC12CALON);//通道1
}
/*********************************
函数功能:
打开/关闭DAC12;
函数内容:
doit = 0--关闭;
doit = 100--运行;
**********************************/
void D_G_DAC12(uchar doit)
{
if (doit == 0)
{
DAC12_1CTL &= ~DAC12ENC;//关闭DAC12通道1
}
else if (doit == 100)
{
DAC12_1CTL |= DAC12ENC; //打开DAC12通道1
}
}
/*=============================================================================
函数名称: ADC12_Init()
函数功能: 430单片机ADC12初始化
函数参数:
=============================================================================*/
void ADC12_Init()
{
/* ADC12CTL0 |= ADC12ON+SHT0_6+MSC+REF2_5V + REFON ; // SHT0_6分频系数n=32 采样周期25.6us 39K的采样率
// 打开ADC12模块+设置采样保持定时器0分频系数n=64+多次采样/转换位
//采集信号有SHI仅首次触发
ADC12CTL1 |= SHP+CONSEQ_2; // SHP=1采样信号采自定时器,由采集输入信号的上升沿触发采集定时
//单通道多次转换模式
ADC12IE = 0x02; // 允许A1中断 ADC12IFG.1
ADC12CTL0 |= ENC; // 允许转换
ADC12CTL0 |= ADC12SC; // 开始转换
*/
ADC12CTL0=ADC12ON+SHT0_8+MSC+REF2_5V + REFON ; // 打开ADC,设置时钟ADC12CLK 为ADC12OSC 5M,
//内部参考电压2。5V 分频系数n=32 MSC采集信号有SHI仅首次触发
ADC12CTL1=SHP+CONSEQ_3; //设置采样信号来源采样定时器,序列通道多次转换模式
ADC12MCTL0=INCH_0; //Vr+=Vref+,Vr-=AVss A0通道
ADC12MCTL1=INCH_1+ EOS; //Vr+=Vref+,Vr-=AVss A1通道
//EOS 由此通道产生序列结束控制位
ADC12IE = 0x02; // 允许A1中断 ADC12IFG.1
ADC12CTL0 |= ENC; // 允许转换
ADC12CTL0 |= ADC12SC; // 开始转换
}
/*******************************************
函数名称:ADC12ISR
功 能:ADC中断服务函数,在这里用多次平均的
计算P6.0口的模拟电压数值
参 数:无
返回值 :无
********************************************/
#pragma vector=ADC12_VECTOR
__interrupt void ADC12ISR(void)
{
DAC12_1DAT = ADC12MEM1;
if(flag!=0)
{
flag = 0;
A0results[index] = ADC12MEM0; // 储存A0通道的转换数据
if(index == Num_of_Results-1)
{
unsigned int i;
index = 0; //重新归零
A0value =0;
for(i = 0; i < Num_of_Results; i++)
{
A0sum += A0results;
}
A0sum = A0sum / 100; //除以
A0value = (int)(A0sum*3.3*2.2/4095*1000);
Display_Value(A0value);
}
index++;
}
}
/******************************时钟模块*****************************************
函数功能:初始化XT2时钟函数
*******************************************************************************/
void Clock_Init()
{
uint iq0;
BCSCTL1 &= ~XT2OFF; //打开XT2振荡器
do
{
IFG1 &= ~OFIFG; //清除振荡器失效标志
for (iq0 = 0xFF; iq0 > 0; iq0--); //延时,等待XT2起振
}
while ((IFG1 & OFIFG) != 0); //判断XT2是否起振
BCSCTL2 = SELM_2 + SELS; //选择MCLK、SMCLK为XT2
//为高速时钟 不分频,均为8M
}
void jiemian(void)
{
//========================界面1=====================================
LCD_clear(green); delay_ms(20); //刷屏,显示全绿色
Display_hanzi_s(2,1,jma,3,green, red); delay_ms(400);
Display_hanzi_s(0,2,jmb,8,green, red); delay_ms(400);
Display_hanzi_s(2,3,jmc,3,green, red); delay_ms(300);
Display_hanzi_s(0,5,jmd,4,green, blue); delay_ms(300);
Put_Char(8,5,0,58,green,black); //冒号
Display_hanzi_s(5,5,shuxiao,2,green, black); delay_ms(400);
Display_hanzi_s(5,6,ghj,3,green, black); delay_ms(500);
Display_hanzi_s(5,7,lxf,3,green, black); delay_ms(700);
Display_hanzi_s(2,7,zu,2,green, black); delay_ms(100);
LCD_clear(white); delay_ms(20); //刷屏,显示全绿色
}
void menu(void)
{
Display_hanzi_s(0,1,Tm,8,white,blue);
Display_hanzi_s(0,5,fre,4,white,black);
Put_Char(8,5,0,58,white,blue); //冒号
Display_hanzi_s(1,4,ffz,3,white,black);
Put_Char(8,4,0,58,white,blue); //冒号
Put_Char(14,4,0,86,white,red); //v
Put_Char(14,5,0,72,white,red);//H
Put_Char(15,5,0,122,white,red);//z
}
void Display_freq(int f)
{
Put_Char(12,5,1,f%10,white,black); //最低位
f=f/10;
Put_Char(11,5,1,f%10,white,black); //次低位
f=f/10;
Put_Char(10,5,1,f%10,white,black); // 高位
}
void Display_Value(int val)
{
Put_Char(13,4,1,val%10,white,white); //次低位
val=val/10;
Put_Char(12,4,1,val%10,white,white); // 高位
val=val/10;
Put_Char(11,4,1,val%10,white,purple); // 极高位
val=val/10;
Put_Char(10,4,0,46,white,red); //打点
Put_Char(9,4,1,val%10,white,purple);
}
用户1757358 2015-4-13 19:48
用户377235 2014-8-18 08:52
为什么还要加一个DAC转换呢、、、
用户1687253 2013-9-27 09:41
用户445337 2013-8-10 13:54
用户447311 2013-5-14 17:19
用户447311 2013-5-14 17:17
用户413797 2012-10-16 12:07
用户377235 2012-9-22 11:34
用户593939 2012-9-21 22:53
用户593939 2012-9-21 22:47