找回密码
 立即注册
楼主: 好学天上

OPT4048颜色传感器

[复制链接]

14

主题

1422

回帖

7861

积分

论坛元老

积分
7861
发表于 2026-8-24 10:46:33 | 显示全部楼层
一个程序试试

  1. /*
  2. =============================================================================
  3. STC32G12K128 + OPT4048 颜色传感器驱动程序
  4. =============================================================================
  5. 硬件连接:
  6.    - OPT4048 SCL  -> STC32G P1.5
  7.    - OPT4048 SDA  -> STC32G P1.4
  8.    - OPT4048 VDD  -> 3.3V (传感器供电为1.8V~3.6V)
  9.    - OPT4048 GND  -> GND
  10.    - OPT4048 ADDR -> GND (I2C地址0x44)
  11.    
  12. 串口3调试输出: TxD3=P0.1, RxD3=P0.0, 波特率115200
  13.    
  14. 编译平台: Keil C251
  15. 头文件: stc32g.h (STC官方提供)
  16. 工作频率: 内部IRC = 11.0592MHz
  17. =============================================================================
  18. */
  19. #include "stc32g.h"
  20. #include "intrins.h"
  21. #include <stdio.h>
  22. //=============================================================================
  23. // 常量定义
  24. //=============================================================================
  25. #define FOSC  11059200UL
  26. // 串口波特率重装值 (115200)
  27. #define BRT   (65536 - (FOSC / 115200 + 2) / 4)
  28. // OPT4048 I2C 地址
  29. #define OPT_ADDR_WR   0x88   // 0x44<<1
  30. #define OPT_ADDR_RD   0x89   // (0x44<<1)|1
  31. // OPT4048 寄存器 (与用户上传头文件一致)
  32. #define REG_EXP_CH0   0x00   // 红 指数+结果MSB
  33. #define REG_CNT_CH0   0x01   // 红 结果LSB+计数+CRC
  34. #define REG_EXP_CH1   0x02   // 绿 指数+结果MSB
  35. #define REG_CNT_CH1   0x03   // 绿 结果LSB+计数+CRC
  36. #define REG_EXP_CH2   0x04   // 蓝 指数+结果MSB
  37. #define REG_CNT_CH2   0x05   // 蓝 结果LSB+计数+CRC
  38. #define REG_EXP_CH3   0x06   // 白 指数+结果MSB
  39. #define REG_CNT_CH3   0x07   // 白 结果LSB+计数+CRC
  40. #define REG_CONTROL   0x0A   // 控制寄存器
  41. #define REG_DEVICE_ID 0x11   // 设备ID
  42. #define OPT_DEV_ID    0x2084 // 设备ID值
  43. // 控制寄存器配置: 连续转换, 50ms, 2KLUX2, qwake=1
  44. // qwake=1(reserved=0)(range=0000)(ctime=0111)(op=11)(latch=0)(pol=0)(fc=00)
  45. #define OPT_CONTROL_VAL 0x874C
  46. //=============================================================================
  47. // 全局变量
  48. //=============================================================================
  49. bit    g_i2c_busy;               // I2C忙标志
  50. bit    g_uart_busy;              // 串口发送忙标志
  51. unsigned char g_rx_ptr, g_tx_ptr;
  52. unsigned long g_adc[4];          // 4通道数据
  53. char g_strbuf[64];               // 格式化输出缓冲
  54. //=============================================================================
  55. // I2C 底层驱动 (查询方式, 参考手册范例)
  56. //=============================================================================
  57. // 等待I2C命令完成
  58. void I2C_Wait(void)
  59. {
  60.     while (!(I2CMSST & 0x40));   // 等待MSIF
  61.     I2CMSST &= ~0x40;            // 清标志
  62. }
  63. void I2C_Start(void)
  64. {
  65.     I2CMSCR = 0x01;              // START命令
  66.     I2C_Wait();
  67. }
  68. void I2C_SendData(unsigned char d)
  69. {
  70.     I2CTXD = d;
  71.     I2CMSCR = 0x02;              // 发送数据
  72.     I2C_Wait();
  73. }
  74. void I2C_RecvACK(void)
  75. {
  76.     I2CMSCR = 0x03;              // 接收ACK
  77.     I2C_Wait();
  78. }
  79. unsigned char I2C_RecvData(void)
  80. {
  81.     I2CMSCR = 0x04;              // 接收数据
  82.     I2C_Wait();
  83.     return I2CRXD;
  84. }
  85. void I2C_SendACK(void)
  86. {
  87.     I2CMSST = 0x00;              // ACK
  88.     I2CMSCR = 0x05;
  89.     I2C_Wait();
  90. }
  91. void I2C_SendNAK(void)
  92. {
  93.     I2CMSST = 0x01;              // NAK
  94.     I2CMSCR = 0x05;
  95.     I2C_Wait();
  96. }
  97. void I2C_Stop(void)
  98. {
  99.     I2CMSCR = 0x06;              // STOP
  100.     I2C_Wait();
  101. }
  102. //=============================================================================
  103. // OPT4048 寄存器读写
  104. //=============================================================================
  105. // 写16位寄存器
  106. void OPT_WriteReg(unsigned char reg, unsigned int val)
  107. {
  108.     I2C_Start();
  109.     I2C_SendData(OPT_ADDR_WR);       // 设备地址+写
  110.     I2C_RecvACK();
  111.     I2C_SendData(reg);               // 寄存器地址
  112.     I2C_RecvACK();
  113.     I2C_SendData((unsigned char)(val >> 8));   // 高字节
  114.     I2C_RecvACK();
  115.     I2C_SendData((unsigned char)(val & 0xFF)); // 低字节
  116.     I2C_RecvACK();
  117.     I2C_Stop();
  118. }
  119. // 读16位寄存器
  120. unsigned int OPT_ReadReg(unsigned char reg)
  121. {
  122.     unsigned int val;
  123.     unsigned char hi, lo;
  124.     // 写寄存器地址
  125.     I2C_Start();
  126.     I2C_SendData(OPT_ADDR_WR);
  127.     I2C_RecvACK();
  128.     I2C_SendData(reg);
  129.     I2C_RecvACK();
  130.     // 重新START, 读操作
  131.     I2C_Start();
  132.     I2C_SendData(OPT_ADDR_RD);
  133.     I2C_RecvACK();
  134.     hi = I2C_RecvData();
  135.     I2C_SendACK();
  136.     lo = I2C_RecvData();
  137.     I2C_SendNAK();
  138.     I2C_Stop();
  139.     return ((unsigned int)hi << 8) | lo;
  140. }
  141. // 计算单个通道ADC值: result = mantissa * 2^exponent
  142. unsigned long OPT_GetADC(unsigned char exp_reg)
  143. {
  144.     unsigned int  exp_res, res_cnt;
  145.     unsigned long mantissa;
  146.     unsigned char exponent;
  147.     exp_res = OPT_ReadReg(exp_reg);       // 指数+结果MSB
  148.     res_cnt = OPT_ReadReg(exp_reg + 1);   // 结果LSB+计数+CRC
  149.     exponent = (unsigned char)(exp_res & 0x0F);
  150.     mantissa = (unsigned long)((exp_res >> 4) & 0x0FFF);
  151.     mantissa = (mantissa << 8) | (unsigned long)(res_cnt & 0xFF);
  152.     return mantissa << exponent;
  153. }
  154. // 初始化OPT4048
  155. unsigned char OPT_Init(void)
  156. {
  157.     unsigned int dev_id;
  158.     dev_id = OPT_ReadReg(REG_DEVICE_ID);
  159.     if (dev_id != OPT_DEV_ID)
  160.         return 0;                         // 设备未找到
  161.     OPT_WriteReg(REG_CONTROL, OPT_CONTROL_VAL);  // 连续转换
  162.     return 1;
  163. }
  164. // 读取全部4通道
  165. void OPT_ReadAll(void)
  166. {
  167.     g_adc[0] = OPT_GetADC(REG_EXP_CH0);   // 红
  168.     g_adc[1] = OPT_GetADC(REG_EXP_CH1);   // 绿
  169.     g_adc[2] = OPT_GetADC(REG_EXP_CH2);   // 蓝
  170.     g_adc[3] = OPT_GetADC(REG_EXP_CH3);   // 白
  171. }
  172. //=============================================================================
  173. // 串口3 驱动 (定时器2做波特率发生器)
  174. //=============================================================================
  175. // 串口3中断服务
  176. void Uart3_Isr(void) interrupt 17
  177. {
  178.     if (S3TI) { S3TI = 0; g_uart_busy = 0; }
  179.     if (S3RI) { S3RI = 0; }
  180. }
  181. void Uart3_Init(void)
  182. {
  183.     S3CON = 0x10;          // 8位数据模式, 允许接收
  184.     T2L = (unsigned char)BRT;
  185.     T2H = (unsigned char)(BRT >> 8);
  186.     T2x12 = 1;             // 1T模式
  187.     T2R = 1;               // 启动定时器2
  188. }
  189. void Uart3_SendByte(unsigned char d)
  190. {
  191.     while (g_uart_busy);
  192.     g_uart_busy = 1;
  193.     S3BUF = d;
  194. }
  195. void Uart3_SendStr(char *p)
  196. {
  197.     while (*p) Uart3_SendByte((unsigned char)(*p++));
  198. }
  199. void Uart3_SendLong(unsigned long v)
  200. {
  201.     sprintf(g_strbuf, "%lu", v);
  202.     Uart3_SendStr(g_strbuf);
  203. }
  204. //=============================================================================
  205. // 延时函数
  206. //=============================================================================
  207. void Delay_ms(unsigned int ms)
  208. {
  209.     unsigned int i, j;
  210.     for (i = 0; i < ms; i++)
  211.         for (j = 0; j < 1382; j++)   // 约1ms @11.0592MHz
  212.             _nop_();
  213. }
  214. //=============================================================================
  215. // 主函数
  216. //=============================================================================
  217. void main(void)
  218. {
  219.     // 系统初始化
  220.     EAXFR = 1;                 // 使能XFR访问
  221.     CKCON = 0x00;              // 外部数据总线最快
  222.     WTST = 0x00;               // 程序等待最快
  223.     // 端口初始化: 全部准双向口
  224.     P0M0 = 0x00;  P0M1 = 0x00;
  225.     P1M0 = 0x00;  P1M1 = 0x00;
  226.     P2M0 = 0x00;  P2M1 = 0x00;
  227.     P3M0 = 0x00;  P3M1 = 0x00;
  228.     P4M0 = 0x00;  P4M1 = 0x00;
  229.     P5M0 = 0x00;  P5M1 = 0x00;
  230.     // I2C 初始化: 主机模式, 默认引脚P1.4/P1.5
  231.     // MSSPEED=0x20时, 总线速度 = SYSCLK/2/(0x20*2+4) = 11.0592M/72 ≈ 154kHz
  232.     I2CCFG = 0xE0;             // ENI2C=1, MSSL=1(主机), MSSPEED=0x20
  233.     I2CMSST = 0x00;
  234.     // 串口3初始化
  235.     Uart3_Init();
  236.     ES3 = 1;
  237.     EA = 1;
  238.     Uart3_SendStr("\r\n=== OPT4048 Color Sensor Test ===\r\n");
  239.     // 初始化传感器
  240.     if (OPT_Init())
  241.         Uart3_SendStr("OPT4048 found (ID=0x2084)!\r\n");
  242.     else
  243.     {
  244.         Uart3_SendStr("OPT4048 NOT found!\r\n");
  245.         while (1);
  246.     }
  247.     // 主循环: 持续读取并输出颜色数据
  248.     while (1)
  249.     {
  250.         OPT_ReadAll();
  251.         Uart3_SendStr("R=");
  252.         Uart3_SendLong(g_adc[0]);
  253.         Uart3_SendStr(" G=");
  254.         Uart3_SendLong(g_adc[1]);
  255.         Uart3_SendStr(" B=");
  256.         Uart3_SendLong(g_adc[2]);
  257.         Uart3_SendStr(" W=");
  258.         Uart3_SendLong(g_adc[3]);
  259.         Uart3_SendStr("\r\n");
  260.         Delay_ms(500);
  261.     }
  262. }
