您的位置 首页 观点

MSP430之ADC12之1602显现

includemsp430x14xh>*两路数据采集,其中一路很稳定,跳动一两个字,但是另一路跳动就很大了,我的处理方法是:1是将多余的通道都接上

#include <msp430x14x.h>
/*两路数据收集,其间一路很安稳,跳动一两个字,可是另一路跳动就很大了,
我的处理办法是:1 是将剩余的通道都接上,收集后排序取中心的或中心
的几个相加再均匀,适用于改变较大的输入信号。2 是适用于比较平稳的
输入信号,可4次、8次、16次、32次、64次循环存储均匀。这样比较安稳多了。
本程序便是运用了32次循环存储均匀*/
typedef unsigned char uchar;
typedef unsigned int uint;
/**************宏界说***************/
#define DataDir P4DIR
#define DataPort P4OUT
#define Busy 0x80
#define CtrlDir P3DIR
#define CLR_RS P3OUT&=~BIT0; //RS = P3.0
#define SET_RS P3OUT|=BIT0;
#define CLR_RW P3OUT&=~BIT1; //RW = P3.1
#define SET_RW P3OUT|=BIT1;
#define CLR_EN P3OUT&=~BIT2; //EN = P3.2
#define SET_EN P3OUT|=BIT2;

static uint results[32]; //保存ADC转化成果的数组
void Trans_val(uint dat);
/*******************************************
函数称号:delay
功 能:延时一段时刻
参 数:time–延时长度
********************************************/
void delay(uint time)
{
uint i;
for(i = 0;i < time;i++) _NOP();
}
/*******************************************
函数称号:Delay5ms 功 能:延时约5ms
********************************************/
void Delay5ms(void)
{
uint i=40000;
while (i != 0)
{
i–;
}
}
/*******************************************
函数称号:WaitForEnable
功 能:等候1602液晶完结内部操作
********************************************/
void WaitForEnable(void)
{
P4DIR &= 0x00; //将P4口切换为输入状况
CLR_RS;
SET_RW;
_NOP();
SET_EN;
_NOP();
_NOP();

while((P4IN & Busy)!=0); //检测忙标志
CLR_EN;
P4DIR |= 0xFF; //将P4口切换为输出状况
}
/*******************************************
函数称号:write_com
功 能:向液晶模块写入指令
********************************************/
void write_com(uchar cmd)
{
WaitForEnable(); // 检测忙信号?

CLR_RS;
CLR_RW;
_NOP();
DataPort = cmd; //将指令字写入数据端口
_NOP();

SET_EN; //发生使能脉冲信号
_NOP();
_NOP();
CLR_EN;
}

/*******************************************
函数称号:write_data
功 能:向液晶显现的当时地址写入显现数据
参 数:data–显现字符数据
返回值 :无
********************************************/
void write_data( uchar data )
{
WaitForEnable(); //等候液晶不忙
SET_RS;
CLR_RW;
_NOP();
DataPort = data; //将显现数据写入数据端口
_NOP();
SET_EN; //发生使能脉冲信号
_NOP();
_NOP();
CLR_EN;
}
void Write1602(uchar add,uchar dat)
{
write_com(add);
write_data(dat);
}

void zifuchuan(uchar *ch)
{
while(*ch!=0)
write_data(*ch++);
Delay5ms();
}

/*******************************************
函数称号:LcdReset
功 能:对1602液晶模块进行复位操作
********************************************/
void LcdReset(void)
{
CtrlDir |= 0x07; //控制线端口设为输出状况
DataDir = 0xFF; //数据端口设为输出状况

write_com(0x38);//规则的复位操作
Delay5ms();
write_com(0x38);
Delay5ms();
write_com(0x38);
Delay5ms();
write_com(0x38);//显现形式设置
write_com(0x06);//写字符时全体不移动
write_com(0x0c);//显现开,不开游标,不闪耀
write_com(0x01);//显现清屏

}

/************************主函数****************************/
void main(void)
{
WDTCTL = WDTPW+WDTHOLD; //封闭看门狗

/*下面六行程序封闭一切的IO口*/
P1DIR = 0XFF;P1OUT = 0XFF;
P2DIR = 0XFF;P2OUT = 0XFF;
P3DIR = 0XFF;P3OUT = 0XFF;
P4DIR = 0XFF;P4OUT = 0XFF;
P5DIR = 0XFF;P5OUT = 0XFF;
P6DIR = 0XFF;P6OUT = 0XFF;

P6DIR |= BIT2;P6OUT |= BIT2;//封闭电平转化
LcdReset(); //复位1602液晶
// P6DIR&=~BIT0;//先把P6_1口设为输入,上电便是这个状况,这句可要可不要
P6SEL |= 0x01;//把P6_1口设为ADC输入通道
ADC12CTL0 = ADC12ON+SHT0_8+MSC; // 翻开ADC,设置采样时刻
ADC12CTL1 = SHP+CONSEQ_2; // 运用采样定时器
ADC12IE = 0x01;// 使能ADC中止
ADC12CTL0 |= ENC; // 使能转化
ADC12CTL0 |= ADC12SC;// 开端转化
write_com(0x82);
zifuchuan(“The volt is:”);
_EINT();
LPM0;
}
/*******************************************
函数称号:ADC12ISR
功 能:ADC中止服务函数,在这里用屡次均匀的
核算P6.0口的模仿电压数值
参 数:无
返回值 :无
********************************************/
#pragmavector=ADC_VECTOR
__interrupt void ADC12ISR (void)
{
static uint temp = 0;
results[temp++] = ADC12MEM0;
if(temp == 32)
{
uchar i;
unsignedlongsum = 0;
temp = 0;
for(i = 0; i < 32; i++)
{
sum += results[i];
}
sum >>= 5;//除以32

Trans_val(sum);
}
}
/*******************************************
函数称号:Trans_val
功 能:将16进制ADC转化数据改换成三位10进制
实在的模仿电压数据,并在液晶上显现
参 数:Hex_Val–16进制数据
n–改换时的分母等于2的n次方
返回值 :无
********************************************/
void Trans_val(uint dat)
{
unsignedlongtemp;
uint Curr_Volt;
uchar ptr[3];
temp = dat;
temp = (temp << 5) + dat; //temp = dat * 33
//移位比直接乘功率要高
temp = (temp << 3) + (temp << 1); //temp = temp * 10
//一个数左移N位等于这个数乘以2的N次方
Curr_Volt = temp >> 12;//Curr_Volt = temp / 2^n一个数右移N位等于除以2的N次方
ptr[0] = Curr_Volt/100;
ptr[1] = Curr_Volt %100/10;
ptr[2] = Curr_Volt%10;
//在液晶上显现改换后的成果
Write1602(0x80+0x40,ptr[0]+0x30);
Write1602(0x80+0x41,.);
Write1602(0x80+0x42,ptr[1]+0x30);
Write1602(0x80+0x43,ptr[2]+0x30);
Write1602(0x80+0x44,V);
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/guandian/254047.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部