MSP430G2553 AD转换中1602输出温度

wylloong   2013-7-14 11:05 楼主

/*1602RSP2.0RWP2.1EP2.2

7~148个引脚接MSP430P1.0~P1.7,其余按照1602引脚要求连接即可。*/

#include<msp430g2553.h>

#define uchar unsigned char

#define uint unsigned int

#define P20 0

#define P21 1

#define P22 2

#define RS_CLR P2OUT &= ~(1 << P20)        //RS置低

#define RS_SET P2OUT |= (1 << P20)         //RS置高

#define RW_CLR P2OUT &= ~(1 << P21)        //RW置低

#define RW_SET P2OUT |= (1 << P21)         //RW置高

#define EN_CLR P2OUT &= ~(1 << P22)        //E置低

#define EN_SET P2OUT |= (1 << P22)         //E置高

uchar num;

int ADC_CHO;

int c;

int data;

unsigned  char x;

unsigned  char y;

void delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

void write_com(uchar com)   //输入数据

{

RS_CLR;     //RS置低 输入指令

P1OUT=com;

delay(5);

EN_SET;   

delay(5);

EN_CLR;    //E置低  1->0 执行指令

}

void write_data(uchar data)  //输出数据

{

RS_SET;      //RS置高  RS=1输出数据

P1OUT=data;   

delay(5);

EN_SET;

delay(5);

EN_CLR;     //E置低  1->0 执行指令

}

void init()   //1602初始化,请参考1602的资料

{

EN_CLR;

write_com(0x38);     //设置16*2显示,5*7点阵,8位数据接口

write_com(0x0e);     //光标不显示

write_com(0x06);     //写入新数据后光标右移,显示频不移动

write_com(0x01);    //0000000001 清屏

write_com(0x80);    //修改指针的位置

}

void  display_xy(unsigned  char x,unsigned  char y)

    if(y==0x01)

{

     x = x + 0x40 + 0x80;      }

else

{

    x = x+0x80;   //数据指针设置 80H+地址码 (0-27H40H-67H

}

  write_com(x);

}

void Disp1Char(uchar x,uchar y,uchar data)

{

  display_xy(x,y);

  write_data(data);   ////输出数据

}

void Disp_float(float f_data)        

{           

            unsigned char lcd_table[3];

            int aa;

            aa=f_data;                   

            lcd_table[0]= aa/100;            

            lcd_table[1]= aa%100/10;

            lcd_table[2]=aa%10;

                 Disp1Char(5,0,(lcd_table[0]+0x30)); //显示整数部分的十位数  0x30的原因CGROMCGRAM与字符的对应关系

                 Disp1Char(6,0,(lcd_table[1]+0x30));//显示小数部分的个位

                 Disp1Char(7,0,(0x2e)); //显示小数点"."  小数点对应00101110

                 Disp1Char(8,0,(lcd_table[2]+0x30)); //显示小数部分的十分位     

                                    //加上0x30以便直接得到相应的ASCII码去显示

}

void main()

{       

        WDTCTL = WDTPW + WDTHOLD;

        P2DIR = 0XFF;  

P1DIR = 0XFF; //输出all

P1OUT = 0;     

RW_CLR;   //写数据指令

init();

        ADC10CTL1 |= CONSEQ_2;  //单通道多次转换模式

        ADC10CTL0 |= SREF_1+REFON;//REFON=1选择内部参考源1.5VR+=VREF+and VR-=VSS,打开基准源

        ADC10CTL0 |= ADC10SHT_3+MSC;//过采样率设置为64个采样周期,打开AD转换,MSC多次采样

        ADC10CTL1 |= ADC10SSEL_3+SHS_0;//ACLK2分频为采样时钟,用ADC10SC触发采集

        ADC10CTL1 |= INCH_10;//选择通道10

        ADC10CTL0 |= ADC10ON;//ADC10内核打开

        while(1)

        {

        delay(1000);                     

        ADC10CTL0 |= ENC + ADC10SC; // 开始转换 ENC为转换使能位,ADC10SC转换控制位          

        while((ADC10CTL0 & ADC10IFG)==0);//等待ADC10IFG标志位变高(转换完成)

        ADC_CHO= ADC10MEM;//读取采样结果

        data =(ADC_CHO-746)/(0.000335*678)+286;//计算温度值

c=data;

        if(c>150)

        {P2DIR |= BIT3;

        P2OUT=0x00;

        delay(2000); }

        Disp_float(c);  //显示结果    

         delay(2000);

        }

}

显示温度

回复评论 (11)

回复 楼主wylloong 的帖子

谢谢分享!
点赞  2013-7-15 10:19

回复 楼主wylloong 的帖子

多谢分享 。
加个单位显示看看?
点赞  2013-7-17 08:30

y6

很好很实用
点赞  2013-8-10 15:32
楼主能留个QQ吗 想问一些问题 最近刚学着板子··
点赞  2013-8-15 13:27
很不错啊,可以加上温度的单位,还可以再转换成华氏摄氏度
点赞  2013-8-15 23:23

回复 6楼bobde163 的帖子

请问一下你能显示吗- - 如果可以加340303125麻烦知道一下··
点赞  2013-8-16 14:26

回复 7楼chxiaoer0624 的帖子

这个不难啊,你都能把数字给显示出来了,再显示个摄氏度的单位“C”和华氏温度的单位“F”就行了,当然了,字母边上的小圆圈是显示不出来了
点赞  2013-8-16 19:01

回复 6楼bobde163 的帖子

楼主方便聊下吗?
点赞  2013-12-4 19:48
又重新开始学习lauchpad......
点赞  2013-12-5 10:47
LZ,你的是5V?
点赞  2014-8-3 18:06
if(c>150)

        {P2DIR |= BIT3;

        P2OUT=0x00;

        delay(2000); }
楼主,这段代码是什么作用啊?
点赞  2016-4-22 22:40
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复