MSP430搭的一个简易电压表,上位机用JAVA写的
2011-03-21 17:03
218 查看
Code:
import java.io.*;
import java.util.*;
import javax.comm.*;
import javax.swing.*;
public class SimpleRead implements Runnable, SerialPortEventListener {
static CommPortIdentifier portId;
static Enumeration portList;
InputStream inputStream;
SerialPort serialPort;
Thread readThread;
static JTextField textfield;
public static void UiPaint()
{
JFrame frame = new JFrame("电压转换软件-徐方鑫");
frame.setSize(250,70);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
frame.add(panel);
JLabel label = new JLabel("电压检测为:");
panel.add(label);
textfield = new JTextField(6);
textfield.setHorizontalAlignment(JTextField.CENTER);
panel.add(textfield);
//textfield.enable(false);
JLabel label2 = new JLabel("V");
panel.add(label2);
frame.setVisible(true);
}
public static void main(String[] args) {
UiPaint();
portList = CommPortIdentifier.getPortIdentifiers();
while (portList.hasMoreElements()) {
portId = (CommPortIdentifier) portList.nextElement();
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
if (portId.getName().equals("COM1")) {
//if (portId.getName().equals("/dev/term/a")) {
SimpleRead reader = new SimpleRead();
}
}
}
}
public SimpleRead() {
try {
serialPort = (SerialPort) portId.open("SimpleReadApp", 2000);
} catch (PortInUseException e) {}
try {
inputStream = serialPort.getInputStream();
} catch (IOException e) {}
try {
serialPort.addEventListener(this);
} catch (TooManyListenersException e) {}
serialPort.notifyOnDataAvailable(true);
try {
serialPort.setSerialPortParams(9600,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
} catch (UnsupportedCommOperationException e) {}
readThread = new Thread(this);
readThread.start();
}
public void run() {
try {
Thread.sleep(20000);
} catch (InterruptedException e) {}
}
public void serialEvent(SerialPortEvent event) {
switch(event.getEventType()) {
case SerialPortEvent.BI:
case SerialPortEvent.OE:
case SerialPortEvent.FE:
case SerialPortEvent.PE:
case SerialPortEvent.CD:
case SerialPortEvent.CTS:
case SerialPortEvent.DSR:
case SerialPortEvent.RI:
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
break;
case SerialPortEvent.DATA_AVAILABLE:
byte[] readBuffer = new byte[6];
try {
while (inputStream.available() > 0) {
int numBytes = inputStream.read(readBuffer);
}
//System.out.print(new String(readBuffer));
textfield.setText(new String(readBuffer));
} catch (IOException e) {}
break;
}
}
}
Code:
#include <msp430x14x.h>
#include "Init.h"
/*******************************************
函数名称:Init_AD
功 能:AD初始化函数
参 数:无
返回值 :无
********************************************/
void Init_AD(void)
{
P6SEL |= 0x01; // 使能ADC通道
ADC12CTL0 = ADC12ON+SHT0_8+MSC; // 打开ADC,设置采样时间
ADC12CTL1 = SHP+CONSEQ_2; // 使用采样定时器
ADC12IE = 0x01; // 使能ADC中断
ADC12CTL0 |= ENC; // 使能转换
ADC12CTL0 |= ADC12SC; // 开始转换
}
/*******************************************
函数名称:Init_watchdog
功 能:看门狗初始化函数
参 数:无
返回值 :无
********************************************/
void Init_watchdog(void) // WatchdogInit
{
WDTCTL=WDTPW+WDTHOLD;// Stop watchdog
}
/*******************************************
函数名称:Init_uart
功 能:串口初始化
参 数:无
返回值 :无
********************************************/
void Init_uart(int Bund) // Uart_Init
{
P3SEL|=0xc0; // P3.6,7 = USART1 TXD/RXD
P3DIR |= 0x40; // 串口发送数据端口为输出,接收数据端口为输入
UCTL1=SWRST; // Initialize USART state machine
UTCTL1|=SSEL0; // UCLK = ACLK
UBR01=32000/Bund; // 9600 from 1Mhz,波特率设置32k/9600 - 13.65
UBR11=0x00;
UMCTL1=0x4a; // Modulation
UCTL1=CHAR; // 8 bits data format. enable UART
IFG2&=~UTXIFG1; // Enable USART0 RX/TX interrupt
IE2|=URXIE1; // Enable receive interrupt.
ME2|=URXE1+UTXE1; // Enabled USART1 TXD/RXD
//_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/ interrupt
}
Code:
#define uchar unsigned char
#define uint unsigned int
void Init_uart(int Bund); // Uart_Init
void Init_watchdog(void); // WatchdogInit
void Init_AD(void); // ADInit
Code:
#include <msp430x14x.h>
#include <string.h>
#include "Init.h"
#define Num_of_Results 32
static uint results[Num_of_Results]; //保存ADC转换结果的数组 // is not used for anything.
void Trans_val(uint Hex_Val); //AD电压转换
void Send_data(char *data); //Uart_send_function
void Init(void); // Main_Init
uchar shuzi[] = {"0123456789."}; //字码转换
/*******************************************
函数名称:主函数
功 能:主函数
参 数:无
返回值 :无
********************************************/
int main(void)
{
Init(); //主初始化程序
_EINT();
LPM0;
while(1);
return 0;
}
/*******************************************
函数名称:初始化函数
功 能:初始化模块调用
参 数:无
返回值 :无
********************************************/
void Init(void)
{
Init_watchdog(); // WatchdogInit
Init_uart(9600); // Uart_Init
Init_AD(); // AD_Init
}
/*******************************************
函数名称:串口发送数据
功 能:发送数据
参 数:字符串
返回值 :无
********************************************/
void Send_data(char *data)
{
unsigned char i;
for(i=0;i<strlen(data)+1;i++)
{
TXBUF1=data[i];
while((UTCTL1&TXEPT)!=TXEPT);
}
}
/*******************************************
函数名称:串口接收中断函数
功 能:串口接受
参 数:无
返回值 :无
********************************************/
//ISR for uart1 receive a byte.
#pragma vector=UART1RX_VECTOR
__interrupt void usart1_rx (void)
{
if (RXBUF1 =='u') // 'u' received?
{
_NOP();
//TXBUF1 = string1[i++];
}
}
/*******************************************
函数名称:Trans_val
功 能:将16进制ADC转换数据变换成三位10进制
真实的模拟电压数据,并在液晶上显示
参 数:Hex_Val--16进制数据
n--变换时的分母等于2的n次方
返回值 :无
********************************************/
void Trans_val(uint Hex_Val)
{
unsigned long caltmp;
uint Curr_Volt;
uchar t1,i;
uchar ptr[4];
caltmp = Hex_Val;
caltmp = (caltmp << 5) + Hex_Val; //caltmp = Hex_Val * 33
caltmp = (caltmp << 3) + (caltmp << 1); //caltmp = caltmp * 10
Curr_Volt = caltmp >> 12; //Curr_Volt = caltmp / 2^n
ptr[0] = Curr_Volt / 100; //Hex->Dec变换
t1 = Curr_Volt - (ptr[0] * 100);
ptr[2] = t1 / 10;
ptr[3] = t1 - (ptr[2] * 10);
ptr[1] = 10; //shuzi表中第10位对应符号"."
//在液晶上显示变换后的结果
uchar result[4];
for(i = 0;i < 4;i++)
{
result[i]=shuzi[ptr[i]];
}
Send_data(result);
}
/*******************************************
函数名称:ADC12ISR
功 能:ADC中断服务函数,在这里用多次平均的
计算P6.0口的模拟电压数值
参 数:无
返回值 :无
********************************************/
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR (void)
{
static uint index = 0;
results[index++] = ADC12MEM0; // Move results
if(index == Num_of_Results)
{
uchar i;
unsigned long sum = 0;
index = 0;
for(i = 0; i < Num_of_Results; i++)
{
sum += results[i];
}
sum >>= 5; //除以32
Trans_val(sum);
}
}
花了一个白天搭了下,还是挺好玩的
import java.io.*;
import java.util.*;
import javax.comm.*;
import javax.swing.*;
public class SimpleRead implements Runnable, SerialPortEventListener {
static CommPortIdentifier portId;
static Enumeration portList;
InputStream inputStream;
SerialPort serialPort;
Thread readThread;
static JTextField textfield;
public static void UiPaint()
{
JFrame frame = new JFrame("电压转换软件-徐方鑫");
frame.setSize(250,70);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
frame.add(panel);
JLabel label = new JLabel("电压检测为:");
panel.add(label);
textfield = new JTextField(6);
textfield.setHorizontalAlignment(JTextField.CENTER);
panel.add(textfield);
//textfield.enable(false);
JLabel label2 = new JLabel("V");
panel.add(label2);
frame.setVisible(true);
}
public static void main(String[] args) {
UiPaint();
portList = CommPortIdentifier.getPortIdentifiers();
while (portList.hasMoreElements()) {
portId = (CommPortIdentifier) portList.nextElement();
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
if (portId.getName().equals("COM1")) {
//if (portId.getName().equals("/dev/term/a")) {
SimpleRead reader = new SimpleRead();
}
}
}
}
public SimpleRead() {
try {
serialPort = (SerialPort) portId.open("SimpleReadApp", 2000);
} catch (PortInUseException e) {}
try {
inputStream = serialPort.getInputStream();
} catch (IOException e) {}
try {
serialPort.addEventListener(this);
} catch (TooManyListenersException e) {}
serialPort.notifyOnDataAvailable(true);
try {
serialPort.setSerialPortParams(9600,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
} catch (UnsupportedCommOperationException e) {}
readThread = new Thread(this);
readThread.start();
}
public void run() {
try {
Thread.sleep(20000);
} catch (InterruptedException e) {}
}
public void serialEvent(SerialPortEvent event) {
switch(event.getEventType()) {
case SerialPortEvent.BI:
case SerialPortEvent.OE:
case SerialPortEvent.FE:
case SerialPortEvent.PE:
case SerialPortEvent.CD:
case SerialPortEvent.CTS:
case SerialPortEvent.DSR:
case SerialPortEvent.RI:
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
break;
case SerialPortEvent.DATA_AVAILABLE:
byte[] readBuffer = new byte[6];
try {
while (inputStream.available() > 0) {
int numBytes = inputStream.read(readBuffer);
}
//System.out.print(new String(readBuffer));
textfield.setText(new String(readBuffer));
} catch (IOException e) {}
break;
}
}
}
Code:
#include <msp430x14x.h>
#include "Init.h"
/*******************************************
函数名称:Init_AD
功 能:AD初始化函数
参 数:无
返回值 :无
********************************************/
void Init_AD(void)
{
P6SEL |= 0x01; // 使能ADC通道
ADC12CTL0 = ADC12ON+SHT0_8+MSC; // 打开ADC,设置采样时间
ADC12CTL1 = SHP+CONSEQ_2; // 使用采样定时器
ADC12IE = 0x01; // 使能ADC中断
ADC12CTL0 |= ENC; // 使能转换
ADC12CTL0 |= ADC12SC; // 开始转换
}
/*******************************************
函数名称:Init_watchdog
功 能:看门狗初始化函数
参 数:无
返回值 :无
********************************************/
void Init_watchdog(void) // WatchdogInit
{
WDTCTL=WDTPW+WDTHOLD;// Stop watchdog
}
/*******************************************
函数名称:Init_uart
功 能:串口初始化
参 数:无
返回值 :无
********************************************/
void Init_uart(int Bund) // Uart_Init
{
P3SEL|=0xc0; // P3.6,7 = USART1 TXD/RXD
P3DIR |= 0x40; // 串口发送数据端口为输出,接收数据端口为输入
UCTL1=SWRST; // Initialize USART state machine
UTCTL1|=SSEL0; // UCLK = ACLK
UBR01=32000/Bund; // 9600 from 1Mhz,波特率设置32k/9600 - 13.65
UBR11=0x00;
UMCTL1=0x4a; // Modulation
UCTL1=CHAR; // 8 bits data format. enable UART
IFG2&=~UTXIFG1; // Enable USART0 RX/TX interrupt
IE2|=URXIE1; // Enable receive interrupt.
ME2|=URXE1+UTXE1; // Enabled USART1 TXD/RXD
//_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/ interrupt
}
Code:
#define uchar unsigned char
#define uint unsigned int
void Init_uart(int Bund); // Uart_Init
void Init_watchdog(void); // WatchdogInit
void Init_AD(void); // ADInit
Code:
#include <msp430x14x.h>
#include <string.h>
#include "Init.h"
#define Num_of_Results 32
static uint results[Num_of_Results]; //保存ADC转换结果的数组 // is not used for anything.
void Trans_val(uint Hex_Val); //AD电压转换
void Send_data(char *data); //Uart_send_function
void Init(void); // Main_Init
uchar shuzi[] = {"0123456789."}; //字码转换
/*******************************************
函数名称:主函数
功 能:主函数
参 数:无
返回值 :无
********************************************/
int main(void)
{
Init(); //主初始化程序
_EINT();
LPM0;
while(1);
return 0;
}
/*******************************************
函数名称:初始化函数
功 能:初始化模块调用
参 数:无
返回值 :无
********************************************/
void Init(void)
{
Init_watchdog(); // WatchdogInit
Init_uart(9600); // Uart_Init
Init_AD(); // AD_Init
}
/*******************************************
函数名称:串口发送数据
功 能:发送数据
参 数:字符串
返回值 :无
********************************************/
void Send_data(char *data)
{
unsigned char i;
for(i=0;i<strlen(data)+1;i++)
{
TXBUF1=data[i];
while((UTCTL1&TXEPT)!=TXEPT);
}
}
/*******************************************
函数名称:串口接收中断函数
功 能:串口接受
参 数:无
返回值 :无
********************************************/
//ISR for uart1 receive a byte.
#pragma vector=UART1RX_VECTOR
__interrupt void usart1_rx (void)
{
if (RXBUF1 =='u') // 'u' received?
{
_NOP();
//TXBUF1 = string1[i++];
}
}
/*******************************************
函数名称:Trans_val
功 能:将16进制ADC转换数据变换成三位10进制
真实的模拟电压数据,并在液晶上显示
参 数:Hex_Val--16进制数据
n--变换时的分母等于2的n次方
返回值 :无
********************************************/
void Trans_val(uint Hex_Val)
{
unsigned long caltmp;
uint Curr_Volt;
uchar t1,i;
uchar ptr[4];
caltmp = Hex_Val;
caltmp = (caltmp << 5) + Hex_Val; //caltmp = Hex_Val * 33
caltmp = (caltmp << 3) + (caltmp << 1); //caltmp = caltmp * 10
Curr_Volt = caltmp >> 12; //Curr_Volt = caltmp / 2^n
ptr[0] = Curr_Volt / 100; //Hex->Dec变换
t1 = Curr_Volt - (ptr[0] * 100);
ptr[2] = t1 / 10;
ptr[3] = t1 - (ptr[2] * 10);
ptr[1] = 10; //shuzi表中第10位对应符号"."
//在液晶上显示变换后的结果
uchar result[4];
for(i = 0;i < 4;i++)
{
result[i]=shuzi[ptr[i]];
}
Send_data(result);
}
/*******************************************
函数名称:ADC12ISR
功 能:ADC中断服务函数,在这里用多次平均的
计算P6.0口的模拟电压数值
参 数:无
返回值 :无
********************************************/
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR (void)
{
static uint index = 0;
results[index++] = ADC12MEM0; // Move results
if(index == Num_of_Results)
{
uchar i;
unsigned long sum = 0;
index = 0;
for(i = 0; i < Num_of_Results; i++)
{
sum += results[i];
}
sum >>= 5; //除以32
Trans_val(sum);
}
}
花了一个白天搭了下,还是挺好玩的
相关文章推荐
- 编译原理动手实操,用java实现一个简易编译器-语法解析
- [java网络编程]一个简易网络服务器的实现
- Java实现一个简易的钟表
- 一个简易的java自带的观察者模式实现
- 一个简易的Java多页面队列爬虫程序
- 用JAVA写一个简易图片防篡改
- C++程序员学Java系列之三五:一个简易的Client,Server样例
- 编写一个简易的Java NIO Reactor库
- 通过JAVA程序写一个简易的记事本
- 使用JAVA写的一个简易通讯程序(一)
- 用java写的一个简易记事本
- 一个简易的Java爬虫程序
- 使用java创建一个简易的视屏播放器
- java写的一个简易的浏览器
- Java学习笔记——实现一个简易记事本Notepad的编写
- 利用Java GUI 实现一个简易的用户管理系统
- 【JAVA】43、编写一个简易录入系统
- 使用java语言基础部分知识,做一个简易的2个数之间的关于算术运算符的计算。
- Java: 一个非常简易的万年历
- 【Arduino官方教程第一辑】示例程序 1-6 制作一个简易电压表