复制代码
回复

使用道具 举报 送花

9

主题

69

回帖

567

积分

高级会员

积分
567
 楼主| 发表于 2026-8-24 10:48:05 | 显示全部楼层
梁*** 发表于 2026-8-24 10:14
厂家或卖家没有给程序码?
AI给程序只是省去打字的时间,程序逻辑还是要自己过一遍,核对寄存器的操作,A ...

这是ai给我生成的代码,可以生成,但是读取的都是

[code]/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/*---------------------------------------------------------------------*/
#include "STC32G.h"
#include <intrins.h>

typedef
截图202608241047592961.jpg
好好学习天天向上
回复

使用道具 举报 送花

9

主题

69

回帖

567

积分

高级会员

积分
567
 楼主| 发表于 2026-8-24 10:57:17 | 显示全部楼层

好滴我试试
好好学习天天向上
回复

使用道具 举报 送花

9

主题

69

回帖

567

积分

高级会员

积分
567
 楼主| 发表于 2026-8-24 10:57:32 | 显示全部楼层
好学*** 发表于 2026-8-24 10:48
这是ai给我生成的代码,可以生成,但是读取的都是

[code]/*------------------------------------------ ...

/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/*---------------------------------------------------------------------*/
#include "STC32G.h"
#include <intrins.h>

typedef         unsigned char        u8;
typedef         unsigned int        u16;
typedef         unsigned long        u32;

#define MAIN_Fosc        22118400L
#define Baudrate2   (65536 - MAIN_Fosc / 115200 / 4)
#define UART2_BUF_LENGTH    128

/*************  本地变量声明    **************/
u8  TX2_Cnt;
u8  RX2_Cnt;
bit B_TX2_Busy;
u8  RX2_Buffer[UART2_BUF_LENGTH];

//OPT4048变量 全局edata,避免C172段溢出
unsigned int rawX,rawY,rawZ,rawW;
float cie_x,cie_y,lux,cct;

//======== OPT4048 I2C引脚 P2.4 SDA  P2.5 SCL ========
sbit I2C_SDA  = P2^4;
sbit I2C_SCL  = P2^5;

#define OPT4048_ADDR        0x44
#define OPT4048_REG_RESULT0 0x00
#define OPT4048_REG_RESULT1 0x01
#define OPT4048_REG_RESULT2 0x02
#define OPT4048_REG_RESULT3 0x03
#define OPT4048_REG_CONFIG  0x04

#define CONV_TIME_100MS    (0x0B << 4)
#define MODE_CONTINUOUS    (0x02 << 1)
#define RANGE_0            (0x00 << 8)  //满量程 440lux

