打印
[通用8051核FLASH系列]

【芯圣电子HC89S105A测评报告】+TM7705

[复制链接]
544|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 芯圣电子官方QQ 于 2023-7-19 16:39 编辑

今天搞了一下TM7705。TM7705是16位模数转换器。

我采样另外一块STM8板子上的可调电阻,通过串口发出来。

代码:
#define ALLOCATE_EXTERN
#include "HC89S105AC8.h"

#define uint8_t unsigned char
#define uint16_t  unsigned short
#define uint32_t  unsigned long int
#define int32_t   long int

#define SOFT_SPI                /* 定义此行表示使用GPIO模拟SPI接口 */
//#define HARD_SPI                /* 定义此行表示使用CPU的硬件SPI接口 */

/* 通道1和通道2的增益,输入缓冲,极性 */
#define __CH1_GAIN_BIPOLAR_BUF        (GAIN_1 | UNIPOLAR | BUF_EN)
#define __CH2_GAIN_BIPOLAR_BUF        (GAIN_1 | UNIPOLAR | BUF_EN)


#define CS     P1_0
#define RESET  P1_1
#define DIN    P1_2
#define SCK    P1_3
#define DOUT   P1_4
#define DRDY   P1_5

        /* 定义口线置0和置1的宏 */
        #define CS_0()                CS = 0
        #define CS_1()                CS = 1

        #define RESET_0()        RESET = 0
        #define RESET_1()        RESET = 1

        #define DI_0()                DIN = 0
        #define DI_1()                DIN = 1

        #define SCK_0()                SCK = 0
        #define SCK_1()                SCK = 1

        #define DO_IS_HIGH()        (DOUT != 0)

        #define DRDY_IS_LOW()        (DRDY == 0)


/* 通信寄存器bit定义 */
enum
{
        /* 寄存器选择  RS2 RS1 RS0  */
        REG_COMM        = 0x00,        /* 通信寄存器 */
        REG_SETUP        = 0x10,        /* 设置寄存器 */
        REG_CLOCK        = 0x20,        /* 时钟寄存器 */
        REG_DATA        = 0x30,        /* 数据寄存器 */
        REG_ZERO_CH1        = 0x60,        /* CH1 偏移寄存器 */
        REG_FULL_CH1        = 0x70,        /* CH1 满量程寄存器 */
        REG_ZERO_CH2        = 0x61,        /* CH2 偏移寄存器 */
        REG_FULL_CH2        = 0x71,        /* CH2 满量程寄存器 */

        /* 读写操作 */
        WRITE                 = 0x00,        /* 写操作 */
        READ                 = 0x08,        /* 读操作 */

        /* 通道 */
        CH_1                = 0,        /* AIN1+  AIN1- */
        CH_2                = 1,        /* AIN2+  AIN2- */
        CH_3                = 2,        /* AIN1-  AIN1- */
        CH_4                = 3                /* AIN1-  AIN2- */
};

/* 设置寄存器bit定义 */
enum
{
        MD_NORMAL                = (0 << 6),        /* 正常模式 */
        MD_CAL_SELF                = (1 << 6),        /* 自校准模式 */
        MD_CAL_ZERO                = (2 << 6),        /* 校准0刻度模式 */
        MD_CAL_FULL                = (3 << 6),        /* 校准满刻度模式 */

        GAIN_1                        = (0 << 3),        /* 增益 */
        GAIN_2                        = (1 << 3),        /* 增益 */
        GAIN_4                        = (2 << 3),        /* 增益 */
        GAIN_8                        = (3 << 3),        /* 增益 */
        GAIN_16                        = (4 << 3),        /* 增益 */
        GAIN_32                        = (5 << 3),        /* 增益 */
        GAIN_64                        = (6 << 3),        /* 增益 */
        GAIN_128                = (7 << 3),        /* 增益 */

        /* 无论双极性还是单极性都不改变任何输入信号的状态,它只改变输出数据的代码和转换函数上的校准点 */
        BIPOLAR                        = (0 << 2),        /* 双极性输入 */
        UNIPOLAR                = (1 << 2),        /* 单极性输入 */

