一.与单片机通信的窗口文件常用的控件
1.ComboBox—显示一个可编辑框,并包含一个允许值下拉列表(可在程序中编辑框内的内容;也可在属性栏的Items内添加,一行表示一个值)
2.Button—按键(我们通过按键来进行我们要进行的操作,比如启动程序)
3.Label—文字说明(不用程序进行编写,显示在界面给用户以明确的说明)
4.GroupBox—在一组控件周围显示一个带有可选标题的框架(对一个或多个控件进行组合,便于使用者理解)
5.RadioButton—单选(在许多该控件的情况下选择一个)
6.Panel—允许集合分组(比如窗口文件中需要选择多个单选控件,就可以使用该控件将单选控件分隔成多个组,使各个组的选择不受彼此影响)
7.ProgressBar—进度条(显示进度,比如时间)
8.SerialPort—串口通信(如果窗口文件要通过串行口发送数据或接收数据就需要使用该控件)
9.TextBox—允许用户输入数据(通过该控件可以输入在该控件的数据发送给单片机,也可以使得接收到的数据在该控件显示出来)
二.编写窗口文件常用的编辑字符串的函数
1.获取字符串的大小写函数(注意:字符串是不可变的,所以这些函数都不会直接改变字符串的内容,而是把修改后的字符串通过函数返回值的形式返回)
ToLower():将所有字符串转换成小写形式
ToUpper():将所有字符串转换成大写形式
2.字符串去两边的空白函数—Trim();
例:
using System;
using System.Collections.Generic;
using System.Text;
namespace 字符串函数学习
{
class Program
{
static void Main(string[] args)
{
string s = " GOOD ";
Console.WriteLine("去两边空白函数使用前:\n|{0}|",s);//调用函数前字符串两边有空白
s=s.Trim();
Console.WriteLine("去两边空白函数使用后:\n|{0}|", s);//调用函数后字符串两边无空白
Console.ReadKey();
}
}
}
3.切割函数—Spilt();
例:
string str="abc#def#ghi";
string[] star=str.Spilt('#');
//这样star[0]为abc,star[1]为def,star[2]为ghi
4.替换函数—Replace();
例:
string Str="abcdefghi";
Str=Str.Replace("abc","123");
//这样就把Str里的所有abc替换成123了
三.串行口进行数据的接收发送
- 必须添加一个头文件
using System.IO.Ports;
- 在
Form1_Load
函数内添加一行serialPort1.DataReceived += new SerialDataReceivedEventHandler(Port_DataReceive);
- 在程序内自己编写一个函数,用来进行数据的接收和发送,函数名为
Port_DataReceive
在该函数的参数区域第二个参数为SerialDataReceivedEventArgs e
- 获取所有的COM端口
serialPort1.PortName
- 获取波特率
serialPort1.BaudRate
四.必须明白哪些东西写在keil上哪些东西写在窗口文件上
- 单片机等下位机与模块进行通信的时候要用到的函数均写在keil上,单片机与窗口文件等上位机进行通信时有些程序需要写在窗口文件内。
- 将模块获取的数据读取出来并且需要转换成我们能够看懂的字符。
- 使用I2C时要清楚是谁与谁在进行通信,是单片机等下位机与模块之间在进行通信,采用模拟I2C信号。
- 在获取到的字符串数据中添加字符等数据时可以在两个地方添加。
- 在keil中的程序中发送数据时在每一位数据后面添加‘48’是保证数据转换成16进制传送,也可以用0x30替代。
附MPU-92/65单片机读取六轴数据C代码
#include <reg52.h>
#include <stdio.h>
#include <intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit sda=P1^0;
sbit scl=P1^1;
#define SMPLRT_DIV 0x19//典型值:0x07
#define CONFIG 0x1a//典型值:0x06
#define GYRO_CONFIG 0x1b//典型值:0x18
#define ACCEL_CONFIG 0x1c//典型值:0x01
#define ACCEL_XOUT_H 0x3b
#define ACCEL_XOUT_L 0x3c
#define ACCEL_YOUT_H 0x3d
#define ACCEL_YOUT_L 0x3e
#define ACCEL_ZOUT_H 0x3f
#define ACCEL_ZOUT_L 0x40
#define TEMP_OUT_H 0x41
#define TEMP_OUT_L 0x42
#define GYRO_XOUT_H 0x43
#define GYRO_XOUT_L 0x44
#define GYRO_YOUT_H 0x45
#define GYRO_YOUT_L 0x46
#define GYRO_ZOUT_H 0x47
#define GYRO_ZOUT_L 0x48
#define PWR_MGMT_1 0x6b//电源管理,典型值:0x00(正常启用)
#define WHO_AM_1 0x75//IIC地址寄存器(默认值0x68,只读)
#define SlaveAddress 0xd0//IIC写入时的地址字节数据,+1为读取
//定义掉电模式变量
uchar dis[6];
bit WK_Flag;
//函数声明
void delay(uint k);
//MPU操作函数
void Init();
void delay5us();
void I2C_start();
void I2C_stop();
void I2C_SendACK(bit ack);
bit I2C_RecvACK();
void I2C_Sendbyte(uchar dat);
uchar I2C_Recvbyte();
uchar Sigle_ReadI2C(uchar REG_Address);//读取I2C数据
void Sigle_WriteI2C(uchar REG_Address,uchar REG_data);//向I2C写入数据
//整数转字符串
void SeriPushSend(uchar send_data)
{
SBUF=send_data;
while(!TI);
TI=0;
}
//延时
void delay(uint k)
{
uint i,j;
for(i=0;i<k;i++)
{
for(j=0;j<121;j++);
}
}
//延时5us
void delay5us()
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
//I2C起始信号
void I2C_start()
{
sda=1;
scl=1;
delay5us();
sda=0;//产生下降沿
delay5us();
scl=0;
}
void I2C_stop()
{
sda=0;
scl=1;
delay5us();
sda=1;//产生上升沿
delay5us();
}
//I2C发送应答信号
void I2C_SendACK(bit ack)
{
sda=ack;//写应答信号
scl=1;
delay5us();
scl=0;
delay5us();
}
//I2C接收应答信号
bit I2C_RecvACK()
{
scl=1;
delay5us();
CY=sda; //读应答信号
scl=0;
delay5us();
return CY;
}
//向I2C总线发送一个字节数据
void I2C_Sendbyte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
dat<<=1;
sda=CY;
scl=1;
delay5us();
scl=0;
delay5us();
}
I2C_RecvACK();
}
//从I2C总线接收一个字节数据
uchar I2C_Recvbyte()
{
uchar i,dat=0;
sda=1;
for(i=0;i<8;i++)
{
dat<<=1;
scl=1;
delay5us();
dat |= sda;
scl=0;
delay5us();
}
return dat;
}
//向I2C设备写入一个字节数据
void Single_WriteI2C(uchar REG_Address,uchar REG_data)
{
I2C_start();
I2C_Sendbyte(SlaveAddress);//发送设备地址+写信号
I2C_Sendbyte(REG_Address);//内部寄存器地址
I2C_Sendbyte(REG_data);//内部寄存器数据
I2C_stop();
}
//从I2C设备读取一个字节数据
uchar Single_ReadI2C(uchar REG_Address)
{
uchar REG_data;
I2C_start();
I2C_Sendbyte(SlaveAddress);//发送设备地址+写信号
I2C_Sendbyte(REG_Address);//发送存储单元地址,从0开始
I2C_start();
I2C_Sendbyte(SlaveAddress+1);//发送设备地址+读信号
REG_data=I2C_Recvbyte();//读出寄存器数据
I2C_SendACK(1);//接收应答信号
I2C_stop();
return REG_data;
}
//初始化MPU
void Init()
{
Single_WriteI2C(PWR_MGMT_1,0x00);//解除休眠状态
Single_WriteI2C(SMPLRT_DIV,0x07);
Single_WriteI2C(CONFIG,0x06);
Single_WriteI2C(GYRO_CONFIG,0x18);
Single_WriteI2C(ACCEL_CONFIG,0x01);
}
int GetData(uchar REG_Address)
{
uchar H,L;
H=Single_ReadI2C(REG_Address);
L=Single_ReadI2C(REG_Address+1);
return (H<<8)|L;//合成数据
}
void display10bit(int value)
{
if(value<0)
{
value=-value;
SeriPushSend('-');
SeriPushSend(value/10000+48);
value%=10000;
SeriPushSend(value/1000+48);
value%=1000;
SeriPushSend(value/100+48);
value%=100;
SeriPushSend(value/10+48);
value%=10;
SeriPushSend(value+48);
SeriPushSend('#');
}
else
{
SeriPushSend(value/10000+48);
value%=10000;
SeriPushSend(value/1000+48);
value%=1000;
SeriPushSend(value/100+48);
value%=100;
SeriPushSend(value/10+48);
value%=10;
SeriPushSend(value+48);
SeriPushSend('#');
}
}
void Init_Uart()
{
TMOD=0x21;
TH1=0xfd;
TL1=0xfd;
SCON=0x50;
PS=1;//串口中断设为高优先级别
TR0=1;
TR1=1;
ET0=1;
ES=1;
EA=1;
}
//主程序
void main()
{
delay(500);//上电延时
Init_Uart();
Init();
delay(150);
while(1)
{
if(WK_Flag==0)
{
display10bit(GetData(ACCEL_XOUT_H));//显示X轴加速度
display10bit(GetData(ACCEL_YOUT_H));//显示Y轴加速度
display10bit(GetData(ACCEL_ZOUT_H));//显示Z轴加速度
display10bit(GetData(GYRO_XOUT_H));//显示X轴角速度
display10bit(GetData(GYRO_YOUT_H));//显示Y轴角速度
display10bit(GetData(GYRO_ZOUT_H));//显示Z轴角速度
SeriPushSend(0x0d);
SeriPushSend(0x0a);
delay(2000);
}
}
}
void hard() interrupt 4
{
if(RI==1)
{
RI=0;
if(SBUF==0x01)
WK_Flag=0;
if(SBUF==0x02)
WK_Flag=1;
}
}