打印
[STM32F4]

STM32F4_MPU6050六轴传感器详解

[复制链接]
楼主: kqh11a
手机看帖
扫描二维码
随时随地手机跟帖
21
kqh11a|  楼主 | 2023-6-29 18:33 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
利用STM32F4读取MPU6050的姿态步骤
1. 初始化IIC接口

        MPU6050采用IIC与STM32F4进行通讯,所以我们需要先初始化与MPU6050连接的SDA和SCL数据线。

2. 复位MPU6050

        让MPU6050内部所有寄存器恢复默认值,通过对电源管理寄存器1(0X6B)的位7写1实现。复位后,电源管理寄存器1恢复默认值(0X40),然后必须设置该寄存器为0X00,以唤醒MPU6050,进入正常工作状态。

使用特权

评论回复
22
kqh11a|  楼主 | 2023-6-29 18:34 | 只看该作者
电源管理寄存器1:



位7 DEVICE_RESET:该位设置1,重启内部寄存器到默认值。复位完成后该位自动清0。
位6 SLEEP:该位置1,MPU6050进入睡眠模式。
位5 CYCLE:当失能SLEEP且CYCLE位置1,MPU6050进入循环模式。在循环模式,设备在睡眠模式和唤醒模式间循环,根据LP_WAKE_CTRL寄存器设定的速率从加速度计采集样品数据。
位3 TEMP_DIS:该位置1,失能温度传感器。
位[2:0] CLKSEL:3位无符号数值。指定设备的系统时钟源。

使用特权

评论回复
23
kqh11a|  楼主 | 2023-6-29 18:34 | 只看该作者
其中,DEVICE_RESET 位用来控制复位,设置为 1,复位 MPU6050,复位结束后,MPU硬件自动清零该位。SLEEEP 位用于控制 MPU6050 的工作模式,复位后,该位为 1,即进入了 睡眠模式(低功耗),所以我们要清零该位,以进入正常工作模式。TEMP_DIS 用于设置是否使能温度传感器,设置为 0,则使能;CLKSEL[2:0]用于选择系统时钟源,默认是使用内部 8M RC 晶振的,精度不高,所以我们一般选择 X/Y/Z 轴陀螺作为参考的PLL 作为时钟源,一般设置 CLKSEL=001 即可。

使用特权

评论回复
24
kqh11a|  楼主 | 2023-6-29 18:34 | 只看该作者
设置角速度传感器(陀螺仪)和加速度传感器的满量程范围

        设置两个传感器的满量程范围(FSR),分别通过陀螺仪配置寄存器(0X1B)和加速度传感器配置寄存器(0X1C)设置。我们一般设置陀螺仪的满量程范围为\pm2000dps,加速度传感器的满量程范围为\pm2g。

使用特权

评论回复
25
kqh11a|  楼主 | 2023-6-29 18:35 | 只看该作者
陀螺仪配置寄存器:GYRO_CONFIG

        该寄存器用来触发陀螺仪自检和配置陀螺仪的满量程范围。

位7 XG_ST:置位X轴进行自检。
位6 YG_ST:置位Y轴进行自检。
位5 ZG_ST:置位Z轴进行自检。
位[4:3] FS_SEL:2位无符号数值,选择陀螺仪的满量程范围。

该寄存器我们只关心 FS_SEL[1:0]这两个位,用于设置陀螺仪的满量程范围:0,±250°/S;1,±500°/S;2,±1000°/S;3,±2000°/S;我们一般设置为 3,即±2000°/S,因为陀螺 仪的 ADC 为 16 位分辨率,所以得到灵敏度为:65536/4000=16.4LSB/(°/S)。

使用特权

评论回复
26
kqh11a|  楼主 | 2023-6-29 18:35 | 只看该作者
加速度传感器配置寄存器:ACCEL_CONFIG

        这寄存器是用来触发加速度计自检和配置加速度计的满量程范围。这个寄存器也可以用于配置数字高通滤波器(DHPF)。

位7 XA_ST:该位置1,加速度计的X轴执行自检。
位6 YA_ST:该位置1,加速度计的Y轴执行自检。
位5 ZA_ST:该位置1,加速度计的Z轴执行自检。
位[4:3] AFS_SEL:2位无符号值。选择加速度计的满量程范围。