        BUF_NO                        = (0 << 1),        /* 输入无缓冲(内部缓冲器不启用) */
        BUF_EN                        = (1 << 1),        /* 输入有缓冲 (启用内部缓冲器) */

        FSYNC_0                        = 0,
        FSYNC_1                        = 1                /* 不启用 */
};

/* 时钟寄存器bit定义 */
enum
{
        CLKDIS_0        = 0x00,                /* 时钟输出使能 (当外接晶振时,必须使能才能振荡) */
        CLKDIS_1        = 0x10,                /* 时钟禁止 (当外部提供时钟时,设置该位可以禁止MCK_OUT引脚输出时钟以省电 */

        /*
                2.4576MHz(CLKDIV=0 )或为 4.9152MHz (CLKDIV=1 ),CLK 应置 “0”。
                1MHz (CLKDIV=0 )或 2MHz   (CLKDIV=1 ),CLK 该位应置  “1”
        */
        CLK_4_9152M = 0x08,
        CLK_2_4576M = 0x00,
        CLK_1M                 = 0x04,
        CLK_2M                 = 0x0C,

        FS_50HZ                = 0x00,
        FS_60HZ                = 0x01,
        FS_250HZ        = 0x02,
        FS_500HZ        = 0x04,

        /*
                四十九、电子秤应用中提高TM7705 精度的方法
                        当使用主时钟为 2.4576MHz 时,强烈建议将时钟寄存器设为 84H,此时数据输出更新率为10Hz,即每0.1S 输出一个新数据。
                        当使用主时钟为 1MHz 时,强烈建议将时钟寄存器设为80H, 此时数据输出更新率为4Hz, 即每0.25S 输出一个新数据
        */
        ZERO_0                = 0x00,
        ZERO_1                = 0x80
};


uint16_t adc1;
int volt1;
uint8_t txBuf[] = "CH1=     ,     mV\r\n";
                                    //发送数据计数
                                       
void DelayMs(uint16_t nms)
{
        uint16_t i,j;                  
        for(i=0;i<nms;i++)
       for(j=0;j<200;j++);
}









static void TM7705_SyncSPI(void);
static void TM7705_Send8Bit(uint8_t _data);
static uint8_t TM7705_Recive8Bit(void);
static void TM7705_WriteByte(uint8_t _data);
static void TM7705_Write3Byte(uint32_t _data);
static uint8_t TM7705_ReadByte(void);
static uint16_t TM7705_Read2Byte(void);
static uint32_t TM7705_Read3Byte(void);
static void TM7705_WaitDRDY(void);
static void TM7705_ResetHard(void);
static void TM7705_Delay(void);
void TM7705_CalibSelf(uint8_t _ch);

/*
*********************************************************************************************************
*        函 数 名: bsp_DelayMS
*        功能说明: 延时函数。按照89C52调试, 12T指令周期, 11.0592晶振
*        形    参:无
*        返 回 值: 无
*********************************************************************************************************
*/
void bsp_DelayMS(uint16_t n)
{
        /* 安富莱电子: 2014-04-23
           以下代码,已经通过逻辑分析验证。        bsp_DelayMS(500) 时,实际延迟498ms
        */
        uint16_t k;

        while(n--)
        {
                for (k = 0; k < 75; k++);
        }
}

/*
*********************************************************************************************************
*        函 数 名: bsp_InitTM7705
*        功能说明: 配置STM32的GPIO和SPI接口,用于连接 TM7705
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
void bsp_InitTM7705(void)
{
#ifdef SOFT_SPI                /* 软件SPI */
        /* 配置REST口线为推挽输出,缺省输出高电平 */

        /* 配置CS口线为推挽输出,缺省输出高电平 */

        /* 配置SCK口线为推挽输出,缺省输出高电平 */

        /* 配置DIN口线为推挽输出,缺省输出高电平 */

        /* 配置DOUT口线为输入浮空模式 */

        /* 配置DOUT口线为输入上拉模式 */
