⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 使用的是IAR开发工具。芯片是msp430f449。用的是内置传感器。输出为华氏温度。
💻 C
字号:
//***************************************************
//  文件名称:
//            main.c
//  文件说明:
//     对MSP430片内温度传感器进行采样,输出温度到LCD,
//     程序使用单通道单次转换,温度显示的格式是摄氏温度,
//     带两位小数
//***************************************************
#define MSP430F449_H  0
#include <msp430x44x.h>
#define REFVOL 2.5                                     //vcc参考设为2.5
#define LCD_IN_USE 8
#define RADIX_POINT 0x08
unsigned char adc_Flag;
unsigned char lcd_Buf[LCD_IN_USE];

//************************************************************
//   初始化ADC12
//************************************************************
void init_ADC12(void)
{
     ADC12CTL0   = ADC12ON + REFON + REF2_5V + SHT0_6;// 设置ADC12 的内部参考电压2.5伏 
     ADC12CTL1   = SHP;                               // 设置使用采样时钟 
     ADC12MCTL0  = INCH_10 + SREF_1;                  // 选择通道A10,即片内温度传感器输出
     ADC12IE    |= 0x01;                              // 使能中断 
     ADC12CTL0  |= ENC;                               // 使能转换 
     
}
//************************************************************
//   启动  ADC12
//************************************************************
void start_ADC12()
{
     ADC12CTL0 |= ADC12SC;
     adc_Flag   = 0;
}
//***********************************************************
//   把数据编成要显示的格式,然后写到lcd_Buf中去
//***********************************************************
void format_Data()
{
   int result;
    unsigned char tmp;
   
     result = ADC12MEM0;
    
     result = (int)(((REFVOL * result )/ 4096 - 0.986) /0.0000355); //得到对应的温度值*10,以包括小数两位 ;
     for(tmp=0;tmp<7;tmp++)
     {
           lcd_Buf[tmp] = result % 10;                              //把结果转换成十进制,并存放在LCD缓冲区中 
           result = result /10;                                     
     }
       
}
//***********************************************************
//   中断向量
//***********************************************************
#pragma vector = ADC_VECTOR 
 __interrupt void  ADC_Interrupt(void)
{
    format_Data();              //格式化数据并显示到LCD
    adc_Flag = 1;               //指示有数据要显示
}

//******************************************************
//   数据定义                                        
//******************************************************
const unsigned char NUM_LCD[16]={ 
                0x7B, 0x12, 0x4f, 0x1f, 0x36,  //'0'~ '4'
		0x3d, 0x7d, 0x13, 0x7f, 0x3f,  //'5' ~ '9'
		0x73, 0x7c, 0x69, 0x5e, 0x6f,  // '6'~ 'E'
		0x65};                         // F"
unsigned char lcd_Buf[LCD_IN_USE];             // 自定义显示缓冲区,用于
                                               // 外部设定要显示的数据 
//*******************************************************
//     模块初始化
//*******************************************************
void init_LCD(void)
{
    char tmpv;
    BTCTL |= 0x10;                         // set LCD 时钟
    P3DIR  = 0xff;                         // 输出模式
    P5SEL  = 0xfc;                         // 置为外围模块
    LCDCTL = LCDON+LCD4MUX+LCDP1;          // 4Mux 模式
    
     for (tmpv = 0;tmpv<7;tmpv++)
     {
        LCDMEM[tmpv] = 0x00;               //clear LCD
     }
     LCDMEM[7] = 0x02;                     // 设置LCDMEM[7]             
   
}
//***************************************************** 
//    更新LCD缓冲区的内容,把数据显示到LCD    
//*****************************************************
void lcd_Display()
{                      
    char tmpv;
    for(tmpv=0;tmpv<LCD_IN_USE-1;tmpv++)       //LCD_IN_USE为8
    {   
        LCDMEM[tmpv] = NUM_LCD[lcd_Buf[tmpv]]; //更新LCDMEM中的内容 
    }
     
}
//***************************************************
//   设置小数点
//***************************************************
void lcd_SetRP()
{
    LCDMEM[2] |= 0x80;                         //显示小数点 
}

//*******************************************************
//
//  主函数
//
//*******************************************************

void main(void)
{
    unsigned int tmpv;
    WDTCTL = WDTHOLD + WDTPW;     //停止看门狗
    init_LCD();                   //初始化LCD
    init_ADC12();                 //初始化ADC12
    _EINT();                      //使能中断
    while(1)
    {
        start_ADC12();            //启动ADC12
        while(adc_Flag == 0);     //等待转换完成
        lcd_Display();            //显示数据到LCD
        lcd_SetRP();              //显示小数点
        tmpv = 0;
        while(tmpv < 0xffff) tmpv++;//延时
   }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -