标题:
MSP430单片机超级终端在电压表自动校准中的应用实例
[打印本页]
作者:
51hei单片
时间:
2016-3-14 20:01
标题:
MSP430单片机超级终端在电压表自动校准中的应用实例
本程序是《MSP430系列单片机系统工程设计与实践》书里面的源码,(包含工程文件(例4.1.6))完整例程下载:
http://www.51hei.com/bbs/dpj-46245-1.html
关于本程序的详细解说大家可以点击上图下载电子书
/*
超级终端在电压表自动校准中的应用实例
说明:该程序示范用超级终端进行电压表校准的人机交互范例。
//=========================================================================
(C)西安电子科技大学 测控技术与仪器教研中心 编写:谢楷 2008/06/24
*/
//******************************************************************************
//
// MSP430FE425
// +-----------------+
// | XIN|-
// | | 32kHz
// | XOUT|-
// | |
// | (TXD)P2.4|----------->(TTL/232)----> RXD(2)
// | | 4800 bps ,n,8,1
// | (RXD)P2.5|<-----------(TTL/232)<---- TXD(3) PC(DB9)
// | |
// | GND |---------------------------GND(5)
//
//******************************************************************************
#include "msp430x42x.h" /*430寄存器头文件*/
#include "UART.h" /*串口通讯程序库头文件*/
#include "stdio.h" /*标准IO设备头文件(printf/scanf函数所需)*/
#include "math.h" /*数学函数库*/
#include "LCD_Display.h" /*LCD显示函数库头文件*/
#include "ADC16.h" /*ADCc采样函数库头文件*/
#include "Flash.h"
#include "BasicTimer.h"
int Voltage_Sample()
{
int ADC_Value,i;
ADC16_VrefOn(); // 打开基准源
Analog_On(); // 打开外设电源P2.2(如果有必要)
for(i=0;i<100;i++); // 略延迟,等待稳定
ADC_Value=ADC16_Sample(2,1); //ADC2单次采样
ADC16_VrefOff(); // 打开基准源
Analog_Off(); //关闭外设电源P2.2(如果有必要)
return(ADC_Value); // 返回采样结果
}
void Calibrate()
{
char Chr=0;
int ADC_Temp;
int Volt_FS;
printf("\f"); // 清屏
printf("1秒内按'C'键进入校准模式\n"); // 提示按'C'键进入校准模式
__delay_cycles(1000000); // 等待1秒
Chr=U0RXBUF; // 取出串口收到数据(未收到读回0)
if((Chr=='C')||(Chr=='c')) // 如果收字符为'C'或'c',才进入校准模式
{
printf("校准开始\n"); // 提示校准开始
printf("请输入0V电压,然后按回车键继续...\n");
while(getchar()!='\n'); // 等待回车键
ADC_Temp=Voltage_Sample(); // 采样一次ADC读数,作为零点数值
Flash_WriteWord(0,ADC_Temp); // 将结果保存在InfoFlash的0、1单元
printf("零点采样值=%d\n",ADC_Temp);// 提示零点采样结果
printf("校准输入满度校准电压(5000=50.00V):");// 提示输入满度校准电压值
scanf("%d",&Volt_FS); // 从计算机输入满度电压值
Flash_WriteWord(2,Volt_FS); // 将结果保存在InfoFlash的2、3单元
printf("请输入满度电压,然后按回车键继续...\n");
while(getchar()!='\n'); // 等回车键
ADC_Temp=Voltage_Sample(); // 采样一次ADC读数,作为零点数值
Flash_WriteWord(4,ADC_Temp); // 将结果保存在InfoFlash的4、5单元
printf("满度采样值=%d\n",ADC_Temp);// 提示满度采样结果
printf("校准完毕!\n\7"); // 校准完毕,鸣响一声(\7是鸣响符)
}
}
void main( void )
{
int ADC_0,ADC_F, VCAL,Voltage,ADC_Result;
WDTCTL=WDTPW+WDTHOLD; //停止看门狗
FLL_CTL0|=XCAP18PF; //配置晶振负载电容
P1DIR|=BIT0+BIT1+BIT2+BIT3+BIT4;
P2DIR|=BIT0+BIT1+BIT2+BIT3; //不用的IO设为输出
P1OUT=0;P2OUT=0; //以免不确定电平造成额外耗电
BT_Init(2);
LCD_Init(); //初始化液晶显示
UART_Init(4800,'n',8,1); //串口初始化,设置成4800bps,无校验,8位数据,1位停止
ADC16_Init(2,0,'S',1); //ADC2设为外部输入,数据格式有符号,1倍放大
Calibrate(); //校准
ADC_0=Flash_ReadWord(0); //读取校准参数(零点)
ADC_F=Flash_ReadWord(4); //读取校准参数(满点)
VCAL=Flash_ReadWord(2); //读取校准参数(满点电压值)
while(1)
{
Cpu_SleepWaitBT(); //等待被BT中断唤醒,以下代码每隔1/2秒执行一次
ADC_Result=Voltage_Sample(); //采样一次
Voltage=((long)ADC_Result-ADC_0)*VCAL/((long)ADC_F-ADC_0);//计算电压
LCD_DisplayDecimal(Voltage,2); //显示电压值,带2位小数 (例2.5.10)
LCD_InsertChar(VV); // 尾部添加单位: V
}
}
复制代码
作者:
liushiming82
时间:
2021-3-2 21:07
这句 ADC_F=Flash_ReadWord(4); //读取校准参数(满点) 是不是AD口要加上相应的电压进行采集呀?
Voltage=((long)ADC_Result-ADC_0)*VCAL/((long)ADC_F-ADC_0);//计算电压 这句是什么意思?
谢谢
作者:
山东好汉
时间:
2021-3-2 21:36
这个好复杂呀膜拜膜拜程序员
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1