#endif

        bsp_DelayMS(10);

        TM7705_ResetHard();                /* 硬件复位 */

        /*
                在接口序列丢失的情况下,如果在DIN 高电平的写操作持续了足够长的时间(至少 32个串行时钟周期),
                TM7705 将会回到默认状态。
        */
        bsp_DelayMS(5);

        TM7705_SyncSPI();                /* 同步SPI接口时序 */

        bsp_DelayMS(5);

        /* 配置时钟寄存器 */
        TM7705_WriteByte(REG_CLOCK | WRITE | CH_1);                        /* 先写通信寄存器,下一步是写时钟寄存器 */

        TM7705_WriteByte(CLKDIS_0 | CLK_4_9152M | FS_50HZ);        /* 刷新速率50Hz */
        //TM7705_WriteByte(CLKDIS_0 | CLK_4_9152M | FS_500HZ);        /* 刷新速率500Hz */

        /* 每次上电进行一次自校准 */
        TM7705_CalibSelf(1);        /* 内部自校准 CH1 */
        bsp_DelayMS(5);
}

/*
*********************************************************************************************************
*        函 数 名: TM7705_Delay
*        功能说明: CLK之间的延迟,时序延迟. 对于51,可以不延迟
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
static void TM7705_Delay(void)
{
//        uint16_t i;
//
//        for (i = 0; i < 5; i++);
}

/*
*********************************************************************************************************
*        函 数 名: TM7705_ResetHard
*        功能说明: 硬件复位 TM7705芯片
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
static void TM7705_ResetHard(void)
{
        RESET_1();
        bsp_DelayMS(1);
        RESET_0();
        bsp_DelayMS(2);
        RESET_1();
        bsp_DelayMS(1);
}

/*
*********************************************************************************************************
*        函 数 名: TM7705_SyncSPI
*        功能说明: 同步TM7705芯片SPI接口时序
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
static void TM7705_SyncSPI(void)
{
        /* AD7705串行接口失步后将其复位。复位后要延时500us再访问 */
        CS_0();
        TM7705_Send8Bit(0xFF);
        TM7705_Send8Bit(0xFF);
        TM7705_Send8Bit(0xFF);
        TM7705_Send8Bit(0xFF);
        CS_1();
}

/*
*********************************************************************************************************
*        函 数 名: TM7705_Send8Bit
*        功能说明: 向SPI总线发送8个bit数据。 不带CS控制。
*        形    参: _data : 数据
*        返 回 值: 无
*********************************************************************************************************
*/
static void TM7705_Send8Bit(uint8_t _data)
{
        uint8_t i;

        for(i = 0; i < 8; i++)
        {
                if (_data & 0x80)
                {
                        DI_1();
                }
                else
                {
                        DI_0();
                }
                SCK_0();
                TM7705_Delay();
                _data <<= 1;
                TM7705_Delay();
                SCK_1();
                TM7705_Delay();
                TM7705_Delay();
        }
}

/*
*********************************************************************************************************
*        函 数 名: TM7705_Recive8Bit
*        功能说明: 从SPI总线接收8个bit数据。 不带CS控制。
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
static uint8_t TM7705_Recive8Bit(void)
{
        uint8_t i;
        uint8_t read = 0;

        for (i = 0; i < 8; i++)
        {
                SCK_0();
                TM7705_Delay();
                TM7705_Delay();
                read = read<<1;
                if (DO_IS_HIGH())
                {
                        read++;
                }
                TM7705_Delay();
                TM7705_Delay();
                SCK_1();
                TM7705_Delay();
                TM7705_Delay();
        }
        return read;
}

/*
*********************************************************************************************************
*        函 数 名: TM7705_WriteByte
*        功能说明: 写入1个字节。带CS控制
*        形    参: _data :将要写入的数据
*        返 回 值: 无
*********************************************************************************************************
*/
static void TM7705_WriteByte(uint8_t _data)
{
        CS_0();
        TM7705_Send8Bit(_data);
        CS_1();
}