该寄存器我们只关心 AFS_SEL[1:0]这两个位,用于设置加速度传感器的满量程范围:0, ±2g;1,±4g;2,±8g;3,±16g;我们一般设置为 0,即±2g,因为加速度传感器的 ADC也是 16 位,所以得到灵敏度为:65536/4=16384LSB/g。

使用特权

评论回复
27
kqh11a|  楼主 | 2023-6-29 18:36 | 只看该作者
设置其他参数

        还需要配置的参数有:关闭中断、关闭AUX IIC接口、禁止FIFO、设置陀螺仪采样率和设置数字低通滤波器(DLPF)等。

①:本节不使用中断的方式读取数据,所以关闭中断,通过中断使能寄存器(0X38)

中断使能寄存器:INT_ENABLE

该寄存器使能中断源的中断的产生



位6 MOT_EN:该位置1,该位使能运动检测(Motion detection)产生中断
位4 FIFO_OFLOW_EN:该位置1,该位使能FIFO缓冲区溢出产生中断
位3 I2C_MST_INT_EN:该位置1,该位使能IIC主机所有中断源产生中断
位0 DATA_RDY_EN:该位置1,该位使能数据就绪(Data Ready interrupt)产生中断,所有的传感器寄存器写操作完成时都会产生

使用特权

评论回复
28
kqh11a|  楼主 | 2023-6-29 18:36 | 只看该作者
本节不使用AUX IIC接口外接其他传感器(磁力传感器),所以关闭这个接口,通过用户控制寄存器(0X6A)

用户控制寄存器:USER_CTRL

该寄存器允许用户使能或使能FIFO缓冲区,IIC主机模式和主要IIC接口。



位6 FIFO_EN:该位置1,使能FIFO操作;该位清0,失能FIFO缓冲区。
位5 I2C_MST_EN:该位置1,使能I2C主机模式;该位清0,辅助I2C总线(AUX_DA 和 AUX_CL)逻辑上由主I2C总线(SDA 和 SCL)驱动
位4 I2C_IF_DIS:MPU6000---该位置1,失能主I2C接口并使能SPI接口(这里注意MPU6000系列是使用SPI进行通讯的);MPU6050该位写0
位2 FIFO_RESET:当FIFO_EN=0 该位置1,复位FIFO缓冲区。复位后该位自动清0
位1 I2C_MST_RESET:当I2C_MST_EN=0 该位置1,复位I2C主机。复位后该位自动清0
位0 SIG_COND_RESET:该位置1,复位所有传感器的信号通道(陀螺仪、加速度计和温度传感器)。

使用特权

评论回复
29
kqh11a|  楼主 | 2023-6-29 18:36 | 只看该作者
本节不使用FIFO存储传感器数据,所以关闭所有FIFO通道,通过FIFO使能寄存器(0X23)控制

FIFO使能寄存器:FIFO_EN

此寄存器决定哪个传感器的测量值被加载到FIFO缓冲区



位7 TEMP_FIFO_EN:该位置1,使能TEMP_OUT_H 和 TEMP_OUT_L寄存器加载到FIFO缓冲区
位6 XG_FIFO_EN:该位置1,使能GYRO_XOUT_H 和 GYRO_XOUT_L寄存器加载到FIFO缓冲区
位5 YG_FIFO_EN:该位置1,使能GYRO_YOUT_H 和 GYRO_YOUT_L寄存器加载到FIFO缓冲区
位4 ZG_FIFO_EN:该位置1,使能GYRO_ZOUT_H 和 GYRO_ZOUT_L寄存器加载到FIFO缓冲区
位3 ACCEL_FIFO_EN:该位置1,使能ACCEL_XOUT_H, ACCEL_XOUT_L, ACCEL_YOUT_H, ACCEL_YOUT_L, ACCEL_ZOUT_H 和
ACCEL_ZOUT_L寄存器加载到FIFO缓冲区
位2 SLV2_FIFO_EN:该位置1,使能EXT_SENS_DATA 寄存器和从机 2 加载到FIFO缓冲区
位1 SLV1_FIFO_EN:该位置1,使能EXT_SENS_DATA 寄存器和从机 1 加载到FIFO缓冲区
位0 SLV0_FIFO_EN:该位置1,使能EXT_SENS_DATA 寄存器和从机 0 加载到FIFO缓冲区
该寄存器用于控制 FIFO 使能,在简单读取传感器数据的时候,可以不用 FIFO,设置对应 位为 0 即可禁止 FIFO,设置为 1,则使能 FIFO。注意加速度传感器的 3 个轴,全由 1 个位 (ACCEL_FIFO_EN)控制,只要该位置 1,则加速度传感器的三个通道都开启 FIFO 了。