/*************  本地函数声明    **************/
void UART2_config(u8 brt);
void PrintString2(u8 *puts);
void GPIO_I2C_Init(void);
void I2C_Delay(void);
void I2C_Start(void);
void I2C_Stop(void);
bit I2C_WriteByte(unsigned char dat);
unsigned char I2C_ReadByte(bit ack_en);
bit OPT4048_WriteReg(unsigned char reg, unsigned int val);
bit OPT4048_ReadXYZ(unsigned int *X, unsigned int *Y, unsigned int *Z, unsigned int *W);
bit OPT4048_Init(void);
void OPT4048_Calc(unsigned int rawX,unsigned int rawY,unsigned int rawZ,
                   float *out_x, float *out_y, float *out_lux, float *out_cct);
void UART2_SendFloat(float val, unsigned char dec);
void Delay_ms(unsigned int ms);

/******************** 主函数 **************************/
void main(void)
{
    WTST = 0;
    EAXFR = 1;
    CKCON = 0;
    P0M1 = 0x30;   P0M0 = 0x30;
    P1M1 = 0x30;   P1M0 = 0x30;
    P2M0 &= ~0x31; P2M1 &= ~0x31;
    P3M1 = 0x50;   P3M0 = 0x50;
    P4M1 = 0x3c;   P4M0 = 0x3c;
    P5M1 = 0x0c;   P5M0 = 0x0c;
    P6M1 = 0xff;   P6M0 = 0xff;
    P7M1 = 0x00;   P7M0 = 0x00;

    GPIO_I2C_Init();
    UART2_config(2);
    EA = 1;

    PrintString2((u8*)"OPT4048 ready, send any byte to trigger read!\r\n");

    if(OPT4048_Init() != 0)
    {
        PrintString2((u8*)"OPT4048 init FAIL!\r\n");
        while(1);
    }
    PrintString2((u8*)"OPT4048 init OK\r\n");


   while (1)
{
    if(RX2_Cnt != TX2_Cnt)
    {
        TX2_Cnt = RX2_Cnt;

        //读取,失败重试一次
        if(OPT4048_ReadXYZ(&rawX,&rawY,&rawZ,&rawW) != 0)
        {
            PrintString2((u8*)"I2C read error!\r\n");
        }
        // 如果全部为0,再等110ms重读一次
        else if(rawX == 0 && rawY ==0 && rawZ ==0)
        {
            Delay_ms(110);
            OPT4048_ReadXYZ(&rawX,&rawY,&rawZ,&rawW);
        }

        PrintString2((u8*)"--------DATA--------\r\n");
        //打印原始寄存器值,方便定位
        PrintString2((u8*)"RAW X,Y,Z,W:");
        UART2_SendFloat((float)rawX,0); PrintString2((u8*)",");
        UART2_SendFloat((float)rawY,0); PrintString2((u8*)",");
        UART2_SendFloat((float)rawZ,0); PrintString2((u8*)",");
        UART2_SendFloat((float)rawW,0); PrintString2((u8*)"\r\n");

        OPT4048_Calc(rawX,rawY,rawZ,&cie_x,&cie_y,&lux,&cct);

        PrintString2((u8*)"CIE-x:");
        UART2_SendFloat(cie_x,4);
        PrintString2((u8*)"\r\n");

        PrintString2((u8*)"CIE-y:");
        UART2_SendFloat(cie_y,4);
        PrintString2((u8*)"\r\n");

        PrintString2((u8*)"Lux(亮度):");
        UART2_SendFloat(lux,2);
        PrintString2((u8*)" lx\r\n");

        PrintString2((u8*)"CCT(色温):");
        UART2_SendFloat(cct,1);
        PrintString2((u8*)" K\r\n");
        PrintString2((u8*)"--------------------\r\n\r\n");
    }
}

}