/*
*********************************************************************************************************
*        函 数 名: TM7705_Write3Byte
*        功能说明: 写入3个字节。带CS控制
*        形    参: _data :将要写入的数据
*        返 回 值: 无
*********************************************************************************************************
*/
static void TM7705_Write3Byte(uint32_t _data)
{
        CS_0();
        TM7705_Send8Bit((_data >> 16) & 0xFF);
        TM7705_Send8Bit((_data >> 8) & 0xFF);
        TM7705_Send8Bit(_data);
        CS_1();
}

/*
*********************************************************************************************************
*        函 数 名: TM7705_ReadByte
*        功能说明: 从AD芯片读取一个字(16位)
*        形    参: 无
*        返 回 值: 读取的字(16位)
*********************************************************************************************************
*/
static uint8_t TM7705_ReadByte(void)
{
        uint8_t read;

        CS_0();
        read = TM7705_Recive8Bit();
        CS_1();

        return read;
}

/*
*********************************************************************************************************
*        函 数 名: TM7705_Read2Byte
*        功能说明: 读2字节数据
*        形    参: 无
*        返 回 值: 读取的数据(16位)
*********************************************************************************************************
*/
static uint16_t TM7705_Read2Byte(void)
{
        uint16_t read;

        CS_0();
        read = TM7705_Recive8Bit();
        read <<= 8;
        read += TM7705_Recive8Bit();
        CS_1();

        return read;
}

/*
*********************************************************************************************************
*        函 数 名: TM7705_Read3Byte
*        功能说明: 读3字节数据
*        形    参: 无
*        返 回 值: 读取到的数据(24bit) 高8位固定为0.
*********************************************************************************************************
*/
static uint32_t TM7705_Read3Byte(void)
{
        uint32_t read;

        CS_0();
        read = TM7705_Recive8Bit();
        read <<= 8;
        read += TM7705_Recive8Bit();
        read <<= 8;
        read += TM7705_Recive8Bit();
        CS_1();
        return read;
}

/*
*********************************************************************************************************
*        函 数 名: TM7705_WaitDRDY
*        功能说明: 等待内部操作完成。 自校准时间较长,需要等待。
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
static void TM7705_WaitDRDY(void)
{
        uint32_t i;

        for (i = 0; i < 8000; i++)
        {
                if (DRDY_IS_LOW())
                {
                        break;
                }
        }
        if (i >= 8000)
        {
                //printf("TM7705_WaitDRDY() 芯片应答超时 ...\r\n");                /* 调试语句. 用语排错 */

                //printf("重新同步SPI接口时序\r\n");                /* 调试语句. 用语排错 */

                TM7705_SyncSPI();                /* 同步SPI接口时序 */

                bsp_DelayMS(5);
        }
}

/*
*********************************************************************************************************
*        函 数 名: TM7705_WriteReg
*        功能说明: 写指定的寄存器
*        形    参:  _RegID : 寄存器ID
*                          _RegValue : 寄存器值。 对于8位的寄存器,取32位形参的低8bit
*        返 回 值: 无
*********************************************************************************************************
*/
void TM7705_WriteReg(uint8_t _RegID, uint32_t _RegValue)
{
        uint8_t bits;

        switch (_RegID)
        {
                case REG_COMM:                /* 通信寄存器 */
                case REG_SETUP:                /* 设置寄存器 8bit */
                case REG_CLOCK:                /* 时钟寄存器 8bit */
                        bits = 8;
                        break;

                case REG_ZERO_CH1:        /* CH1 偏移寄存器 24bit */
                case REG_FULL_CH1:        /* CH1 满量程寄存器 24bit */
                case REG_ZERO_CH2:        /* CH2 偏移寄存器 24bit */
                case REG_FULL_CH2:        /* CH2 满量程寄存器 24bit*/
                        bits = 24;
                        break;

                case REG_DATA:                /* 数据寄存器 16bit */
                default:
                        return;
        }

        TM7705_WriteByte(_RegID | WRITE);        /* 写通信寄存器, 指定下一步是写操作,并指定写哪个寄存器 */

        if (bits == 8)
        {
                TM7705_WriteByte((uint8_t)_RegValue);
        }
        else        /* 24bit */
        {
                TM7705_Write3Byte(_RegValue);
        }
}