使用特权

评论回复
30
kqh11a|  楼主 | 2023-6-29 18:37 | 只看该作者
设置陀螺仪采样率通过采样率分频寄存器(0X19)控制,这个采样率我们一般设置为50

采样率分频寄存器:SMPLRT_DIV

该寄存器用于MPU60X0的陀螺仪采样频率输出设置



位[7:0] SMPLRT_DIV:8位无符号值。陀螺仪输出频率由这个值的分频所确定。
该寄存器用于设置 MPU6050 的陀螺仪采样频率,计算公式为:

采样频率 = 陀螺仪输出频率 / (1+SMPLRT_DIV)

这里陀螺仪的输出频率,是 1Khz 或者 8Khz,与数字低通滤波器(DLPF)的设置有关, 当 DLPF_CFG=0/7 的时候,频率为 8Khz,其他情况是 1Khz。而且 DLPF 滤波频率一般设置为 采样率的一半。采样率,我们假定设置为 50Hz,那么 SMPLRT_DIV=1000/50-1=19。

使用特权

评论回复
31
kqh11a|  楼主 | 2023-6-29 18:38 | 只看该作者
设置数字低通滤波器DLPF,通过配置寄存器(0X1A)设置,一般设置DLPF为带宽的1/2即可。

配置寄存器:CONFIG

该寄存器配置外部Frame Synchronization(FSYNC)引脚采样,陀螺仪和加速度计的数字低通滤波器



位[5:3] EXT_SYNC_SET:3位无符号数值。配置FSYNC引脚采样
位[2:0] DLPF_CFG:3位无符号数值。配置DLPF设置


这里的加速度传感器,输出速率(Fs)固定是 1Khz,而角速度传感器的输出速率(Fs), 则根据 DLPF_CFG 的配置有所不同。

使用特权

评论回复
32
kqh11a|  楼主 | 2023-6-29 18:39 | 只看该作者
配置系统时钟源并使能角速度传感器和加速度传感器

        系统时钟源同样是通过电源管理寄存器1(0X6B)来设置,这个前面我们已经介绍了,该寄存器的最低三位用于设置系统时钟源选择,默认值是0(内部 8M RC 震荡),不过我们一般设置为1,选择x轴陀螺PLL作为时钟源,以获得更高精度的时钟。

        同时使能加速度传感器和加速度传感器,这两个操作通过电源管理寄存器2(0X6C)来设置,设置对应位为0即可开启。

使用特权

评论回复
33
kqh11a|  楼主 | 2023-6-29 18:39 | 只看该作者
电源管理寄存器2:PWR_MGMT_2

该寄存器允许用户配置加速度计在低功耗模式下唤起的频率。也允许用户让加速度计和陀螺仪的个别轴进入待机模式



位[7:6] LP_WAKE_CTRL:2位无符号数值。指定加速度计在低功耗模式下的唤醒频率
位5 STBY_XA:该位置1,加速度计的X轴进入待机模式
位4 STBY_YA:该位置1,加速度计的Y轴进入待机模式
位3 STBY_ZA:该位置1,加速度计的Z轴进入待机模式
位2 STBY_XG:该位置1,陀螺仪的X轴进入待机模式
位1 STBY_YG:该位置1,陀螺仪的Y轴进入待机模式
位0 STBY_ZG:该位置1,陀螺仪的Z轴进入待机模式
该寄存器的 LP_WAKE_CTRL 用于控制低功耗时的唤醒频率,本章用不到。剩下的 6 位, 分别控制加速度和陀螺仪的 x/y/z 轴是否进入待机模式,这里我们全部都不进入待机模式,所以 全部设置为 0 即可。

使用特权

评论回复
34
kqh11a|  楼主 | 2023-6-29 18:39 | 只看该作者
补充:

        最后再介绍陀螺仪数据输出寄存器和加速度传感器数据输出寄存器

①:陀螺仪数据输出寄存器,总共有 6 个寄存器组成,地址为:0X43~0X48



