您的位置:首页 > 编程语言 > Java开发

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);   
  }   
}   
  

花了一个白天搭了下,还是挺好玩的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息