/*
*********************************************************************************************************
*        函 数 名: TM7705_ReadReg
*        功能说明: 写指定的寄存器
*        形    参:  _RegID : 寄存器ID
*                          _RegValue : 寄存器值。 对于8位的寄存器,取32位形参的低8bit
*        返 回 值: 读到的寄存器值。 对于8位的寄存器,取32位形参的低8bit
*********************************************************************************************************
*/
uint32_t TM7705_ReadReg(uint8_t _RegID)
{
        uint8_t bits;
        uint32_t read;

        switch (_RegID)
        {
                case REG_COMM:                /* 通信寄存器 */
                case REG_SETUP:                /* 设置寄存器 8bit */
                case REG_CLOCK:                /* 时钟寄存器 8bit */
                        bits = 8;
                        break;

                case REG_ZERO_CH1:        /* CH1 偏移寄存器 24bit */
                case REG_FULL_CH1:        /* CH1 满量程寄存器 24bit */
                case REG_ZERO_CH2:        /* CH2 偏移寄存器 24bit */
                case REG_FULL_CH2:        /* CH2 满量程寄存器 24bit*/
                        bits = 24;
                        break;

                case REG_DATA:                /* 数据寄存器 16bit */
                default:
                        return 0xFFFFFFFF;
        }

        TM7705_WriteByte(_RegID | READ);        /* 写通信寄存器, 指定下一步是写操作,并指定写哪个寄存器 */

        if (bits == 16)
        {
                read = TM7705_Read2Byte();
        }
        else if (bits == 8)
        {
                read = TM7705_ReadByte();
        }
        else        /* 24bit */
        {
                read = TM7705_Read3Byte();
        }
        return read;
}

/*
*********************************************************************************************************
*        函 数 名: TM7705_CalibSelf
*        功能说明: 启动自校准. 内部自动短接AIN+ AIN-校准0位,内部短接到Vref 校准满位。此函数执行过程较长,
*                          实测约 180ms
*        形    参:  _ch : ADC通道,1或2
*        返 回 值: 无
*********************************************************************************************************
*/
void TM7705_CalibSelf(uint8_t _ch)
{
        if (_ch == 1)
        {
                /* 自校准CH1 */
                TM7705_WriteByte(REG_SETUP | WRITE | CH_1);        /* 写通信寄存器,下一步是写设置寄存器,通道1 */
                TM7705_WriteByte(MD_CAL_SELF | __CH1_GAIN_BIPOLAR_BUF | FSYNC_0);/* 启动自校准 */
                TM7705_WaitDRDY();        /* 等待内部操作完成 --- 时间较长,约180ms */
        }
        else if (_ch == 2)
        {
                /* 自校准CH2 */
                TM7705_WriteByte(REG_SETUP | WRITE | CH_2);        /* 写通信寄存器,下一步是写设置寄存器,通道2 */
                TM7705_WriteByte(MD_CAL_SELF | __CH2_GAIN_BIPOLAR_BUF | FSYNC_0);        /* 启动自校准 */
                TM7705_WaitDRDY();        /* 等待内部操作完成  --- 时间较长,约180ms */
        }
}

/*
*********************************************************************************************************
*        函 数 名: TM7705_SytemCalibZero
*        功能说明: 启动系统校准零位. 请将AIN+ AIN-短接后,执行该函数。校准应该由主程序控制并保存校准参数。
*                         执行完毕后。可以通过 TM7705_ReadReg(REG_ZERO_CH1) 和  TM7705_ReadReg(REG_ZERO_CH2) 读取校准参数。
*        形    参: _ch : ADC通道,1或2
*        返 回 值: 无
*********************************************************************************************************
*/
void TM7705_SytemCalibZero(uint8_t _ch)
{
        if (_ch == 1)
        {
                /* 校准CH1 */
                TM7705_WriteByte(REG_SETUP | WRITE | CH_1);        /* 写通信寄存器,下一步是写设置寄存器,通道1 */
                TM7705_WriteByte(MD_CAL_ZERO | __CH1_GAIN_BIPOLAR_BUF | FSYNC_0);/* 启动自校准 */
                TM7705_WaitDRDY();        /* 等待内部操作完成 */
        }
        else if (_ch == 2)
        {
                /* 校准CH2 */
                TM7705_WriteByte(REG_SETUP | WRITE | CH_2);        /* 写通信寄存器,下一步是写设置寄存器,通道1 */
                TM7705_WriteByte(MD_CAL_ZERO | __CH2_GAIN_BIPOLAR_BUF | FSYNC_0);        /* 启动自校准 */
                TM7705_WaitDRDY();        /* 等待内部操作完成 */
        }
}