通过读这六个寄存器,就可以读到陀螺仪x/y/z轴的值。比方说X轴的数据,可以通过读取0X43(高8位)和0X44(低8位)寄存器得到。

                                                                                                Y轴的数据,通过读取0X45和0X46寄存器得到。

                                                                                                Z轴的数据,通过读取0X47和0X48寄存器得到。

注:这六个寄存器都是8位寄存器,而读取陀螺仪x/y/z的寄存器都是十六位寄存器,所以每两个寄存器配置一个轴。

使用特权

评论回复
35
kqh11a|  楼主 | 2023-6-29 18:40 | 只看该作者
加速度传感器数据输出寄存器,也是6个寄存器组成,地址为:0X3B~0X40



同理,该寄存器和陀螺仪数据输出寄存器的配置方法相同。

使用特权

评论回复
36
kqh11a|  楼主 | 2023-6-29 18:40 | 只看该作者
温度传感器的值,通过读取0X41(高8位)和0X42(低8位)寄存器得到



温度转换公式为:

Temperature = 36.53 + regval/340

其中,Temperature为计算得到的温度值,单位是℃,regval为从寄存器0X41和0X42读取的温度传感器值。

使用特权

评论回复
37
kqh11a|  楼主 | 2023-6-29 18:40 | 只看该作者
硬件设计
        MPU6050通过三根线与STM32F4开发板连接,其中IIC总线和AT24C02以及WM8978共用,接在PB8和PB9上面。MPU6050的中断输出,连接在STM32F4的PC0引脚上(本实验不使用MPU6050的中断输出)。

        另外,AD0接GND,所以MPU6050的器件地址是:0X68。

使用特权

评论回复
38
kqh11a|  楼主 | 2023-6-29 18:40 | 只看该作者
实验程序
实验功能:

        程序先初始化MPU6050等外设,然后利用DMP库,初始化MPU6050及使能DMP,最后,在死循环里面不停的读取:温度传感器、加速度传感器、陀螺仪、DMP姿态解算后的欧拉角等数据,通过串口上报给上位机(温度不上报),利用上位机软件(ANO_Tech 匿名四轴上位_V2.6.exe),可以实时显示MPU6050的传感器状态曲线,并显示3D姿态。

使用特权

评论回复
39
kqh11a|  楼主 | 2023-6-29 18:41 | 只看该作者
ANO_Tech 匿名四轴上位机_V2.6.exe
ANO_Tech 匿名四轴上位机_V2.6.exe 软件基本参数设置如下:

使用特权

评论回复
40
kqh11a|  楼主 | 2023-6-29 18:52 | 只看该作者
main.c
#include "stm32f4xx.h"                 
#include "delay.h"
#include "usart.h"
#include "LED.h"
#include "lcd.h"
#include "Key.h"
#include "usmart.h"
#include "MyI2C.h"
#include "AT24C02.h"
#include "MyMPU6050.h"
#include "inv_mpu.h"
#include "inv_mpu_dmp_motion_driver.h"