//========================================================================
// 函数: void PrintString2(u8 *puts) 原厂原样
//========================================================================
void PrintString2(u8 *puts)
{
    for (; *puts != 0;  puts++)
    {
        S2BUF = *puts;
        B_TX2_Busy = 1;
        while(B_TX2_Busy);
    }
}

//========================================================================
// 函数: SetTimer2Baudraye(u32 dat) 原厂原样
//========================================================================
void SetTimer2Baudraye(u32 dat)
{
    T2R = 0;
    T2_CT = 0;
    T2x12 = 1;
    T2H = (u8)(dat / 256);
    T2L = (u8)(dat % 256);
    ET2 = 0;
    T2R = 1;
}

//========================================================================
// 函数: void UART2_config(u8 brt) 原厂原样
//========================================================================
void UART2_config(u8 brt)
{
    if(brt == 2)
    {
        SetTimer2Baudraye(Baudrate2);
        S2CFG |= 0x01;
        S2CON = (S2CON & 0x3f) | 0x40;
        ES2   = 1;
        S2REN = 1;
        S2_S  = 1;         //UART2映射 P4.6(TX2), P4.7(RX2)
        B_TX2_Busy = 0;
        TX2_Cnt = 0;
        RX2_Cnt = 0;
    }
}

//========================================================================
// 函数: void UART2_int (void) interrupt UART2_VECTOR 原厂中断原样
//========================================================================
void UART2_int (void) interrupt 8
{
    if(S2RI)
    {
        S2RI = 0;
        RX2_Buffer[RX2_Cnt] = S2BUF;
        if(++RX2_Cnt >= UART2_BUF_LENGTH)   RX2_Cnt = 0;
    }
    if(S2TI)
    {
        S2TI = 0;
        B_TX2_Busy = 0;
    }
}