/*
*********************************************************************************************************
*        函 数 名: TM7705_SytemCalibFull
*        功能说明: 启动系统校准满位. 请将AIN+ AIN-接最大输入电压源,执行该函数。校准应该由主程序控制并保存校准参数。
*                         执行完毕后。可以通过 TM7705_ReadReg(REG_FULL_CH1) 和  TM7705_ReadReg(REG_FULL_CH2) 读取校准参数。
*        形    参:  _ch : ADC通道,1或2
*        返 回 值: 无
*********************************************************************************************************
*/
void TM7705_SytemCalibFull(uint8_t _ch)
{
        if (_ch == 1)
        {
                /* 校准CH1 */
                TM7705_WriteByte(REG_SETUP | WRITE | CH_1);        /* 写通信寄存器,下一步是写设置寄存器,通道1 */
                TM7705_WriteByte(MD_CAL_FULL | __CH1_GAIN_BIPOLAR_BUF | FSYNC_0);/* 启动自校准 */
                TM7705_WaitDRDY();        /* 等待内部操作完成 */
        }
        else if (_ch == 2)
        {
                /* 校准CH2 */
                TM7705_WriteByte(REG_SETUP | WRITE | CH_2);        /* 写通信寄存器,下一步是写设置寄存器,通道1 */
                TM7705_WriteByte(MD_CAL_FULL | __CH2_GAIN_BIPOLAR_BUF | FSYNC_0);        /* 启动自校准 */
                TM7705_WaitDRDY();        /* 等待内部操作完成 */
        }
}

/*
*********************************************************************************************************
*        函 数 名: TM7705_ReadAdc1
*        功能说明: 读通道1或2的ADC数据
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
uint16_t TM7705_ReadAdc(uint8_t _ch)
{
        uint8_t i;
        uint16_t read = 0;

        /* 为了避免通道切换造成读数失效,读2次 */
        for (i = 0; i < 2; i++)
        {
                TM7705_WaitDRDY();                /* 等待DRDY口线为0 */

                if (_ch == 1)
                {
                        TM7705_WriteByte(0x38);
                }
                else if (_ch == 2)
                {
                        TM7705_WriteByte(0x39);
                }

                read = TM7705_Read2Byte();
        }
        return read;
}

/***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/
/*
*********************************************************************************************************
*        函 数 名: TM7705_Demo
*        功能说明: 定时读取TM7705的ADC值,并打印到串口。请通过PC机串口工具查看结果。
*        形    参:无
*        返 回 值: 无
*********************************************************************************************************
*/
static void TM7705_Demo(void)
{
        uint16_t adc1, adc2;
        
        bsp_InitTM7705();                        /* 初始化配置TM7705 */

        TM7705_CalibSelf(1);                /* 自校准。执行时间较长,约180ms */               
        adc1 = TM7705_ReadAdc(1);                                
        
        TM7705_CalibSelf(2);                /* 自校准。执行时间较长,约180ms */
        adc2 = TM7705_ReadAdc(2);        
        
        while (1)
        {        
                //bsp_Idle();               

               
                        /* 如果只采集1个通道,则刷新速率 50Hz (缺省设置的,最大可以设置为500Hz) */
                        adc1 = TM7705_ReadAdc(1);        /* 执行时间 20ms (50Hz速率刷新时) */               
                        adc2 = 0;
               
                        
                /* 打印采集数据 */
                {
               
                        
                        /* 计算实际电压值(近似估算的),如需准确,请进行校准 */
                          volt1 = ((int32_t)adc1 * 5000) / 65535;
                        //volt2 = ((int32_t)adc2 * 5000) / 65535;
                        
                        /* 打印ADC采样结果 */        
                        //printf("CH1=%5ld (%5dmV) CH2=%5ld (%5dmV)\r", (long int)adc1, volt1, (long int)adc2, volt2);
                }
        }
}
        