//LCD状态设置函数
void led_set(u8 sta)//只要工程目录下有usmart调试函数,主函数就必须调用这两个函数
{
        LED1=sta;
}
//函数参数调用测试函数
void test_fun(void(*ledset)(u8),u8 sta)
{
        led_set(sta);
}
//串口1发送一个字符
//c:要发送的字符
void usart1_send_char(u8 c)
{
        while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);//获取串口发送状态位,可以发送
        USART_SendData(USART1,c); //将一个字符通过串口1发送
}
//传送数据给匿名四轴上位机软件
//Function:功能字  0XA0~0XAF
//Data:数据缓存区 最多28字节!
//Length:Data区有效数据的个数
void usart1_Anonymous_Report(u8 Function,u8 *Data,u8 Length)
{
        u8 send_buffer[32];
        u8 i;
        if(Length>28)
                return;
        send_buffer[Length+3]=0; //校验数置零
        send_buffer[0]=0X88;        //帧头
        send_buffer[1]=Function;        //功能字
        send_buffer[2]=Length;        //数据长度
        for(i=0;i<Length;i++)send_buffer[3+i]=Data[i];                        //复制数据
        for(i=0;i<Length+3;i++)send_buffer[Length+3]+=send_buffer[i];        //计算校验和       
        for(i=0;i<Length+4;i++)usart1_send_char(send_buffer[i]);        //发送数据到串口1
}
//发送加速度传感器数据和陀螺仪数据
//aacx,aacy,aacz:x,y,z三个方向上面的加速度值
//gyrox,gyroy,gyroz:x,y,z三个方向上面的陀螺仪值
void MPU6050_Send_Data(short aacx,short aacy,short aacz,short gyrox,short gyroy,short gyroz)
{
        u8 Buffer[12];  //数组中可以存放12个8字节大小的数据
        Buffer[0]=(aacx>>8)&0XFF; //MyMPU6050.c文件中获取的原始值都是16位的,所有首先右移8位,与0XFF进行与&操作,取出高8位
        Buffer[1]=aacx&0XFF;          //直接进行与&操作,取出低8位
        Buffer[2]=(aacy>>8)&0XFF;
        Buffer[3]=aacy&0XFF;
        Buffer[4]=(aacz>>8)&0XFF;
        Buffer[5]=aacz&0XFF;
        Buffer[6]=(gyrox>>8)&0XFF;
        Buffer[7]=gyrox&0XFF;
        Buffer[8]=(gyroy>>8)&0XFF;
        Buffer[9]=gyroy&0XFF;
        Buffer[10]=(gyroz>>8)&0XFF;
        Buffer[11]=gyroz&0XFF;
        usart1_Anonymous_Report(0XA1,Buffer,12);  //通过调用函数将原始值发送给四轴匿名上位机软件 0XA1是自定义帧
}
//通过串口1上报解算后的姿态数据给电脑
//aacx,aacy,aacz:x,y,z三个方向上面的加速度值
//gyrox,gyroy,gyroz:x,y,z三个方向上面的陀螺仪值
//roll:横滚角.单位0.01度。 -18000 -> 18000 对应 -180.00  ->  180.00度
//pitch:俯仰角.单位 0.01度。-9000 - 9000 对应 -90.00 -> 90.00 度
//yaw:航向角.单位为0.1度 0 -> 3600  对应 0 -> 360.0度
void Usart1_Report_InComputer(short aacx,short aacy,short aacz,short gyrox,short gyroy,short gyroz,short roll,short pitch,short yaw)
{
        u8 Buffer[28];
        u8 i=0;
        for(i=0;i<28;i++)
        {
                Buffer[i]=0; //清0
        }
        Buffer[0]=(aacx>>8)&0XFF;//MyMPU6050.c文件中获取的原始值都是16位的,所有首先右移8位,与0XFF进行与&操作,取出高8位
        Buffer[1]=aacx&0XFF;        //直接进行与&操作,取出低8位
        Buffer[2]=(aacy>>8)&0XFF;
        Buffer[3]=aacy&0XFF;
        Buffer[4]=(aacz>>8)&0XFF;
        Buffer[5]=aacz&0XFF;
        Buffer[6]=(gyrox>>8)&0XFF;
        Buffer[7]=gyrox&0XFF;
        Buffer[8]=(gyroy>>8)&0XFF;
        Buffer[9]=gyroy&0XFF;
        Buffer[10]=(gyroz>>8)&0XFF;
        Buffer[11]=gyroz&0XFF;       
        Buffer[18]=(roll>>8)&0XFF;
        Buffer[19]=roll&0XFF;
        Buffer[20]=(pitch>>8)&0XFF;
        Buffer[21]=pitch&0XFF;
        Buffer[22]=(yaw>>8)&0XFF;
        Buffer[23]=yaw&0XFF;
        usart1_Anonymous_Report(0XAF,Buffer,28); //飞控显示帧,0XAF
}
int main(void)
{
        u8 t=0;
        u8 Report=1;  //默认开启上报
        u8 key=0;
        float pitch,roll,yaw; //欧拉角
        short aacx,aacy,aacz; //加速度传感器原始数据
        short gyrox,gyroy,gyroz; //陀螺仪原始数据
        short temp;    //温度
        delay_init(168);
        uart_init(500000);   //初始化串口波特率为500000
       
        LED_Init();
        LCD_Init();
        Key_Init();
        MPU6050_Init();
       
        POINT_COLOR=RED;
        LCD_ShowString(30,50,200,16,16,"Explorer STM32F4");
        LCD_ShowString(30,70,200,16,16,"MPU6050 Test");
        LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
        LCD_ShowString(30,110,200,16,16,"2023/20/23");
       
        while(mpu_dmp_init())
        {
                LCD_ShowString(30,130,200,16,16,"MPU6050 Error");
                delay_ms(200);
                LCD_Fill(30,130,239,130+16,WHITE);
                delay_ms(200);
        }
        LCD_ShowString(30,130,200,16,16,"MPU6050 OK");
        LCD_ShowString(30,150,200,16,16,"KEY0:UPLOAD ON/OFF");
       
        POINT_COLOR=BLUE;
        LCD_ShowString(30,170,200,16,16,"UPLOAD ON");
        LCD_ShowString(30,200,200,16,16," Temp:    . C");
        LCD_ShowString(30,220,200,16,16,"Pitch:    . C");
        LCD_ShowString(30,240,200,16,16," Roll:    . C");
        LCD_ShowString(30,260,200,16,16," Yaw :    . C");
       
        while(1)
        {
                key=KEY_Scan(0);
                if(key==1)  //KEY0按键按下
                {
                        Report=!Report;
                        if(Report)
                        {
                                LCD_ShowString(30,170,200,16,16,"UPLOAD ON");
                        }
                        else
                                LCD_ShowString(30,170,200,16,16,"UPLOAD OFF");
                }
                if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0) //该mpu_dmp_get_data函数得到DMP处理后的欧拉角数据,返回0表示正确
                {
                        temp=MPU6050_Get_Temperature();                                   //得到温度数据
                        MPU6050_Get_Gyroscope(&gyrox,&gyroy,&gyroz);        //得到陀螺仪数据
                        MPU6050_Get_Accelerometer(&aacx,&aacy,&aacz);        //得到加速度数据
                        if(Report)
                                MPU6050_Send_Data(aacx,aacy,aacz,gyrox,gyroy,gyroz);//用自定义帧发送加速度和陀螺仪原始数据
                        if(Report)
                                Usart1_Report_InComputer(aacx,aacy,aacz,gyrox,gyroy,gyroz,(int)(roll*100),(int)(pitch*100),(int)(yaw*10));//串口1上报姿态转换后的数据给电脑
                        if((t%10)==0)
                        {
                                if(temp<0)
                                {
                                        LCD_ShowChar(30+6*8,200,'-',16,0); //显示负号
                                        temp=-temp; //转换为正数
                                }
                                else
                                {
                                        LCD_ShowChar(30+6*8,200,' ',16,0); //去掉负号
                                }
                                LCD_ShowNum(30+7*8,200,temp/100,3,16); //显示整数部分
                                LCD_ShowNum(30+8*11,200,temp%10,1,16); //显示小数部分
                                temp=pitch*10; //实际上显示的是pitch角的整数部分和小数部分
                               
                                if(temp<0)
                                {
                                        LCD_ShowChar(30+6*8,220,'-',16,0); //显示负号
                                        temp=-temp; //转换为正数
                                }
                                else
                                {
                                        LCD_ShowChar(30+6*8,220,' ',16,0); //去掉负号
                                }
                                LCD_ShowNum(30+7*8,220,temp/10,3,16); //显示整数部分
                                LCD_ShowNum(30+8*11,220,temp%10,1,16); //显示小数部分
                                temp=roll*10; //实际上显示的是roll角的整数部分和小数部分
                               
                                if(temp<0)
                                {
                                        LCD_ShowChar(30+6*8,240,'-',16,0); //显示负号
                                        temp=-temp; //转换为正数
                                }
                                else
                                {
                                        LCD_ShowChar(30+6*8,240,' ',16,0); //去掉负号
                                }
                                LCD_ShowNum(30+7*8,240,temp/10,3,16); //显示整数部分
                                LCD_ShowNum(30+8*11,240,temp%10,1,16); //显示小数部分
                                temp=yaw*10; //实际上显示的是yaw角的整数部分和小数部分
                               
                                if(temp<0)
                                {
                                        LCD_ShowChar(30+6*8,260,'-',16,0); //显示负号
                                        temp=-temp; //转换为正数
                                }
                                else
                                {
                                        LCD_ShowChar(30+6*8,260,' ',16,0); //去掉负号
                                }
                                LCD_ShowNum(30+7*8,260,temp/10,3,16); //显示整数部分
                                LCD_ShowNum(30+8*11,260,temp%10,1,16); //显示小数部分
                                t=0;
                                LED0=!LED0;
                        }
                }
                t++;
        }
}


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则