//==================== I2C OPT4048 部分 ====================
void GPIO_I2C_Init(void)
{
    I2C_SDA = 1;
    I2C_SCL = 1;
}

void I2C_Delay(void)
{
    unsigned char i;
    for(i = 0; i < 150; i++) _nop_();
}

void I2C_Start(void)
{
    I2C_SDA = 1;
    I2C_Delay();
    I2C_SCL = 1;
    I2C_Delay();
   I2C_SDA= 0;
    I2C_Delay();
    I2C_SCL= 0;
    I2C_Delay();
}

void I2C_Stop(void)
{
          I2C_SDA = 0;
    I2C_Delay();
    I2C_SCL= 1;
    I2C_Delay();
    I2C_SDA = 1;
    I2C_Delay();
}

bit I2C_WriteByte(unsigned char dat)
{
    unsigned char i;
    bit ack;
    for(i = 0; i < 8; i++)
    {
        if(dat & 0x80)  I2C_SDA = 1;
        else            I2C_SDA= 0;
        dat <<= 1;
        I2C_Delay();
        I2C_SCL = 1;
                        I2C_Delay();
        I2C_SCL = 0;
                        I2C_Delay();
    }
    I2C_SDA = 1;
    I2C_Delay();
    I2C_SCL = 1;
                I2C_Delay();
    ack = I2C_SDA;
    I2C_SCL = 0;
    return ack;
       
}

unsigned char I2C_ReadByte(bit ack_en)
{
    unsigned char i, dat = 0;
    I2C_SDA = 1;
    for(i = 0; i < 8; i++)
    {
        dat <<= 1;
        I2C_SCL = 1; I2C_Delay();
        if(I2C_SDA) dat |= 0x01;
        I2C_SCL = 0; I2C_Delay();
    }
    I2C_SDA = !ack_en;
    I2C_Delay();
    I2C_SCL = 1; I2C_Delay();
    I2C_SCL = 0;
    I2C_SDA = 1;
    return dat;
}

bit OPT4048_WriteReg(unsigned char reg, unsigned int val)
{
    I2C_Start();
    if(I2C_WriteByte(OPT4048_ADDR << 1)) {I2C_Stop(); return 1;}
    if(I2C_WriteByte(reg))               {I2C_Stop(); return 1;}
    if(I2C_WriteByte((val >> 8) & 0xFF)){I2C_Stop(); return 1;}
    if(I2C_WriteByte(val & 0xFF))        {I2C_Stop(); return 1;}
    I2C_Stop();
    return 0;
}