/***************************************************************************************
  * @实现效果        UART1接收到上位机发送的数据后,把接收的数据再次发送给上位机
  * @注意                波特率1200,8位数据,无校验位               
***************************************************************************************/
void main(void)
{
        uint8_t i;
        uint8_t wan,qian,bai,shi,ge;
/********************************系统初始化*******************************************/               
        WDTCCR = 0x00;                           //关闭看门狗
                                                           //本例程为方便测试关闭看门狗,实际使用中,建议客户打开看门狗,详见WDT复位例程
        CLKCON = 0x02;                           //选择内部高频RC为系统时钟,Fosc=32MHz
        CLKDIV = 0x02;                           //Fosc 2分频得到Fper,Fper=16MHz        
/**********************************IO配置初始化**************************************/        
    P0M0 = P0M0&0xF0|0x02;                //P00设置为上拉输入
    P0M0 = P0M0&0x0F|0x80;                //P01设置为推挽输出
        P1M0 = 0xcc;
        P1M1 = 0xcc;
        P1M2 = 0x66;        
/**********************************UART配置初始化**************************************/        
    TXD_MAP = 0x01;                                                //TXD映射P01
        RXD_MAP = 0x00;                                                //RXD映射P00
        
        //8位数据发送,波特率1200
        //波特率计算
        //波特率 = 1/16 * 时钟源频率 / (65536 - 0xFCBE)
        //       = 1/16 * 16000000 / 834)
        //        = 1199.04(误差0.05%)

        //波特率1200
        //反推初值
        //初值 = (65536 - (Fper / 波特率) * (1 / 16))
        //           = (65536 - (16000000 / 1200) * (1 / 16))
        //           = (65536 - 833.33)
        //     = FCBE
        

    SBRTH = 0xFCBE/256;      
        SBRTL = 0xFCBE%256;
        SCON2 = 0x12;                                //8位UART 独立波特率,波特率可变
        SCON  = 0x10;                                 //开串口接收
        bsp_InitTM7705();                        /* 初始化配置TM7705 */

        TM7705_CalibSelf(1);                /* 自校准。执行时间较长,约180ms */               
        adc1 = TM7705_ReadAdc(1);        
        //IE = 0x10;                                         //使能串口中断
        //EA = 1;                                                //使能总中断
//        while(1)
//        {
//                CS_0();
//
//                CS_1();        
//        }
        while(1)
        {

                adc1 = TM7705_ReadAdc(1);        /* 执行时间 20ms (50Hz速率刷新时) */
                volt1 = ((int32_t)adc1 * 5000) / 65535;
        wan=adc1/10000+0x30;
                qian=adc1%10000/1000+0x30;
                bai=adc1%1000/100+0x30;
                shi=adc1%100/10+0x30;
                ge=adc1%10+0x30;
                txBuf[4]=wan;
                txBuf[5]=qian;
                txBuf[6]=bai;
                txBuf[7]=shi;
                txBuf[8]=ge;

                wan=volt1/10000+0x30;
                qian=volt1%10000/1000+0x30;
                bai=volt1%1000/100+0x30;
                shi=volt1%100/10+0x30;
                ge=volt1%10+0x30;
                txBuf[10]=wan;
                txBuf[11]=qian;
                txBuf[12]=bai;
                txBuf[13]=shi;
                txBuf[14]=ge;
                                       
                for(i = 0; i < sizeof(txBuf); i++)
                {
                                SBUF = txBuf[i];                          //发送数据
                                while(!(SCON&0x02));
                                SCON &=~ 0x02;                        //发送中断请求中断标志位?
                }
                bsp_DelayMS(500);
     
        }
}
效果图:

使用特权

评论回复
沙发
lajfda002| | 2023-6-19 17:51 | 只看该作者
这个工程师笔记不错。

使用特权

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

本版积分规则

339

主题

3070

帖子

7

粉丝