数模转换程序
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
unsigned int key2 = 0; //按键键值
unsigned int LED_indicate_flag = 1; //指示灯标志位
/*******************硬件抽象***************************/
#define Dac_sy_H P1OUT |= BIT0
//uchar Dac_temp_buf[16];
/***********************************************************
函数名称:Change_flo2uint()
功能:将float转换成Dac可处理的uint Dac_temp
入口参数:(float Dac_val)
返回值:无
*/
/*****************************************/
void delay(unsigned int time)
{
unsigned int t,t1;
for(t = time;t > 0;t--)
for(t1 = 650;t1 > 0 ;t1--);
}
/*****************************************/
__interrupt void ADC12ISR (void)
{
_BIC_SR_IRQ(LPM3_bits);
static unsigned int index =0;
results[index++] = ADC12MEM0; // Move results
if(index == Num_of_Results)
void Dac_send_2byte(float Dac_val)
{
uchar i;
Change_flo2uint(Dac_val);
Dac_sy_H;//起始信号
Dac_delay();
Dac_sy_L;
for(i=0;i<16;i++)
{
if(Dac_temp>=0x8000) Dac_send_1();// Dac_temp_buf[i] = 1;}
}
/*****************************************/
/*
函数名:dc设置函数
参数:unsigned int fre频率;
返回值:无
*/
/*****************************************/
#pragma vector = PORT1_VECTOR
#define DacOUT P1OUT
#define DacIN P1IN
#define DacDIR P1DIR
#define uchar unsigned char
#define uint unsigned int
float Dac_val;//都弄位全局变量
uint Dac_temp;
//uchar n=13;
else Dac_send_0(); //Dac_temp_buf[i] = 0;}//待修改
Dac_temp = Dac_temp<<1;
}
}
/*****************************************/
/*
函数名:延时函数
功能:按键检测延时消抖函数
参数:unsigned int time
void key_init()
{
P2DIR &= BIT0; //选择p2.0为输入
P2IES |= ~BIT0; //选择为下降沿中断
P2IE |= BIT0; //打开中断使能
P2DIR &= BIT1; //选择p2.1为输入
P2IES |= ~BIT1; //选择为下降沿中断
P2IE |= BIT1; //打开中断使能
P2IFG &= ~BIT0; //中断标志位清零
P2IFG &= ~BIT1; //中断标志位清零
_EINT();
}
/*****************************************/
void main(void)
{
WDTCTL = WDTPW +WDTHOLD; //关闭看门狗
函数名称:Dac_delay()
功能:实现指定的延时
入口参数:void
出口参数:void
说明:延时8051的3个循环语句的时间
***********************************************************/
void Dac_delay(void)
{
uchar i;//n方便调试
#define Dac_sy_L P1OUT &= ~BIT0
#define Dac_clk_H P1OUT |= BIT1
#define Dac_clk_L P1OUT &= ~BIT1
#define Dac_di_H P1OUT |= BIT2
#define Dac_di_L P1OUT &= ~BIT2
P2DIR |= BIT2; //设置P2为输出
P2OUT |= BIT2; //初始化P2输出为高电平
TACTL |= TASSEL_2; //TASSEL0 + TASSEL1 + TACLR; // ACLK,清除TAR TASSEL1
TACTL |= MC0; // Timer_A增计数模式
{
//pwm = 28; //设定供电电流为0.5mA
key2++;
P2OUT |= BIT2; //P2口输出高电平熄灭指示灯
ADC12CTL0 &= ~ADC12ON; //关闭ADC12
P6SEL |= BIT0;//关闭ADC通道
LED_indicate_flag = 0; //指示灯标志置零
{
case 0: Dac_val = 0.00; //1mA
break;
case 1: Dac_val = 0.47; //4mA
break;
case 2: Dac_val=0.94; //7mA
break;
case 3: Dac_val= 1.41; //10mA
ADC12CTL0 &= ~REF2_5V;//选择内部1.5v参考电压
ADC12CTL1 = SHP + CONSEQ_2; //使用采样定时器
ADC12IE |= BIT0; //使能ADC中断
ADC12CTL0 |= ENC; //使能转换
ADC12CTL0 |= ADC12SC; //开始转换
__interrupt void PORT1_ISR()
{
_BIC_SR_IRQ(LPM3_bits);
if(P2IFG & BIT0) //调节按键被按下
{
delay(100);
if(~(P2IN & BIT0))
{
while((P2IN&BIT0) == 0 ); //等待按键放开
{
key1 ++; //键值自加
Dac_delay();
}
/***********************************************************
函数名称:Dac_send_2byte()
功能:CPU向DAC发送2byte
入口参数:float Dac_val
出口参数:void
说明:
***********************************************************/
}
P2IFG &= ~BIT1; //中断标志位清零
}
}
}
/*****************************************/
/*
函数名:按键初始化函数
功能:设置P2.0口为输出下降沿中断
参数:无
返回值:无
*/
/*****************************************/
for(i=0;i<1;i++);
}
/***********************************************************
函数名称:Dac_send_1()
功能:CPU向DAC发送1
入口参数:void
出口参数:void
说明:
***********************************************************/
void Dac_send_1(void)
{
Dac_di_H;
Dac_clk_L;
Dac_delay();
Dac_clk_H;
Dac_delay();
}
/***********************************************************
函数名称:Dac_send_0()
出口参数:uint Dac_temp
说明:
***********************************************************/
void Change_flo2uint(float Dac_val)
{
Dac_temp = (uint)(Dac_val*4095/3.3);
LED_indicate_flag = 1; //指示灯标志置零
}
P2IFG &= ~BIT0; //中断标志位清零
}
}
if(P2IFG & BIT1) //电容供电按键被按下
{
delay(100);
if(~(P2IN & BIT1))
{
while((P2IN&BIT1) == 0 ); //等待按键放开
}
/***********************************************************
函数名称:Dac_init()
功能:初始化
入口参数:void
出口参数:void
说明:通过普通口模拟串行口工作
***********************************************************/
{
unsigned char i;
index = 0;
for(i = 0; i < Num_of_Results; i++)
{
sum += results[i]; //采集值求和
}
sum /= Num_of_Results; //除以32
}
ADC12IFG &= ~BIT0; //ADC12中断标志清零
key_init(); //按键检测初始化
ADC_init(); //ADC12初始化
P1DIR |= BIT2; // P1.2输出
P1SEL |= BIT2; // P1.2 TA
for (;;) //主循环Baidu Nhomakorabea
{
if(LED_indicate_flag == 1)
{
switch(key1) //键值判断
_EINT();
}
/*****************************************/
/*
函数名:ADC中断函数
功能:对P6.0口进行32次采集求平均值
参数:无
返回值:无
*/
/*****************************************/
#pragma vector=ADC_VECTOR
/*
函数名:ADC初始化函数
功能:对ADC进行初始化设置
参数:无
返回值:无
*/
/***************************************/
void ADC_init()
{
P6SEL |= BIT0; //使能ADC通道
ADC12CTL0 = ADC12ON + SHT0_8 + MSC + REFON; //打开ADC,设置采样时间
功能:CPU向DAC发送0
入口参数:void
出口参数:void
说明:
***********************************************************/
void Dac_send_0(void)
{
Dac_di_L;
Dac_clk_L;
Dac_delay();
Dac_clk_H;
void Dac_init(void)
{
DacDIR |= BIT0 + BIT1 + BIT2;
DacOUT |= BIT0 + BIT1 + BIT2;
// DacOUT &= ~BIT0;//片选置低
}
/***********************************************************
#include <msp430x14x.h>
#define Num_of_Results 10
static unsigned int results[Num_of_Results]; //保存ADC转换结果的数组
unsigned long sum = 0; //ADC12采集值之和
unsigned int key1 = 0; //按键键值
unsigned int LED_indicate_flag = 1; //指示灯标志位
/*******************硬件抽象***************************/
#define Dac_sy_H P1OUT |= BIT0
//uchar Dac_temp_buf[16];
/***********************************************************
函数名称:Change_flo2uint()
功能:将float转换成Dac可处理的uint Dac_temp
入口参数:(float Dac_val)
返回值:无
*/
/*****************************************/
void delay(unsigned int time)
{
unsigned int t,t1;
for(t = time;t > 0;t--)
for(t1 = 650;t1 > 0 ;t1--);
}
/*****************************************/
__interrupt void ADC12ISR (void)
{
_BIC_SR_IRQ(LPM3_bits);
static unsigned int index =0;
results[index++] = ADC12MEM0; // Move results
if(index == Num_of_Results)
void Dac_send_2byte(float Dac_val)
{
uchar i;
Change_flo2uint(Dac_val);
Dac_sy_H;//起始信号
Dac_delay();
Dac_sy_L;
for(i=0;i<16;i++)
{
if(Dac_temp>=0x8000) Dac_send_1();// Dac_temp_buf[i] = 1;}
}
/*****************************************/
/*
函数名:dc设置函数
参数:unsigned int fre频率;
返回值:无
*/
/*****************************************/
#pragma vector = PORT1_VECTOR
#define DacOUT P1OUT
#define DacIN P1IN
#define DacDIR P1DIR
#define uchar unsigned char
#define uint unsigned int
float Dac_val;//都弄位全局变量
uint Dac_temp;
//uchar n=13;
else Dac_send_0(); //Dac_temp_buf[i] = 0;}//待修改
Dac_temp = Dac_temp<<1;
}
}
/*****************************************/
/*
函数名:延时函数
功能:按键检测延时消抖函数
参数:unsigned int time
void key_init()
{
P2DIR &= BIT0; //选择p2.0为输入
P2IES |= ~BIT0; //选择为下降沿中断
P2IE |= BIT0; //打开中断使能
P2DIR &= BIT1; //选择p2.1为输入
P2IES |= ~BIT1; //选择为下降沿中断
P2IE |= BIT1; //打开中断使能
P2IFG &= ~BIT0; //中断标志位清零
P2IFG &= ~BIT1; //中断标志位清零
_EINT();
}
/*****************************************/
void main(void)
{
WDTCTL = WDTPW +WDTHOLD; //关闭看门狗
函数名称:Dac_delay()
功能:实现指定的延时
入口参数:void
出口参数:void
说明:延时8051的3个循环语句的时间
***********************************************************/
void Dac_delay(void)
{
uchar i;//n方便调试
#define Dac_sy_L P1OUT &= ~BIT0
#define Dac_clk_H P1OUT |= BIT1
#define Dac_clk_L P1OUT &= ~BIT1
#define Dac_di_H P1OUT |= BIT2
#define Dac_di_L P1OUT &= ~BIT2
P2DIR |= BIT2; //设置P2为输出
P2OUT |= BIT2; //初始化P2输出为高电平
TACTL |= TASSEL_2; //TASSEL0 + TASSEL1 + TACLR; // ACLK,清除TAR TASSEL1
TACTL |= MC0; // Timer_A增计数模式
{
//pwm = 28; //设定供电电流为0.5mA
key2++;
P2OUT |= BIT2; //P2口输出高电平熄灭指示灯
ADC12CTL0 &= ~ADC12ON; //关闭ADC12
P6SEL |= BIT0;//关闭ADC通道
LED_indicate_flag = 0; //指示灯标志置零
{
case 0: Dac_val = 0.00; //1mA
break;
case 1: Dac_val = 0.47; //4mA
break;
case 2: Dac_val=0.94; //7mA
break;
case 3: Dac_val= 1.41; //10mA
ADC12CTL0 &= ~REF2_5V;//选择内部1.5v参考电压
ADC12CTL1 = SHP + CONSEQ_2; //使用采样定时器
ADC12IE |= BIT0; //使能ADC中断
ADC12CTL0 |= ENC; //使能转换
ADC12CTL0 |= ADC12SC; //开始转换
__interrupt void PORT1_ISR()
{
_BIC_SR_IRQ(LPM3_bits);
if(P2IFG & BIT0) //调节按键被按下
{
delay(100);
if(~(P2IN & BIT0))
{
while((P2IN&BIT0) == 0 ); //等待按键放开
{
key1 ++; //键值自加
Dac_delay();
}
/***********************************************************
函数名称:Dac_send_2byte()
功能:CPU向DAC发送2byte
入口参数:float Dac_val
出口参数:void
说明:
***********************************************************/
}
P2IFG &= ~BIT1; //中断标志位清零
}
}
}
/*****************************************/
/*
函数名:按键初始化函数
功能:设置P2.0口为输出下降沿中断
参数:无
返回值:无
*/
/*****************************************/
for(i=0;i<1;i++);
}
/***********************************************************
函数名称:Dac_send_1()
功能:CPU向DAC发送1
入口参数:void
出口参数:void
说明:
***********************************************************/
void Dac_send_1(void)
{
Dac_di_H;
Dac_clk_L;
Dac_delay();
Dac_clk_H;
Dac_delay();
}
/***********************************************************
函数名称:Dac_send_0()
出口参数:uint Dac_temp
说明:
***********************************************************/
void Change_flo2uint(float Dac_val)
{
Dac_temp = (uint)(Dac_val*4095/3.3);
LED_indicate_flag = 1; //指示灯标志置零
}
P2IFG &= ~BIT0; //中断标志位清零
}
}
if(P2IFG & BIT1) //电容供电按键被按下
{
delay(100);
if(~(P2IN & BIT1))
{
while((P2IN&BIT1) == 0 ); //等待按键放开
}
/***********************************************************
函数名称:Dac_init()
功能:初始化
入口参数:void
出口参数:void
说明:通过普通口模拟串行口工作
***********************************************************/
{
unsigned char i;
index = 0;
for(i = 0; i < Num_of_Results; i++)
{
sum += results[i]; //采集值求和
}
sum /= Num_of_Results; //除以32
}
ADC12IFG &= ~BIT0; //ADC12中断标志清零
key_init(); //按键检测初始化
ADC_init(); //ADC12初始化
P1DIR |= BIT2; // P1.2输出
P1SEL |= BIT2; // P1.2 TA
for (;;) //主循环Baidu Nhomakorabea
{
if(LED_indicate_flag == 1)
{
switch(key1) //键值判断
_EINT();
}
/*****************************************/
/*
函数名:ADC中断函数
功能:对P6.0口进行32次采集求平均值
参数:无
返回值:无
*/
/*****************************************/
#pragma vector=ADC_VECTOR
/*
函数名:ADC初始化函数
功能:对ADC进行初始化设置
参数:无
返回值:无
*/
/***************************************/
void ADC_init()
{
P6SEL |= BIT0; //使能ADC通道
ADC12CTL0 = ADC12ON + SHT0_8 + MSC + REFON; //打开ADC,设置采样时间
功能:CPU向DAC发送0
入口参数:void
出口参数:void
说明:
***********************************************************/
void Dac_send_0(void)
{
Dac_di_L;
Dac_clk_L;
Dac_delay();
Dac_clk_H;
void Dac_init(void)
{
DacDIR |= BIT0 + BIT1 + BIT2;
DacOUT |= BIT0 + BIT1 + BIT2;
// DacOUT &= ~BIT0;//片选置低
}
/***********************************************************
#include <msp430x14x.h>
#define Num_of_Results 10
static unsigned int results[Num_of_Results]; //保存ADC转换结果的数组
unsigned long sum = 0; //ADC12采集值之和
unsigned int key1 = 0; //按键键值