📄 main.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 + -