bit OPT4048_ReadXYZ(unsigned int *X, unsigned int *Y, unsigned int *Z, unsigned int *W)
{
    I2C_Start();
    if(I2C_WriteByte(OPT4048_ADDR << 1))    {I2C_Stop(); return 1;}
    if(I2C_WriteByte(OPT4048_REG_RESULT0))  {I2C_Stop(); return 1;}
    I2C_Start();
    if(I2C_WriteByte((OPT4048_ADDR <<1)|0x01)) {I2C_Stop(); return 1;}

    *X = (I2C_ReadByte(1) << 8) | I2C_ReadByte(1);
    *Y = (I2C_ReadByte(1) << 8) | I2C_ReadByte(1);
    *Z = (I2C_ReadByte(1) << 8) | I2C_ReadByte(1);
    *W = (I2C_ReadByte(0) << 8) | I2C_ReadByte(0);
    I2C_Stop();
    return 0;
}

bit OPT4048_Init(void)
{
    unsigned int cfg;
    cfg = RANGE_0 | CONV_TIME_100MS | MODE_CONTINUOUS;
    if(OPT4048_WriteReg(OPT4048_REG_CONFIG, cfg))
    {
        return 1;
    }
    // 关键!配置完成,等待第一次100ms转换完成
    Delay_ms(120);
    return 0;
}


void OPT4048_Calc(unsigned int rawX,unsigned int rawY,unsigned int rawZ,
                   float *out_x, float *out_y, float *out_lux, float *out_cct)
{
    float X,Y,Z,sum,n;
    X = (float)rawX;
    Y = (float)rawY;
    Z = (float)rawZ;
    sum = X + Y + Z;

    if(sum < 1.0f)
    {
        *out_x = 0.0f; *out_y =0.0f; *out_lux=0.0f; *out_cct=0.0f;
        return;
    }
    *out_x = X / sum;
    *out_y = Y / sum;
    *out_lux = Y / 65535.0f * 144000.0f;

    n = (*out_x - 0.3320f) / (0.1858f - *out_y);
    *out_cct = -449.0f * n*n*n + 3525.0f * n*n - 6823.3f * n + 5520.33f;

    if(*out_cct < 1000.0f) *out_cct = 1000.0f;
    if(*out_cct > 10000.0f) *out_cct = 10000.0f;
}

//浮点数发送
void UART2_SendFloat(float val, unsigned char dec)
{
    unsigned long int_part;
    unsigned char i;
    if(val < 0.0f)
    {
        S2BUF = '-'; B_TX2_Busy=1; while(B_TX2_Busy);
        val = -val;
    }
    if(val > 4294967295.0f)
        val = 4294967295.0f;

    int_part = (unsigned long)(val + 0.0001f);
    if(int_part == 0U)
    {
        S2BUF = '0'; B_TX2_Busy=1; while(B_TX2_Busy);
    }
    else
    {
        unsigned long temp = int_part;
        unsigned char buf[12], p = 0U;
        while(temp > 0U)
        {
            buf[p++] = (unsigned char)((temp % 10UL) + '0');
            temp /= 10UL;
        }
        for(i = p; i > 0U; i--)
        {
            S2BUF = buf[i - 1U];
            B_TX2_Busy = 1;
            while(B_TX2_Busy);
        }
    }
    S2BUF = '.'; B_TX2_Busy=1; while(B_TX2_Busy);
    for(i = 0U; i < dec; i++)
    {
        val = (val - (float)int_part) * 10.0f;
        int_part = (unsigned long)(val + 0.0001f);
        S2BUF = (unsigned char)((int_part % 10UL) + '0');
        B_TX2_Busy = 1;
        while(B_TX2_Busy);
    }
}

void Delay_ms(unsigned int ms)
{
    unsigned int i,j;
    for(i = ms; i>0; i--)
        for(j = 360; j>0; j--);
}

好好学习天天向上
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-9-19 22:07 , Processed in 0.070399 second(s), 59 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表